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
Когда-то я тоже был обычным эникейщиком, который ходил и включал мониторы, когда пользователь паниковал что у него комп не включается. Но в своё время мне это надоело, и я пошёл дальше.
Добавление пользователя и publickey на удаленные сервера с помощью Ansible
В этой статье хочу рассказать как с помощью Ansible добавить на удаленные сервера пользователя с правами sudo, а так же публичный ключ, чтобы в дальнейшем каждый раз не вводить пароли для подключения к серверам по SSH.
Сначала установим и сконфигурируем Ansible, затем добавим удаленный хост, а после этого сгенерируем RSA-ключи, напишем плейбук и задеплоим их на удаленный сервер.
Все нижеописанное гарантированно работает c такой конфигурацией:
[root@centos-2gb-nbg-vpn ~]# cat /etc/*-release CentOS Linux release 7.7.1908 (Core) NAME="CentOS Linux" VERSION="7 (Core)" ID="centos" ID_LIKE="rhel fedora" VERSION_ID="7" PRETTY_NAME="CentOS Linux 7 (Core)" ANSI_COLOR="0;31" CPE_NAME="cpe:/o:centos:centos:7" HOME_URL="https://www.centos.org/" BUG_REPORT_URL="https://bugs.centos.org/"
[root@centos-2gb-nbg-vpn ~]# ansible --version ansible 2.9.3 config file = /etc/ansible/ansible.cfg configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python2.7/site-packages/ansible executable location = /usr/bin/ansible python version = 2.7.5 (default, Aug 7 2019, 00:51:29) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]
Установка Ansible
Обновим CentOS 7.
yum update -y
Установим Ansible.
yum install ansible -y
Конфигурирование Ansible
Создадим пользователя lnxcfg, который будет использоваться для управления удаленными серверами.
groupadd -g 2002 lnxcfg useradd -u 2002 -g 2002 -c "Ansible Automation Account" -s /bin/bash -m -d /home/lnxcfg lnxcfg
Дадим ему права sudo, а так же зададим пароль.
usermod -aG wheel lnxcfg passwd lnxcfg
И наконец, залогинимся под lnxcfg.
[root@centos-2gb-nbg-vpn ansible]# su - lnxcfg Last login: Mon Feb 17 09:59:58 +10 2020 on pts/1
Далее все действия будем производить под lnxcfg
Добавьте в файл /etc/hosts адрес удаленного хоста, к которому мы будем применять плейбуки.
В моём случае выглядит это так (94.130.xx.xx centos-2gb-nbg-webserver1).
# Your system has configured 'manage_etc_hosts' as True. # As a result, if you wish for changes to this file to persist # then you will need to either # a.) make changes to the master file in /etc/cloud/templates/hosts.redhat.tmpl # b.) change or remove the value of 'manage_etc_hosts' in # /etc/cloud/cloud.cfg or cloud-config from user-data # # The following lines are desirable for IPv4 capable hosts 127.0.0.1 centos-2gb-nbg-vpn 127.0.0.1 localhost.localdomain localhost 127.0.0.1 localhost4.localdomain4 localhost4 # The following lines are desirable for IPv6 capable hosts ::1 centos-2gb-nbg1-2 centos-2gb-nbg1-2 ::1 localhost.localdomain localhost ::1 localhost6.localdomain6 localhost6 94.130.xx.xx centos-2gb-nbg-webserver1
Теперь создайте файл с именем inventory в /home/lnxcfg, в котором будут храниться имена хостов (клиентов) Ansible и добавьте удаленный хост.
[webservers] centos-2gb-nbg-webserver1
Файл конфигурации Ansible находится в /etc/ansible/ansible.cfg. Чтобы переопределить конфигурацию Ansible, мы можем создать файл .ansible.cfg, расположенный в /home/lnxcfg.
Создайте файл .ansible.cfg и добавьте в него.
[defaults] inventory = /home/lnxcfg/inventory host_key_checking = False
- inventory = /home/lnxcfg/inventory позволит нам определить инвентаризацию Ansible клиентской системы в локальном домашнем каталоге lnxcfg.
- host_key_checking = False запретит Ansible делать запрос на добавление клиентского сервера в ssh known_hosts, когда будет запущен плейбук Ansible.
Перед ansible.cfg обязательно должна быть точка, тем самым Ansible поймет, что конфигурацию надо искать в домашней директории пользователя.
Под этим же пользователем создайте директории. Они вам пригодятся в будущем.
mkdir -p
Создание плейбука useradd.yml
Давайте теперь создадим плейбук с помощью которого на удаленном сервере будет создан пользователь lnxcfg с правами sudo, а так же будет передан открытый ключ этого пользователя, чтобы в дальнейшем мы могли подключаться к серверу по publickey.
В директории /home/lnxcfg/playbooks создайте файл useradd.yml с таким содержимым.
--- - hosts: webservers become: true tasks: - name: Добавить пользователя 'lnxcfg' с добавлением его в группу 'wheel'. В CentOS 7 группа 'wheel' даёт права sudo user: name: lnxcfg password: shell: /bin/bash groups: wheel append: yes - name: Создать 2048-битовый SSH ключ для lnxcfg в ~lnxcfg/.ssh/id_rsa user: name: lnxcfg generate_ssh_key: yes ssh_key_bits: 2048 ssh_key_file: .ssh/id_rsa - name: Установить authorized key из файла id_rsa.pub authorized_key: user: lnxcfg state: present key: ">"
Сгенерировать хэш пароля:
python -c 'import crypt; print crypt.crypt("пароль")'
Права файла useradd.yml должны быть такими.
[lnxcfg@centos-2gb-nbg-vpn playbooks]$ ll total 12 -rw-r--rw-. 1 root root 5676 Feb 13 11:24 secure-ssh.yml -rw-r--r--. 1 lnxcfg lnxcfg 788 Feb 13 14:30 useradd.yml
Теперь сгенерируйте ключи.
[lnxcfg@centos-2gb-nbg-vpn ~]$ ssh-keygen -t ed25519 -o -a 100 && ssh-keygen -t rsa -b 4096 -o -a 100
Отлично! Теперь можно добавить нашего пользователя на удаленный сервер.
Переходим в директорию playbooks и запускаем наш плейбук с параметром -u и —ask-passw, чтобы сообщить Ansible о том, что подключиться к удаленному серверу надо под определенным пользователем с указанием пароля.
[lnxcfg@centos-2gb-nbg-vpn playbooks]$ ansible-playbook useradd.yml -u remote_user --ask-pass SSH password: PLAY [webservers] *************************************************************************************************************************************************************************** TASK [Gathering Facts] ********************************************************************************************************************************************************************** ok: [centos-2gb-nbg-webserver1] TASK [Добавить пользователя 'lnxcfg' с добавлением его в группу 'wheel'. В CentOS 7 группа 'wheel' даёт права sudo] ************************************************************************* ok: [centos-2gb-nbg-webserver1] TASK [Создать 2048-битовый SSH ключ для lnxcfg в ~lnxcfg/.ssh/id_rsa] *********************************************************************************************************************** ok: [centos-2gb-nbg-webserver1] TASK [Установить authorized key из файла id_rsa.pub] **************************************************************************************************************************************** ok: [centos-2gb-nbg-webserver1] PLAY RECAP ********************************************************************************************************************************************************************************** centos-2gb-nbg-webserver1 : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Вот и всё. Теперь мы можем подключиться к серверу под пользователем.
[lnxcfg@centos-2gb-nbg-vpn playbooks]$ ssh centos-2gb-nbg-webserver1 Last login: Mon Feb 17 01:46:36 2020 from static.75.254.xx.xx.clients.your-server.de [lnxcfg@centos-2gb-nbg1-webserver1 ~]$
Примечание
Чтобы в дальнейшем деплоить плейбуки под пользователем lnxcfg без ввода пароля необходимо в файле /home/lnxcfg/inventory напротив каждого хоста прописать логин и пароль этого пользователя. Конечно, там же можно вместо логина и пароля прописать путь до закрытого ключа, но мне так удобней.
В файле invertory сейчас у нас запись такого вида.
[webservers] centos-2gb-nbg-webserver1
Добавим логин и пароль пользователя lnxcfg напротив ‘centos-2gb-nbg-webserver1’.
[webservers] centos-2gb-nbg-webserver1 ansible_ssh_user=lnxcfg ansible_sudo_pass=
Не забудьте изменить права файла inventory на 600.
Источники
Новость отредактировал: yatakoi — 14-02-2022, 12:31
Причина: Добавлена информация как сгенерировать хэш пароля
Создать пользователя и скопировать 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.
Как создать определенного пользователя на определенном хосте
Есть несколько компьютеров в сети, на каждом из них нужно создать пользователя с определенным логином и паролем. Пользователей создаю так:
vars_prompt: - name: "user_name" prompt: "User name" private: no - name: "user_password" prompt: "Enter a password for the user" private: yes encrypt: "md5_crypt" confirm: yes salt_size: 7 tasks: - name: "add new user" user: name: ">" password: ">" shell: /bin/bash
Так как компов много не хочу запускать playbook огромное количество раз. В идеале хотел бы реализовать ввод списка хостов(компов) и списка пользователей. Пароль в принципе можно везде одинаковый сделать.
Отслеживать
задан 24 мая 2019 в 16:14
21 1 1 бронзовый знак
Пароль один, а юзеры разные? А какой смысл?
25 мая 2019 в 13:41
Мне просто нужно на компах создать пользователей, чтобы в их каталоги перенести данные, а потом уже сами пользователи поменяют пароли.
25 мая 2019 в 17:07
Тогда просто таска по созданию юзера, а потом запускаешь плейбук 1 раз с inventory файлом, где у тебя перечислены хосты.
25 мая 2019 в 17:10
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
На входе: список хостов с заранее известными адресами и количеством пользователей которых нужно добавить.
На выходе: каждый хост содержит сконфигурированные учетные записки для всех перечисленных пользователей.
~$ tree ./ ├── host_vars │ ├── host-01.yml │ ├── host-02.yml │ ├── host-03.yml │ ├── host-04.yml │ ├── host-05.yml │ ├── host-06.yml │ ├── host-07.yml │ ├── host-08.yml │ └── host-09.yml ├── inventory ├── pl-add-users.yml └── roles └── sys_cfg_users_groups └── tasks ├── main.yml └── set_userts.yml
./host_vars/host-01.yml --- cfg: users: - name: "name-01" password: "hashed_password" shell: "/bin/bash" - name: "name-02" password: "hashed_password" shell: "/bin/bash" - name: "name-03" password: "hashed_password" shell: "/bin/bash" . ./host_vars/host-07.yml ./host_vars/host-08.yml ./host_vars/host-03.yml ./host_vars/host-09.yml ./host_vars/host-02.yml ./host_vars/host-05.yml ./host_vars/host-06.yml ./host_vars/host-04.yml ./inventory [main_group] host-01 ansible_hostname=192.168.1.1 host-02 ansible_hostname=192.168.1.2 host-03 ansible_hostname=192.168.1.3 host-04 ansible_hostname=192.168.1.4 host-05 ansible_hostname=192.168.1.5 host-06 ansible_hostname=192.168.1.6 host-07 ansible_hostname=192.168.1.7 host-08 ansible_hostname=192.168.1.8 host-09 ansible_hostname=192.168.1.9 ./roles/sys_cfg_users_groups/tasks/set_userts.yml --- - name: "set_users | creating user's group" group: name: ">" state: present when: cfg.users | bool with_items: ">" - name: "set_users | creating user's account" user: name: ">" group: ">" shell: ">" passowrd: ">" state: present when: cfg.users | bool with_items: ">" . ./roles/sys_cfg_users_groups/tasks/main.yml --- - name: "include | set users account" include_tasks: "set_users.yml" . ./pl-add-users.yml --- - hosts: main_group roles: - role: sys_cfg_users_groups
Я бы в своей работе использую унифицированные роли и полностью декларированный список параметров для каждого хоста (под впечатлением от Guix)