Использование VAULT_PASSWORD в книге игр

Рассмотрим следующий тестовый сценарий vault.yaml с одной зашифрованной переменной Ansible Vault:

---
- name: Ansible Vault
  hosts: localhost
  connection: local
  gather_facts: false
  vars_prompt:
    - name: playbook_action
      prompt: "Select an action to perform:\n
        1) List encrypted variables\n
        2) Update global password\n"
      private: false
  tasks:
    - name: Encrypted Variables
      when: playbook_action in ['1', '1)']
      block:
        - name: Set encrypted variables fact
          ansible.builtin.set_fact:
            encrypted_variables:
              - ansible_password: '{{ ansible_password }}'
          no_log: true

        - name: List encrypted variables
          ansible.builtin.debug:
            var: encrypted_variables

    - name: Global Password
      when: playbook_action in ['2', '2)']
      block:
        - name: Set new global password
          ansible.builtin.pause:
            prompt: Password
            echo: false
          register: password

        - name: Update global password
          ansible.builtin.command:
            cmd: ansible-vault encrypt_string {{ item | quote }}  -n {{ item | quote }}
          environment:
            VAULT_PASSWORD: '{{ password.user_input }}'
          loop:
            - ansible_password
          register: encrypted_variables
          changed_when: true
          no_log: true

        - name: List encrypted variables
          ansible.builtin.debug:
            var: encrypted_variables.results | map(attribute = 'stdout')

Во время бега:

ansible-playbook --ask-vault-pass vault.yaml
Vault password:
Select an action to perform:
 1) List encrypted variables
 2) Update global password
: 2

Я ожидаю, что playbook будет использовать определенную переменную среды VAULT_PASSWORD. Вместо этого мне предлагается ввести новый пароль Vault для каждой переменной, которую я хочу зашифровать. Цель состоит в том, чтобы один раз определить новый пароль Vault и неявно использовать его в цикле.

Обновлено: единственный способ решить эту проблему — создать временный файл password:

        - name: Create password file
          ansible.builtin.lineinfile:
            line: '{{ password.user_input }}'
            path: ./password
            mode: '0644'
            create: true

        - name: Update global password
          ansible.builtin.command:
            cmd: ansible-vault encrypt_string {{ item | quote }}  -n {{ item | quote }} --vault-pass-file ./password
          loop:
            - ansible_password
          register: encrypted_variables
          changed_when: true
          no_log: true

        - name: Delete password file
          ansible.builtin.file:
            path: ./password
            state: absent

Я бы все равно предпочел использовать переменную среды VAULT_PASSWORD, определенную в задаче.

Я не вижу хорошего применения вашей пьесы?! Какова цель вообще? Вы не играете с Ansible локально, это инструмент Multi Process Automation. Если вам нужно сохранить свой пароль, вы можете просто использовать файл env локально, это также полезно для хранения других конфиденциальных данных, или вы можете использовать Ansible Vault. Но в любом случае я не вижу в этом никакого смысла!

Farkhod Abdukodirov 15.06.2024 08:07

Дело не в том, что такое Ansible и используется ли он локально, а в том, что он использует Ansible Vault. Сам по себе вариант использования хорош, за исключением того, что ОП, похоже, реализовал менее безопасную оболочку вокруг уже существующей команды ansible-vault — и вот здесь цель пока неясна.

Alexander Pletnev 15.06.2024 11:32

В настоящее время у меня есть несколько переменных, зашифрованных в репозитории GitHub. Цель vault.yaml playbook — позволить конечному пользователю визуализировать все зашифрованные переменные после того, как они изначально были зашифрованы одним и тем же глобальным паролем. Второй вариант — это простой способ для конечного пользователя изменить глобальный пароль и отобразить новые зашифрованные переменные. Со временем я внесу lineinfile замены для зашифрованных переменных.

Floren 15.06.2024 12:11

Я не думаю, что lineinfile будет хорошим решением, так как в конце концов вы получите файл YAML. Если вы зашифруете все переменные в файле с помощью одного и того же пароля хранилища, рассмотрите возможность шифрования всего файла. Обратной стороной этого является то, что вы не будете знать имена зашифрованных переменных, но затраты на обслуживание будут значительно ниже. Кроме того, размещение вызовов команды ansible-vault в сценарии оболочки кажется более простым и безопасным решением для описанной вами цели - у AFAIR ansible-vault есть специальная команда специально для повторного шифрования.

Alexander Pletnev 15.06.2024 14:08

Альтернативно вы можете использовать инструмент ansible-vault-rotate, который уже делает именно то, что вы хотите.

Alexander Pletnev 15.06.2024 14:09

Спасибо за информацию Александр. В моем случае конечному пользователю будет проще работать с плейбуком.

Floren 15.06.2024 18:04

Я создал соответствующую документацию для приведенного выше подробного сборника пьес, в которой объясняется логика использования. axivo.com/k3s-cluster/tutorials/handbook/ansible

Floren 21.06.2024 05:28
Введение в Ansible Roles
Введение в Ansible Roles
Ansible - это отличный инструмент управления конфигурацией, который можно использовать для автоматизации настройки или развертывания на большом...
2
7
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я ожидаю, что книга сценариев будет использовать определенную переменную среды VAULT_PASSWORD.

Что невозможно по замыслу: эта переменная не используется Ansible, поэтому я не уверен, на чем основаны ваши ожидания. Как правило, вам необходимо либо указать пароль в командной строке с помощью --ask-vault-password, либо определить местоположение файла паролей, как вы делаете во втором примере (или использовать переменную среды ANSIBLE_VAULT_PASSWORD_FILE согласно ссылке на документацию выше).

Спасибо, Александр, за полезную информацию, буду придерживаться решения, представленного в ОП.

Floren 15.06.2024 12:05

Другие вопросы по теме