Код ниже принимает ansible хранилище (vault.yml
), а затем использует поиск ansible.builtin.unvault
для извлечения и сохранения всего хранилища в качестве переменной full_vault
. Вывод отладки показывает код в json. Этот код работает, как и ожидалось.
- name: Pull vault into Variable from encrypted YAML file
hosts: localhost
gather_facts: no
tasks:
- name: Get specific value from vault file
set_fact:
full_vault: "{{ lookup('ansible.builtin.unvault', 'vault.yml') | from_yaml }}"
- name: Display Vault
ansible.builtin.debug:
msg: "Vault: {{ full_vault }}"
Проблема, с которой я сталкиваюсь, заключается в попытке использовать поиск ansible.builtin.vault
, чтобы поместить переменную full_vault
обратно в доступное хранилище. Как я могу выполнить это в одной задаче?
Я использую переменную среды ANSIBLE_VAULT_PASSWORD_FILE=pass.txt для шифрования/дешифрования.
@Zeitounator- я пытаюсь поменять учетные данные ключа доступа AWS. У меня есть все задачи Ansible для ротации на стороне AWS. Я могу использовать фильтр «ansible.builtin.unvault» для извлечения ключа доступа и секрета из хранилища. Теперь, когда у меня есть новая информация, я пытаюсь выполнить обратную запись в хранилище с помощью фильтра «ansible.builtin.vault», но пока не смог заставить код работать.
Ваш вопрос и пример сосредоточены на поиске ansible.builtin.unvault
, который абсолютно не нужен в вашей ситуации. Единственный случай, о котором я могу думать, где это может быть необходимо, — это если вы получаете свой пароль хранилища из другой системы/приложения/источника во время работы вашего playbook. Но поскольку он доступен с классическими env vars для ansible, вам просто нужно использовать зашифрованный файл, который будет расшифрован на лету.
Для остальной части примера давайте представим, что ваш файл vault.yml
содержит (в расшифрованном виде):
my_login: vip
my_pass: v3rys3cr3t
some_other_key: toto
Использовать приведенный выше зашифрованный файл так же просто, как
---
- hosts: localhost
gather_facts: false
vars_files:
- vault.yml
tasks:
- name: Dummy use of login and pass
ansible.builtin.debug:
msg: "Login in {{ my_login }} and password is {{ my_pass }}"
Теперь, если вы хотите легко загрузить этот файл со всем его содержимым, изменить значение ключа в содержащемся словаре и вернуть содержимое, зашифрованное с тем же настроенным паролем, вот первый черновик, который вам, вероятно, придется улучшить. Но это сработало для моего локального теста с вашей текущей конфигурацией.
update_vault.yml
книга игр
---
- hosts: localhost
gather_facts: false
vars:
vault_file: vault.yml
new_pass: n3ws3cr3t
tasks:
- name: Import vaulted variables in a namespace (for further easier manipulation)
ansible.builtin.include_vars:
file: "{{ vault_file }}"
name: my_vault
- name: Dummy task just to show above worked
debug:
msg:
- Login is {{ my_vault.my_login }}.
- Password is {{ my_vault.my_pass }}
- Some other key is {{ my_vault.some_other_key }}
- name: Update an element and push back to encrypted file
vars:
new_vault_content: "{{ my_vault | combine({'my_pass': new_pass}) }}"
vault_pass_file: "{{ lookup('ansible.builtin.env', 'ANSIBLE_VAULT_PASSWORD_FILE') }}"
vault_pass: "{{ lookup('ansible.builtin.file', vault_pass_file) }}"
copy:
content: "{{ new_vault_content | to_nice_yaml | ansible.builtin.vault(vault_pass) }}"
dest: "{{ vault_file }}"
decrypt: false
дает:
$ ansible-playbook update_vault.yml
PLAY [localhost] ***********************************************************************************************************************************************************************************************************************
TASK [Import vaulted variables in a namespace (for furthre easier manipulation)] *******************************************************************************************************************************************************
ok: [localhost]
TASK [Dummy task just to show above worked] ********************************************************************************************************************************************************************************************
ok: [localhost] => {
"msg": [
"Login is vip.",
"Password is v3rys3cr3t",
"Some other key is toto"
]
}
TASK [Update an element and push back to encrypted file] *******************************************************************************************************************************************************************************
changed: [localhost]
PLAY RECAP *****************************************************************************************************************************************************************************************************************************
localhost : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
И вы можете легко проверить, что файл был правильно обновлен:
$ ansible-vault view vault.yml
my_login: vip
my_pass: n3ws3cr3t
some_other_key: toto
Обратите внимание, что приведенный выше сборник не является идемпотентным. Если вы запустите его во второй раз, расшифрованное содержимое вашего файла останется идентичным (с тем же новым паролем), но файл все равно будет изменен, так как соль хранилища изменится, а зашифрованное содержимое будет другим.
Не могли бы вы объяснить, почему вы пытаетесь сделать все вышеперечисленное? Потому что это сильно похоже на проблему x/y. Простое включение файла var в хранилище (с
vars_files:
на уровне игры или сinclude_vars
в задаче) сделает vars внутри файла немедленно расшифрованным и доступным, оставив файл нетронутым, и абсолютно не нужно ничего повторно шифровать.