Как сохранить ansible_become_pass в хранилище и как его использовать?
Я новичок в возможности, и я использую очень простой учебник для выпуска sudo apt-get update
и sudo apt-get upgrade
на нескольких серверах.
Это плей-лист, который я использую:
---
- name: Update Servers
hosts: my-servers
become: yes
become_user: root
tasks:
- name: update packages
apt: update_cache=yes
- name: upgrade packages
apt: upgrade=dist
и это выдержка из моего файла ~/.ansible/inventory/hosts
:
[my-servers]
san-francisco ansible_host=san-francisco ansible_ssh_user=user ansible_become_pass=<my_sudo_password_for_user_on_san-francisco>
san-diego ansible_host=san-diego ansible_ssh_user=user ansible_become_pass=<my_sudo_password_for_user_on_san-diego>
Это то, что я получаю, если я запустил playbook:
$ ansible-playbook update-servers-playbook.yml
PLAY [Update Servers] **********************************************************
TASK [setup] *******************************************************************
ok: [san-francisco]
ok: [san-diego]
TASK [update packages] *********************************************************
ok: [san-francisco]
ok: [san-diego]
TASK [upgrade packages] ********************************************************
ok: [san-francisco]
ok: [san-diego]
PLAY RECAP *********************************************************************
san-francisco : ok=3 changed=0 unreachable=0 failed=0
san-diego : ok=3 changed=0 unreachable=0 failed=0
Что меня беспокоит, так это то, что у меня есть пароль для моего пользователя user
, хранящегося в открытом тексте в моем файле ~/.ansible/inventory/hosts
.
Я читал о хранилищах, я также прочитал о best практики для переменных и хранилищ, но я не понимаю, как применить это к моему очень минимальному варианту использования.
Я также попытался использовать lookups. Хотя в целом они также работают в файле инвентаризации, и я могу сделать что-то вроде этого:
[my-servers]
san-francisco ansible_host=san-francisco ansible_ssh_user=user ansible_become_pass="{{ lookup('env', 'ANSIBLE_BECOME_PASSWORD_SAN_FRANCISCO') }}"
где в этом случае пароль будет храниться в переменной среды, называемой ANSIBLE_BECOME_PASSWORD_SAN_FRANCISCO
; насколько я знаю, нет способа искать переменные в хранилищах.
Итак, как я могу организовать свой файл таким образом, чтобы я мог где-то искать мои пароли и безопасно их хранить?
Ответы
Ответ 1
Вам нужно создать несколько файлов с переменными хранилищами, а затем включить их в свои списки воспроизведения или в командную строку.
Если вы измените свой файл инвентаря, чтобы использовать переменную для прохода становления, эта переменная может быть помещена в хранилище:
[my-servers]
san-francisco ansible_host=san-francisco ansible_ssh_user=user ansible_become_pass='{{ sanfrancisco_become_pass }}'
san-diego ansible_host=san-diego ansible_ssh_user=user ansible_become_pass='{{ sandiego_become_pass }}'
Затем используйте ansible-vault create vaulted_vars.yml
чтобы ansible-vault create vaulted_vars.yml
файл со следующим содержимым:
sanfrancisco_become_pass: <my_sudo_password_for_user_on_san-francisco>
sandiego_become_pass : <my_sudo_password_for_user_on_san-diego>
Затем добавьте в качестве дополнительных переменных сводной файл:
ansible-playbook -i ~/.ansible/inventory/hosts playbook.yml --ask-vault-pass [email protected]~/.ansible/inventory/vault_vars
Или включите файл vars в свою книгу воспроизведения с помощью задачи include_vars:
- name : include vaulted variables
include_vars: ~/.ansible/inventory/vault_vars
Ответ 2
После настройки инвентаря с вашими собственными соответствующими настройками. Эти настройки предполагают, что вы уже настроили пару rsa-key для доступа к вашему серверу. Вы должны быть в состоянии подключиться по ssh к вашему серверу с помощью ssh [email protected]
[local]
localhost ansible_connection=local
[remote]
155.42.88.199 ansible_connection=ssh ansible_user=remoteuser ansible_become_user=root ansible_become=yes ansible_ssh_private_key_file=<private_key_file_path>
Вам нужно сохранить свой пароль root в файле (я назвал мой my_vault.yml). Вы можете сделать это с помощью следующей команды:
~/.ansible$ ansible-vault create my_vault.yml
Просто сохраните пароль удаленного сервера следующим образом (не включайте теги <>)
su_password: <myreallyspecialpassword>
Теперь пароль будет зашифрован хранилищем, и единственный способ просмотреть это - ввести следующую команду.
~/.ansible$ ansible-vault edit my_vault.yml
Теперь нам нужно включить наш файл my_vault.yml в нашу книгу воспроизведения. Мы можем сделать это, используя vars-files
чтобы получить значение su-password
. Теперь мы можем создать ansible_become_pass
которой будет передано значение из нашего файла my_vault.yml
что позволит нашему удаленному пользователю su один раз на сервере.
---
- name: My Awesome Playbook
hosts: remote
become: yes
vars_files:
- ~/.ansible/my_vault.yml
vars:
ansible_become_pass: '{{ su_password }}'
roles:
- some_awesome_role
Поскольку мы используем хранилище каждый раз, когда хотим запустить этот playbook, нам нужно использовать следующую команду.
ansible-playbook myawesome_playbook.yml --ask-vault-pass
Ответ 3
Лучший способ решить эту проблему - использовать host_vars. Самая простая настройка - просто поместить ansible_become_pass
в зашифрованные файлы Vault в соответствующие каталоги host_vars, например так:
myplaybook.yml
host_vars/onehost.com/crypted
host_vars/otherhost.com/crypted
В crypted
файлах вы размещаете назначение переменной ansible_become_pass
:
ansible_become_pass: SuperSecre3t
Создайте файл с помощью ansible-vault create
, отредактируйте его с помощью ansible-vault edit
.
Следуя советам в документации Ansible, вам нужно создать дополнительный файл для каждого хоста, который назначит ansible_become_passwd
из зашифрованной переменной, имеющей другое имя. Таким образом, можно искать ansible_become_passwd
в файлах проекта.
myplaybook.yml
host_vars/onehost.com/plain
host_vars/onehost.com/crypted
host_vars/otherhost.com/plain
host_vars/otherhost.com/crypted
где plain
файл содержит что-то вроде этого:
ansible_become_pass: "{{ vaulted_become_pass }}"
и crypted
файл устанавливает vaulted_become_pass
как показано выше.
Все crypted
файлы должны быть зашифрованы одним и тем же ключом, а ansible-playbook
--ask-vault-pass
с помощью --ask-vault-pass
.