Как проверить, расшифрована ли зашифрованная переменная?

У меня есть Ansible зашифрованная переменная. Теперь я хотел бы иметь возможность запускать свою пьесу, даже если я не разблокирую переменную (с --ask-vault-pass) и просто пропускаю задачи, которые от нее зависят. В идеале с предупреждением о том, что задание пропущено.

Теперь, когда я запускаю свою пьесу без --ask-vault-pass, она завершается с ошибкой:

фатальный: [...]: FAILED! =› {изменено: false, msg: AnsibleError: Произошло необработанное исключение при создании шаблона '{{ (samba_passwords | string | from_yaml)[samba_username] }}'. Ошибка была ‹class 'ansible.parsing.vault.AnsibleVaultError'›, исходное сообщение: Попытка расшифровать, но секреты хранилища не найдены}

Есть ли способ проверить в предложении when:, что зашифрованная переменная не расшифрована и, следовательно, недоступна?


person Petr    schedule 24.10.2020    source источник
comment
Теория, конкурирующая с подходом Гэри Лопеса, заключается в том, чтобы гарантировать, что все переменные ansible-vault будут расшифрованы в начале игры, поэтому он быстро дает сбой; прекрасное руководство даже говорит столько же   -  person mdaniel    schedule 24.10.2020


Ответы (2)


В: Проверить, расшифрована ли зашифрованная переменная. Пропустите задачи, которые от него зависят. В идеале с предупреждением о том, что задание пропущено.

A: Например, учитывая файл с переменной

shell> cat vars-test.yml
test_var1: test var1

Зашифровать файл

shell> ansible-vault encrypt vars-test.yml
New Vault password: 
Confirm New Vault password: 
Encryption successful

shell> cat vars-test.yml
$ANSIBLE_VAULT;1.1;AES256
61373230346437306135303463393166323063656561623863306333313837666561653466393835
3738666532303836376139613766343930346263633032330a323336643061373039613330653237
30666364376266396633613162626536383161306262613062373239343232663935376364383431
6335623366613834360a336531656537626662376166323766376433653232633139383636613963
64356632633863353534323636313231633866613635343962383463636565303032

Тогда плейбук

shell> cat pb.yml
- hosts: test_01
  tasks:
    - include_vars: vars-test.yml
      ignore_errors: true
    - set_fact:
        test_var1: "{{ test_var1|default('default') }}"
    - name: Execute tasks if test_var1 was decrypted
      block:
        - debug:
            msg: Execute task1
        - debug:
            msg: Execute task2
      when: test_var1 != 'default'

дает (сокращенно)

shell> ansible-playbook pb.yml --ask-vault-pass

TASK [include_vars] ****
ok: [test_01]

TASK [set_fact] ****
ok: [test_01]

TASK [debug] ****
ok: [test_01] => 
  msg: Execute task1

TASK [debug] ****
ok: [test_01] => 
  msg: Execute task2

Если вы не предоставите команду с паролем, который дает playbook (сокращенно)

shell> ansible-playbook pb.yml

PLAY [test_01] ****

TASK [include_vars] ****
fatal: [test_01]: FAILED! => changed=false 
  ansible_facts: {}
  ansible_included_var_files: []
  message: Attempting to decrypt but no vault secrets found
...ignoring

TASK [set_fact] ****
ok: [test_01]

TASK [debug] ****
skipping: [test_01]

TASK [debug] ****
skipping: [test_01]
person Vladimir Botka    schedule 24.10.2020

Я исследовал, но я не нашел ничего, чтобы сделать это. Простой способ решения этого случая будет использоваться ignore_errors: yes в задаче.

person gary lopez    schedule 24.10.2020