Как я могу игнорировать сбои при расшифровке сводного файла?

У меня есть две роли, одна из которых имеет 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в пустой словарь.

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