Thank you for reading this post, don't forget to subscribe!
Ansible есть свой механизм безопасного хранения секретов, однако, нам может понадобиться использовать централизованное решение. В этом случае, есть решение для интеграции Hashicorp Vault и Ansible.
Настройка Hashicorp Vault
На стороне Hashicorp Vault необходимо создать:
- Путь хранения секретов для Ansible и сам секрет.
- Политику доступа к созданному секрету.
- Токен для возможности подключения с привязкой к созданной политике.
1. Для начала, формируем путь хранения секрета по механизму key-value:
vault secrets enable -path=ansible kv
* в данном примере путь будет начинаться с ansible.
Создаем секрет:
vault kv put ansible/projects/test-project/database \
username=my_user \
password=password135 \
host=mariadb.test.local \
dbname=testdb
* в данном примере будет создан секрет по пути ansible/projects/test-project/database, в котором будут записи для подключения к базе данных (например, mariadb).
Смотрим, что получилось:
vault kv get ansible/projects/test-project/database
Команда должна нам вернуть что-то на подобие:
1 2 3 4 5 6 7 |
====== Data ====== Key Value --- ----- dbname testdb host mariadb.test.local password password135 username my_user |
* мы должны получить данные, которые добавили в секрет.
2. Создаем политику:
1 2 3 4 5 |
vault policy write test-project-ansible - <<EOF path "ansible/projects/test-project/*" { capabilities = [ "read" ] } EOF |
* в данном примере мы назвали политику test-project-ansible. По нашему правилу мы разрешаем чтение по пути ansible/projects/test-project.
3. Создаем токен для нашей политики:
vault token create -policy="test-project-ansible"
Мы должны увидеть что-то на подобие:
1 2 3 4 5 6 7 8 9 |
Key Value --- ----- token s.E1jqoGhkgcMcZtbOLENSsW21 token_accessor E9TGHoaDYw1q8HPpyWZy9xkf token_duration 768h token_renewable true token_policies ["default" "test-project-ansible"] identity_policies [] policies ["default" "test-project-ansible"] |
Записываем token — его значение нам понадобиться позже.
Настройка Ansible
Переходим к Ansible. Устанавливаем питон-модуль hvac:
pip3 install hvac
Создаем плейбук, в котором нам нужно обращаться к Vault, например:
vi /etc/ansible/vault-playbook.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
--- - hosts: test_servers user: test become: true become_method: su become_user: root vars: vault_url: https://vault.test.local:8200 vault_token: s.E1jqoGhkgcMcZtbOLENSsW21 vault_secret: ansible/projects/test-project/database database_arr: "{{ lookup('hashi_vault', 'secret={{ vault_secret }} token={{ vault_token }} url={{ vault_url }} validate_certs=False') }}" tasks: - name: Echo Vars ansible.builtin.debug: msg: "Database host: {{ database_arr.host }}, dbname: {{ database_arr.dbname }}, username: {{ database_arr.username }}, password: {{ database_arr.password }}" |
* где:
- vault_url — ссылка для запросов к серверу Vault. Это может быть имя сервера или IP-адресс.
- vault_token — токен для подключения. Используем тот, что создали в первой части инструкции.
- vault_secret — полный путь до созданного в Vault секрета.
- database_arr — переменна, в которую мы запишем значения для каждой из строк нашего секрета.
В результате отработки данного плейбука на экране должны отобразиться значения нашего секрета. В конкретном примере мы получим 4 переменные, которые уже по собственному желанию сможем использовать в сценариях Ansible:
- database_arr.host
- database_arr.dbname
- database_arr.username
- database_arr.password
Обратите внимание, что часть после точки соответствует имени параметра в секрете.
Для проверка запустим наш плейбук:
ansible-playbook /etc/ansible/vault-playbook.yml -kK
Мы должны получить что-то на подобие:
1 2 3 |
ok: [192.168.0.15] => { "msg": "Database host: mariadb.test.local, dbname: testdb, username: my_user, password: password135" } |
готово мы можем читать секреты из Hashicorp Vault средствами Ansible