Как я могу игнорировать сбои при расшифровке сводного файла?
У меня есть две роли, одна из которых имеет group_vars
файл, который является хранилищем, а другой нет. Я хотел бы запустить роль, которая не требует какой-либо сводной информации, но ansible в любом случае запрашивает у меня пароль хранилища:
$ tree
├── deploy-home-secure.yml
├── deploy-home.yml
├── group_vars
│ ├── home
│ │ └── unvaulted
│ └── home-secure
│ ├── unvaulted
│ └── vaulted
├── hosts
└── roles
├── home
│ └── tasks
│ └── main.yaml
└── home-secure
└── tasks
└── main.yaml
$ ansible-playbook --version
ansible-playbook 1.8.2
configured module search path = None
$ ansible-playbook -i hosts deploy-home.yml
ERROR: A vault password must be specified to decrypt vaulttest/group_vars/home-secure/vaulted
$ ansible-playbook --vault-password-file=/dev/null -i hosts deploy-home.yml
ERROR: Decryption failed
4 ответа
У меня есть что-то вроде этого, чтобы решить эту проблему (у меня были не разные роли, а разные хосты, но я думаю, что применяется тот же принцип):
Это упрощенная файловая структура:
group_vars
development_vars
staging_vars
vaulted_vars
production_vars
Это позволяет вам развертывать разработку или этапирование без Ansible, который просит вас расшифровать production_vars.
И затем, производственный сборник пьес выглядит так:
hosts: production
roles:
- role...
vars_files:
- vaulted_vars/production_vars
Строка vars_files, в которой вы указываете путь к сводной переменной, является ключом.
Ansible попытается загрузить файл group_vars для любой группы, с которой он сталкивается в вашем инвентаре. Если вы разделите файл инвентаризации (хосты) на один для домашней группы и другой для домашней безопасности, то он не будет пытаться расшифровать переменные, которые он не должен делать.
$ ansible-playbook -i hosts-home deploy-home.yml
$ ansible-playbook --ask-vault-password -i hosts-home-secure deploy-home-secure.yml
Вот еще один вариант, если вам не всегда нужны ваши сводные переменные.
Вы можете иметь такую структуру папок:
group_vars
├── all
├── prod
├── dev
│ └── vars.yml
└── dev-vault
└── vault.yml
Вы храните сводные переменные в варианте '-vault' этого инвентаря.
Тогда ваши запасы могут быть примерно такими:
Dev:
[servers]
dev.bla.bla
[dev:children]
servers
DEV-хранилище:
[servers]
dev.bla.bla
[dev:children]
servers
[dev-vault:children]
servers
Таким образом, вы сохраняете конфиденциальные данные только в dev-vault vars, если в большинстве случаев вам не нужны пароли и т. Д., Вы можете запускать playbooks без дополнительных опций, которые вы на самом деле не используете, или сохранять пароль хранилища в открытом тексте для удобство и т. д.
Таким образом, "нормальная" команда может быть:
ansible-playbook -i dev some.yml
И "сводчатая" команда может быть:
ansible-playbook -i dev-vault some.yml --extra-vars="use_vault=true"
Или вы можете управлять "включением переменных хранилища" с помощью тегов, включая some.yml в some-vault.yml и т. Д.
Взломать анзибль.
Итак... рассматриваемый файл{your-python-lib-location}/site-packages/ansible/parsing/vault/__init__.py
Где-то рядом со строкой 750 вы найдете этот блок:
else:
msg = "Decryption failed (no vault secrets were found that could decrypt)"
if filename:
msg += " on %s" % to_native(filename)
raise AnsibleVaultError(msg)
if b_plaintext is None:
msg = "Decryption failed"
if filename:
msg += " on %s" % to_native(filename)
raise AnsibleError(msg)
return b_plaintext, vault_id_used, vault_secret_used
Замените это на:
else:
msg = "Decryption failed (no vault secrets were found that could decrypt)"
if filename:
msg += " on %s" % to_native(filename)
display.warning(msg, formatted=True)
if b_plaintext is None:
msg = "Decryption failed"
if filename:
msg += " on %s" % to_native(filename)
display.warning(msg, formatted=True)
b_plaintext = []
return b_plaintext, vault_id_used, vault_secret_used
Итак, ты меняешьсяraise
кdisplay.warning
и настройкаb_plaintext
в пустой словарь.