Как игнорировать ошибки при расшифровке файла в хранилище?

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

person Shepmaster    schedule 19.12.2014    source источник
comment
Я подозреваю, что Ansible должен прочитать все в group_vars, чтобы ничего не пропустить. Если это так, то почему бы не переместить зашифрованные книги в отдельный каталог secure?   -  person Mxx    schedule 20.12.2014
comment
@Mxx, чтобы убедиться, что он ничего не пропустит - я надеялся, что сработает обычное предупреждение о неопределенной переменной - если мы не сможем расшифровать, эти переменные будут недоступны.   -  person Shepmaster    schedule 20.12.2014
comment
@Mxx переместите свои зашифрованные сборники пьес - я не уверен, что понимаю. Это файлы group_vars, которые хранятся в хранилище, и они должны быть в структуре относительно файла hosts, насколько я понимаю. Я бы не хотел дублировать файл hosts для каждого файла в хранилище с другим паролем.   -  person Shepmaster    schedule 20.12.2014
comment
Ваш файл инвентаря никоим образом не связан с вашими книгами воспроизведения (кроме упомянутых хостов внутри книг воспроизведения). Таким образом, у вас может быть центральное место для вашего инвентаря и отдельные места для каждой пьесы.   -  person Mxx    schedule 20.12.2014
comment
@Mxx Я, должно быть, что-то сильно недопонимаю. Файл group_vars/home_secure/vaulted — это файл, который был помещен в хранилище. Я понимаю, что групповые переменные обычно размещаются рядом с вашим файлом инвентаря. Я ожидаю, что потребуется пароль для запуска роли home_secure, но не для роли home. Я не понимаю, как перемещение моего playbook (deploy-home.yml) может привести к тому, что Ansible не загрузит файл group_vars из хранилища.   -  person Shepmaster    schedule 20.12.2014
comment
Отделяйте все, что связано с зашифрованным плейбуком, от незашифрованного. Вы все еще можете иметь общий файл инвентаризации.   -  person Mxx    schedule 22.12.2014
comment
Шепмастер, если ответ отвечает на ваш вопрос, пожалуйста, примите его.   -  person tedder42    schedule 04.02.2015


Ответы (3)


У меня есть что-то вроде этого для решения такого рода проблемы (у меня были не разные роли, а разные хосты, но я думаю, что применяется тот же принцип):

Это упрощенная файловая структура:

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

person Franco Mariluis    schedule 08.01.2015

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

$ ansible-playbook -i hosts-home deploy-home.yml

$ ansible-playbook --ask-vault-password -i hosts-home-secure deploy-home-secure.yml
person Alexei Tenitski    schedule 17.11.2015

Вот еще один вариант, если вам не всегда нужны переменные в хранилище.

У вас может быть такая структура папок:

group_vars
├── all
├── prod
├── dev
│   └── vars.yml
└── dev-vault
    └── vault.yml

Вы храните переменные в хранилище в варианте «-vault» этого инвентаря.

Тогда ваши запасы могут выглядеть примерно так:

Разработчик:

[servers]
dev.bla.bla


[dev:children]
servers

dev-хранилище:

[servers]
dev.bla.bla


[dev:children]
servers

[dev-vault:children]
servers

Таким образом, вы сохраняете только конфиденциальные данные в переменных dev-vault, если в большинстве случаев вам на самом деле не нужны пароли и т. д., вы можете запускать playbooks без дополнительных опций, которые вы на самом деле не используете, или хранить пароль хранилища в виде открытого текста для удобство и др.

Таким образом, «нормальная» команда может быть:

 ansible-playbook -i dev some.yml

И «сводчатая» команда может быть:

 ansible-playbook -i dev-vault some.yml --extra-vars="use_vault=true"

Или вы можете управлять «включить переменные хранилища» с помощью тегов, включая some.yml в some-vault.yml и т. д.

person Mr. Hasquestions    schedule 15.02.2017