Создание паролей пользователей из Ansible Playbook - PullRequest
0 голосов
/ 11 мая 2018

Я уверен, что кто-то здесь может решить мою проблему.Я создаю пользователей на хостах, которые определены в моем файле Ansible hosts.НО, когда пользователи хотят войти в систему, пользователь root должен определить пароль пользователя.Мне нужно автоматизировать создание пользовательских паролей.

Чтобы создать пользовательские пароли с помощью playbook, мы не можем указать пароль открытым текстом, мы можем сделать это только путем предоставления хеша:

 - name: Add Users + Assign to Group
   user:
      name: "{{ item }}"
      password: $6$ul4TACYvHI.kmGUK$j32lU8fNbX.eW0DZOqnnDlP8i0...

Чтобы создать хэш, 1-й шаг - определить пароль, войдя на целевой сервер как root, а затем использовать python-crypt для создания хэша.После запуска команды терминал предоставит хеш, который я вставлю в книгу.(в приведенном ниже примере пароль «ansible»)

python -c 'import crypt; print crypt.crypt("ansible")'

Когда я запускаю playbook на целевом сервере, я могу войти в систему как пользователь, который создал playbook с паролем, который я определил с помощью python-crypt (в этом случае я вхожу как user2 с паролем «ansible»)

login as: user2

user1@10.65.8.50's password: "ansible"


[user1@hostname ~]$

Это означает, что мне нужно создать хэш в терминале сервера, на котором я создаю пользователей, затем скопировать ивставьте этот хэш в playbook.Нет особых проблем, если у меня есть один сервер, но если я использую playbook на 100 серверах, мне нужно войти на 100 серверов как root и создать 100 хешей, а затем определить все эти хеши в playbook, что не очень автоматизировано!

Итак, что нужно, так это возможность выполнить python-crypt из playbook, скопировать созданный хеш, а затем поместить его в playbook.У вас есть идеи, как это сделать?даже не в Ansible, я не ожидаю, что вы, ребята, напишите для меня сборник пьес.Возможно, подумайте, как бы вы сделали это в своем инструменте выбора, например, PowerShell.Как только у меня появится понимание процесса, я смогу перевести его в сборник пьес.

Любая помощь очень ценится!

1 Ответ

0 голосов
/ 12 мая 2018

Это своего рода далеко идущий ответ, и я не проверил это, но я рассматривал способ использования ansible-vault в автоматическом режиме, чтобы я мог развернуть приложение без предварительного определения паролей , сохраняя зашифрованную запись пароля после его создания.

В приведенной ниже книге воспроизведения показан один из способов, которыми вы можете:

  • создать парольна удаленном хосте
  • используйте этот пароль на удаленном хосте,
  • сохраните зашифрованную копию этого пароля в локальной (управляющей) системе.

Сноваэто не проверено, и возможно, что не может работать по какой-то причине, которую я не ожидал, но на самом деле я думаю, что она должна работать так (показаны только соответствующие задачи):

ansible.cfg

vault_password_file = /path/to/vault_password_file

playbook.yml

---
- hosts: example_com
  gather_facts: true
  become: true

  vars:
    password_var_name: "example_com_db_password"
    vault_vars_file: "example_com_vault.yml"

  tasks:
    - name: Find out if we have already set a password.
      command: "grep \"'password' => '',\" settings.php"
      args:
        chdir: "/path/to/settings"
      register: password_in_file

    - name: Create a password and use ansible-vault to write it.
      block:
        - name: Create a new password.
          command: "apg -a1 -m32 -n1"
          register: new_vault_password
          no_log: true

        - name: Encrypt the new password.
          command: "ansible-vault encrypt \"{{ new_vault_password.stdout }}\""
          register: new_vault_password_encrypted
          no_log: true

        - name: Write the encrypted password to our local ansible-vault file.
          lineinfile:
            path: "{{ playbook_dir }}/{{ vault_file }}"
            line: "{{ password_var_name }}: {{ new_vault_password_encrypted.stdout }}"
            insertafter: "EOF"
          when: password_in_file.stdout = 0
          delegate_to: localhost

        - name: Write the unencrypted password into our remote settings file.
          lineinfile:
            path: "/path/to/settings/settings.php"
            line: "  'password' => '{{ new_password.stdout }}',"
            regexp: "^  'password' => '',$"
          no_log: true

Итак, tldr для этого:

  • у нас есть файл конфигурации Ansible ansible.cfg.
  • этот файл содержит путь к нашему ansible-vault файлу паролей.
  • У нас есть локальный незашифрованный файл для динамических переменных Ansible.
  • мы проверяем, нужно ли нам приступить к созданию нового пароля и т. Д.
  • если да, мы создаем пароль.
  • , затем зашифровываем его.
  • , затем записываем незашифрованный пароль в файл настроек.
  • затем мы записываем зашифрованный пароль в наш локальный , un -шифрованный файл переменных.

...