Задача Ansible с использованием поиска «ansible.builtin.unvault»

Код ниже принимает 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 для шифрования/дешифрования.

Не могли бы вы объяснить, почему вы пытаетесь сделать все вышеперечисленное? Потому что это сильно похоже на проблему x/y. Простое включение файла var в хранилище (с vars_files: на уровне игры или с include_vars в задаче) сделает vars внутри файла немедленно расшифрованным и доступным, оставив файл нетронутым, и абсолютно не нужно ничего повторно шифровать.

Zeitounator 03.02.2023 17:31

@Zeitounator- я пытаюсь поменять учетные данные ключа доступа AWS. У меня есть все задачи Ansible для ротации на стороне AWS. Я могу использовать фильтр «ansible.builtin.unvault» для извлечения ключа доступа и секрета из хранилища. Теперь, когда у меня есть новая информация, я пытаюсь выполнить обратную запись в хранилище с помощью фильтра «ansible.builtin.vault», но пока не смог заставить код работать.

Eric P 03.02.2023 19:20
Введение в Ansible Roles
Введение в Ansible Roles
Ansible - это отличный инструмент управления конфигурацией, который можно использовать для автоматизации настройки или развертывания на большом...
1
2
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Ваш вопрос и пример сосредоточены на поиске 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

Обратите внимание, что приведенный выше сборник не является идемпотентным. Если вы запустите его во второй раз, расшифрованное содержимое вашего файла останется идентичным (с тем же новым паролем), но файл все равно будет изменен, так как соль хранилища изменится, а зашифрованное содержимое будет другим.

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