Как сохранить 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.