Рассмотрим следующий тестовый сценарий 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 и используется ли он локально, а в том, что он использует Ansible Vault. Сам по себе вариант использования хорош, за исключением того, что ОП, похоже, реализовал менее безопасную оболочку вокруг уже существующей команды ansible-vault
— и вот здесь цель пока неясна.
В настоящее время у меня есть несколько переменных, зашифрованных в репозитории GitHub. Цель vault.yaml
playbook — позволить конечному пользователю визуализировать все зашифрованные переменные после того, как они изначально были зашифрованы одним и тем же глобальным паролем. Второй вариант — это простой способ для конечного пользователя изменить глобальный пароль и отобразить новые зашифрованные переменные. Со временем я внесу lineinfile
замены для зашифрованных переменных.
Я не думаю, что lineinfile
будет хорошим решением, так как в конце концов вы получите файл YAML. Если вы зашифруете все переменные в файле с помощью одного и того же пароля хранилища, рассмотрите возможность шифрования всего файла. Обратной стороной этого является то, что вы не будете знать имена зашифрованных переменных, но затраты на обслуживание будут значительно ниже. Кроме того, размещение вызовов команды ansible-vault
в сценарии оболочки кажется более простым и безопасным решением для описанной вами цели - у AFAIR ansible-vault
есть специальная команда специально для повторного шифрования.
Альтернативно вы можете использовать инструмент ansible-vault-rotate, который уже делает именно то, что вы хотите.
Спасибо за информацию Александр. В моем случае конечному пользователю будет проще работать с плейбуком.
Я создал соответствующую документацию для приведенного выше подробного сборника пьес, в которой объясняется логика использования. axivo.com/k3s-cluster/tutorials/handbook/ansible
Я ожидаю, что книга сценариев будет использовать определенную переменную среды VAULT_PASSWORD.
Что невозможно по замыслу: эта переменная не используется Ansible, поэтому я не уверен, на чем основаны ваши ожидания. Как правило, вам необходимо либо указать пароль в командной строке с помощью --ask-vault-password
, либо определить местоположение файла паролей, как вы делаете во втором примере (или использовать переменную среды ANSIBLE_VAULT_PASSWORD_FILE
согласно ссылке на документацию выше).
Спасибо, Александр, за полезную информацию, буду придерживаться решения, представленного в ОП.
Я не вижу хорошего применения вашей пьесы?! Какова цель вообще? Вы не играете с
Ansible
локально, это инструмент Multi Process Automation. Если вам нужно сохранить свой пароль, вы можете просто использовать файлenv
локально, это также полезно для хранения других конфиденциальных данных, или вы можете использовать Ansible Vault. Но в любом случае я не вижу в этом никакого смысла!