Введение
Ansible Vault позволяет шифровать конфиденциальные переменные, чтобы их можно было хранить вместе с плейбуками, не раскрывая секреты в открытом виде. Плейбук может использовать значение переменной только в том случае, если вы предоставите корректный пароль Vault.
В этой лабораторной работе вы создадите зашифрованную переменную, увидите, что произойдет при отсутствии пароля, а затем успешно запустите плейбук, используя файл паролей Vault.
Создание проекта для работы с Vault
На этом этапе вы создадите проект, включающий инвентарь, каталог для групповых переменных, каталог для плейбуков и каталог для отчетов.
cd /home/labex/project
mkdir -p rhce-ansible/{inventory/group_vars/managed,playbooks,managed,reports}
cd rhce-ansible
cat > ansible.cfg <<'EOF'
[defaults]
inventory = ./inventory/hosts
host_key_checking = False
retry_files_enabled = False
EOF
cat > inventory/hosts <<'EOF'
[managed]
host ansible_connection=local
EOF
Зашифрованная переменная будет находиться в inventory/group_vars/managed, поэтому она будет загружаться для группы managed так же, как и любой другой файл переменных. Разница лишь в том, что Ansible должен расшифровать её перед использованием.
Создание файла паролей Vault
На этом этапе вы создадите файл пароля для автоматизации лабораторной работы. В реальных условиях тщательно защищайте этот файл или используйте рабочий процесс с запросом пароля. Перед выполнением команд на этом этапе вернитесь в каталог проекта Ansible. Это обеспечит стабильность выполнения команд, даже если LabEx запускает каждый шаг отдельно.
cd /home/labex/project/rhce-ansible
cat > vault_pass.txt <<'EOF'
labex-vault-pass
EOF
chmod 600 vault_pass.txt
Этот файл пароля предназначен только для лабораторного процесса. Режим chmod 600 означает, что только владелец может читать и записывать его — это минимальное правило безопасности, которое следует соблюдать при работе с файлами, открывающими доступ к секретам.
ls -l vault_pass.txt
Убедитесь, что права доступа выглядят примерно как -rw-------. Если файл доступен для чтения группе или другим пользователям, повторно выполните команду chmod 600.
Создание зашифрованной переменной
На этом этапе вы используете ansible-vault encrypt_string для создания зашифрованной переменной с именем app_secret. Зашифрованный файл можно загрузить так же, как и любой другой файл групповых переменных.
Перед выполнением команд на этом этапе вернитесь в каталог проекта Ansible.
cd /home/labex/project/rhce-ansible
ansible-vault encrypt_string --vault-password-file vault_pass.txt 'redhat' --name app_secret > inventory/group_vars/managed/vault.yml
Команда записывает зашифрованную YAML-переменную с именем app_secret. Имя переменной остается читаемым, но значение redhat хранится внутри блока Vault.
sed -n "1,8p" inventory/group_vars/managed/vault.yml
В файле должно отображаться app_secret: !vault и заголовок $ANSIBLE_VAULT;. Вы не должны видеть секрет в открытом виде в этом файле.
Написание плейбука, использующего секрет
На этом этапе вы напишете плейбук, который ссылается на app_secret. Без пароля Vault Ansible не сможет расшифровать эту переменную.
Перед выполнением команд на этом этапе вернитесь в каталог проекта Ansible.
cd /home/labex/project/rhce-ansible
cat > playbooks/use-vault.yml <<'EOF'
---
- name: Use an encrypted variable
hosts: managed
gather_facts: false
tasks:
- name: Write secret-derived file
ansible.builtin.copy:
dest: /home/labex/project/rhce-ansible/managed/secret.txt
content: |
secret={{ app_secret }}
mode: '0600'
EOF
Плейбук использует app_secret как обычную переменную. В этом и заключается смысл Vault: логика плейбука остается чистой, в то время как конфиденциальное значение остается зашифрованным в состоянии покоя.
ansible-playbook playbooks/use-vault.yml > reports/vault-missing.txt 2>&1 || true
Ожидается, что этот запуск завершится ошибкой, так как пароль Vault не был предоставлен. Вывод перенаправляется в отчет, чтобы вы могли изучить ошибку, не прерывая работу лаборатории.
grep -Ei "vault|decrypt|password|secret" reports/vault-missing.txt
Отфильтрованная ошибка должна содержать упоминания Vault, расшифровки (decryption), пароля или секрета. Также обратите внимание, что файл managed/secret.txt еще не создан.
Запуск плейбука с паролем Vault
На этом этапе вы предоставите файл пароля Vault, чтобы Ansible мог расшифровать переменную и записать защищенный выходной файл. Перед выполнением команд на этом этапе вернитесь в каталог проекта Ansible.
cd /home/labex/project/rhce-ansible
ansible-playbook playbooks/use-vault.yml --vault-password-file vault_pass.txt | tee reports/vault-run.txt
Теперь Ansible может расшифровать app_secret и передать значение в открытом виде задаче copy во время выполнения. Зашифрованный файл на диске остается зашифрованным.
sudo ls -l managed/secret.txt && cat managed/secret.txt
Файл должен иметь права 600 и содержать secret=redhat. Это доказывает, что плейбук использовал расшифрованное значение, при этом обеспечивая защиту созданного файла с секретом.
Резюме
Вы создали переменную, зашифрованную с помощью Vault, убедились, что плейбук не может использовать её без пароля, а затем успешно выполнили плейбук с файлом паролей Vault для расшифровки и применения секрета.


