Добавление учетных записей с помощью Ansible
Oct 6, 2016 22:38 · 260 words · 2 minute read ansible
Ранее мы уже рассматривали несколько вариантов использования системы управления конфигурациями Ansible , теперь давайте разберемся как добавить пользователя на удаленный хост!
Считаем, что Ansible установлен и настроен. Для создания пользователя на удаленном хосте мы будем использовать простой набор инструкций (плейбук), хотя можно подойти к вопросу более основательно и создать роль для управления пользователями (подробнее о ролях можно почитать здесь).
Создаем набор инструкций с именем useradd.yml :
touch useradd.yml
Содержимое файла useradd.yml следующее:
--- - hosts: all become: yes tasks: - name: Add user to remote hosts user: name=admin groups=sudo shell=/bin/bash password=$6$KjyfytoJ$hoQdVIGcRZgje2HpHFf8ldvooLfY774SrEpHkADUf3d7uGBSwVLeMXsPIfb4l2TaXWvprMz868ZbH8HLaiDeh. - name: Add SSH keys to remote hosts authorized_key: user=admin key=">"
В данном примере поле hosts: содержит группу, на которой будет запущена задача (task). Дополнительно указано, что для выполнения задач требуется эскалация привилегий ( become: yes ).
Примечание. become используется начиная с версии Ansible 1.9, до этого для эскалации привилегий использовали sudo .
Поле tasks: содержит имена задач (Add user to remote hosts и Add SSH keys to remote hosts), имена модулей, которые должны выполняться ( user и authorized_key ) и аргументы, необходимые для выполнения модуля (для первого это name , groups , shell , password , для второго — user , key ).
Запустить только что созданный набор инструкций можно следующей командой:
ansible-playbook playbooks/useradd.yml PLAY [all] ********************************************************************* TASK [setup] ******************************************************************* ok: [test1] ok: [test2] TASK [Add user to remote hosts] ************************************************ changed: [test2] changed: [test1] TASK [Add SSH keys to remote hosts] ******************************************** changed: [test2] changed: [test1] PLAY RECAP ********************************************************************* test2 : ok=3 changed=2 unreachable=0 failed=0 test1 : ok=3 changed=2 unreachable=0 failed=0
После выполнения данного набора инструкций можно логиниться на удаленные хосты под только что созданной учетной записью.
Read more
© Copyright 2023 Yevhen Lebid
Создать пользователя и скопировать publickey с помощью Ansible
В этой статье мы покажем, как с помощью Ansible добавить на удаленные Linux сервера пользователей и ваш публичный ключ для SSH аутентификации.
Предполагаем, что у вас уже установлен Ansible.
Создайте пользователя anscfg, который будет использоваться для удаленного управления:
# groupadd -g 2002 anscfg
# useradd -u 2002 -g 2002 -c «Automation Account» -s /bin/bash -m -d /home/anscfg anscfg
Предоставьте пользователю право sudo и задайте пароль:
# usermod -aG wheel anscfg
# passwd anscfg
Войдите по новым пользователем:
Создайте служебные каталоги:
Сгенерируйте пару SSH ключей:
$ ssh-keygen -t ed25519 -o -a 100 && ssh-keygen -t rsa -b 4096 -o -a 100
Добавьте в файл hosts адреса удаленных серверов, которыми вы будете управлять:
192.168.31.21 nginx1 192.168.31.22 nginx2 192.168.31.23 nginx3
Теперь создайте файл с именами клиентов Ansible и добавьте ваши сервера:
[webservers] nginx1 nginx2 nginx3

По умолчанию Ansible использует конфигурационный файл /etc/ansible/ansible.cfg. Мы создадим собственный файл конфигурации:
[defaults] inventory = /home/anscfg/inventory host_key_checking = False
- Обратите внимание на точку перед именем ansible.cfg. Она сообщает Ansible, что конфигурационный файлы нужно искать в домашней директории пользователя;
- Параметр host_key_checking = False запрещает Ansible выполнять запрос на добавлении клиентского сервера в known_hosts при запуске плейбука Ansible.
Создайте новый плейбук
--- - hosts: webservers become: true tasks: - name: Create user anscfg user: name: anscfg password: shell: /bin/bash groups: wheel append: yes - name: Создать SSH ключ для anscfg в ~anscfg/.ssh/id_rsa user: name: anscfg generate_ssh_key: yes ssh_key_bits: 2048 ssh_key_file: .ssh/id_rsa - name: Добавить authorized key из файла id_rsa.pub authorized_key: user: anscfg state: present key: ">"

Данный плейбук создаст на удаленном сервере пользователя anscfg с правами sudo, пару SSH ключей и установит публичный ключ.
Задайте права на файл:
$ chmod 644 /home/anscfg/playbooks/useradd.yml
Теперь можно запустить ваш плейбук:
$ ansible-playbook useradd.yml -u remote_user —ask-pass
После выполнения плейбука на удаленных хостах вы сможете подключиться к нему по SSH без пароля (с помощью закрытого ключа):
Если вы хотите деплоить плейбуки без ввода пароля, можно добавить имя пользователя и пароль в файл inventory:
[webservers] nginx1 ansible_ssh_user=anscfg ansible_sudo_pass= nginx2 ansible_ssh_user=anscfg ansible_sudo_pass= nginx3 ansible_ssh_user=anscfg ansible_sudo_pass=
Не забудьте изменить права на файл inventory на 600.
Регистрация результата — Основы автоматизации в Ansible
Представьте себе ситуацию, когда результат вывода одной таски, нужно использовать в другой. Например, добавить в cron список домашних директорий пользователя. Для выполнения такой операции в Ansible существует механизм, который называется регистрация результата:
- hosts: all gather_facts: no tasks: - ansible.builtin.shell: ls /Users register: home_dirs - name: add home dirs to cron ansible.builtin.cron: name: "backup_dirs" minute: "0" hour: "5,2" job: "backup /home/ item >>" with_items: home_dirs.stdout_lines - ansible.builtin.debug: var: home_dirs.stdout_lines
С помощью ключа register , можно записать результат работы модуля shell в переменную с произвольным именем, например, home_dirs . И использовать эту переменную в другой задаче, при вызове модуля cron .
Распечатаем содержимое переменной home_dirs . Для этого нам подойдет модуль debug , который позволяет делать вывод значений:
- hosts: all gather_facts: no tasks: - ansible.builtin.shell: ls /Users register: home_dirs # - name: add home dirs to cron # ansible.builtin.cron: name="backup_dirs" minute="0" hour="5.2" job="backup /home/>" # loop: home_dirs.stdout_lines - name: print home_dirs variable ansible.builtin.debug: var: home_dirs
-i inventory.ini TASK: [print home_dirs variable] **************** ok: [localhost] => "var": "home_dirs": "changed": true, "cmd": "ls /Users", "delta": "0:00:00.011196", "end": "2020-08-11 15:20:12.739441", "failed": false, "rc": 0, "start": "2020-08-11 15:20:12.728245", "stderr": "", "stderr_lines": [], "stdout": "Guest\nShared\nkirill" "stdout_lines": [ "Guest", "Shared", "kirill" ] > > >
home_dirs — это хеш, внутри которого содержится информация о таске: выполнена ли задача, сколько времени заняло ее выполнение, какой модуль использовался и, самое главное, содержимое stderr и stdout . Причем stdout представлен в двух форматах: в виде строки и списка. Списочный формат позволяет использовать результат в цикле, что мы и сделали в первоначальном плейбуке.
Еще один пример:
- hosts: all gather_facts: no tasks: - ansible.builtin.command: 'false' register: result ignore_errors: yes - ansible.builtin.command: echo 'ehu' when: not result.failed - ansible.builtin.command: uptime when: result.failed
Открыть доступ
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
- 130 курсов, 2000+ часов теории
- 1000 практических заданий в браузере
- 360 000 студентов
Наши выпускники работают в компаниях:
Ansible — Создание пользователя
На самом деле тут ничего такого сложного чтобы об этом писать. Но вот можно по невнимательности наступить на грабли.
Суть в том, что при использовании модуля user пароль задаётся через переменную password. Но есть одно, но, хоть в типе и написано string если вы создаёте пользователя на linux то значение нужно шифровать.
Т.е. если вы просто напишите так, как снизу то работать это не будет.
- name: Add user user: name: user password: "123456"
Да, задача выполниться успешно и даже создастся пользователь, но вот зайти в систему под ним вы не сможете. А в логах будет сверкать запись: pam_sss(sshd:auth): received for user : 10 (User not known to the underlying authentication module)
Как правильно?
Правильный вариант создания пользователя с указанием пароля выглядит так (пароль 123456 не безопасный):
- name: Add user user: name: user password: " < < pwd | password_hash('sha512') >>" vars: pwd: "123456"
Поделиться: Twitter Facebook
Пожалуйста подпишитесь: Telegram Youtube

О Ynwasg
Когда-то я тоже был обычным эникейщиком, который ходил и включал мониторы, когда пользователь паниковал что у него комп не включается. Но в своё время мне это надоело, и я пошёл дальше.