Ansible: как зашифровать некоторые переменные в файле инвентаря в отдельном файле хранилища?
Настройки
Рассмотрим файл Ansible inventory file, похожий на следующий пример:
[san_diego]
host1
host2
[san_francisco]
host3
host4
[west_coast]
san_diego
san_francisco
[west_coast:vars]
db_server=foo.example.com
db_host=5432
db_password=top secret password
Проблема
Я хотел бы сохранить некоторые из варов (например, db_password
) в Ansible vault, но не весь файл.
Как можно импортировать незашифрованный файл с хранилищем в незашифрованный файл инвентаризации?
Что я пробовал
Я создал зашифрованный файл vars и попытался импортировать его с помощью:
include: secrets
На что ansible-playbook
ответил:
ERROR: variables assigned to group must be in key=value form
Возможно, потому, что он попытался проанализировать оператор include
как переменную.
Ответы
Ответ 1
Если ваша проблема заключается в том, чтобы иметь как незашифрованные, так и зашифрованные файлы vars на group_hosts.
Вы можете использовать эту возможность: http://docs.ansible.com/ansible/playbooks_best_practices.html#best-practices-for-variables-and-vaults
group_vars/
san_diego/
vars.yml # unencrypted yaml file
vault.yml # encrypted yaml file
Ansible будет автоматически читать файл vault.yml как зашифрованный файл yaml.
Обновление: решение ниже также является хорошим решением (поскольку Ansible 2.3)
Ответ 2
После Ansible 2.3 вы можете зашифровать Single Encrypted Variable.
IMO, необходимо прохождение игры, поскольку doco кажется довольно кратким.
С учетом примера: mysql_password: password123
(в main.yml)
Выполнить команду, например:
ansible-vault encrypt_string password123 --ask-vault-pass
Это создаст:
!vault |
$ANSIBLE_VAULT;1.1;AES256
66386439653236336462626566653063336164663966303231363934653561363964363833
3136626431626536303530376336343832656537303632313433360a626438346336353331
Encryption successful
вставьте это в свой main.yml:
mysql_password: !vault |
$ANSIBLE_VAULT;1.1;AES256
66386439653236336462626566653063336164663966303231363934653561363964363833
3136626431626536303530376336343832656537303632313433360a626438346336353331
Encryption successful
запустить playbook:
Ie, ansible-playbook -i hosts main.yml --ask-vault-pass
Проверить через debug:
- debug:
msg: "mysql Pwd: {{ mysql_password }}"
Ответ 3
В это время с Ansible 2.3 можно было иметь в простой ямле как зашифрованные, так и незашифрованные переменные. Формат зашифрованных переменных выглядит следующим образом:
dbServer: PlainDatabaseServer
dbName: PlainDatabaseName
dbUser: PlainUser
dbPasswd: !vault |
$ANSIBLE_VAULT;1.1;AES256
63633363616165656538656537323835343634633063386137353637646663333939623464666437
6263383933656635316436313934366564316337623435350a386362613838373363393534383232
39663162363066313431623466363763356466376538613532333731613538373431623239626330
6463373238366630360a623566616535376339326431363465663431623462356238636333306663
6439
Вы можете зашифровать переменную с помощью пароля или файла паролей с инструкцией:
ansible-vault encrypt_string "dummy" --vault-password-file pass-ansible.txt
Этот оператор возвращает текст, указанный в переменной dbPasswd, в yaml выше.
Чтобы запустить playbook, в котором используется зашифрованная переменная, просто добавьте следующий файл var:
ansible-playbook playbooks/myplaybook --vault-password-file pass-ansible.txt
Или вы можете сделать то же самое с -ask-vault-pass, который запрашивает пароль при выполнении playbook:
ansible-playbook playbooks/myplaybook --ask-vault-pass
Ответ 4
Вы можете сделать что-то похожее на это.
- Создайте файл паролей (обычный текстовый файл с паролем в одной строке)
-
Создайте ansible.cfg
в папке с незаменимым проектом
[defaults]
vault_password_file = <path/to/your/password/file>
-
Создайте файл для воспроизведения (например, playbook.yml
)
- name: my ansible playbook
hosts: 127.0.0.1
vars_files:
- 'vars.yml'
tasks:
- name: print secure variable
debug: msg="my secure variable '{{ my_secure_variable }}'"`
-
Создайте файл переменной (например, vars.yml
)
my_secure_variable: "X_my_secret_X"
-
Зашифруйте файл переменной (из местоположения недоступного проекта с помощью ansible.cfg
)
ansible-vault encrypt vars.yml
-
Запустите плей-лист (из доступного местоположения проекта с помощью ansible.cfg
)
ansible-playbook -i "localhost," playbook.yml
Вы должны получить результат, похожий на:
$ ansible-playbook playbook.yml -i 'localhost,'
PLAY [my ansible playbook] ****************************************************
GATHERING FACTS ***************************************************************
ok: [127.0.0.1]
TASK: [print secure variable] *************************************************
ok: [127.0.0.1] => {
"msg": "my secure variable 'X_my_secret_X' "
}
PLAY RECAP ********************************************************************
127.0.0.1 : ok=2 changed=0 unreachable=0 failed=0
Ответ 5
Это зависит от вашего рабочего процесса. Вы можете использовать файл group_vars
в соответствии с предложением Sebastian Stigler или если вы хотите использовать файл инвентаря, вы можете просто добавить еще один "ini-like" файл в каталог инвентаря и зашифровать его.
$ mkdir my_inventory/
$ cat >> hosts << EOF
[san_diego]
host1
host2
[san_francisco]
host3
host4
[west_coast]
san_diego
san_francisco
EOF
$ cat >> inventory_crypted_vars << EOF
[west_coast:vars]
db_server=foo.example.com
db_host=5432
db_password=top secret password
EOF
Затем используйте -i my_inventory/
в командной строке или создайте локальный ansible.cfg
, содержащий:
[defaults]
hostfile = ./my_inventory/
и вы должны быть установлены. Ansible объединит оба файла во время выполнения.
Используйте ansible-vault encrypt my_inventory/inventory_crypted_vars
перед фиксацией, и вы настроились.
Вероятно, вы хотите использовать привязку для предварительной фиксации, чтобы убедиться, что вы не выполняете незашифрованную версию файла. Например, крюк с предварительной фиксацией, подобный этому, сделает трюк (соответственно отрегулируйте FILES_PATTERN
).
Ответ 6
Вы можете использовать group_vars (см. http://docs.ansible.com/playbooks_variables.html#variable-precedence-where-should-i-put-a-variable).
Создайте подкаталог в вашем плейлисте с именем group_vars
.
Там вы создаете файл с именем west_coast
и вносите в него следующие записи:
---
db_server: foo.example.com
db_host: 5432
db_password: top secret password
Затем этот файл можно преобразовать в незанятое хранилище.