Добавление пользователя и publickey на удаленные сервера с помощью Ansible
Обновление 14.02.2022г.
Всем привет.
В этой статье хочу рассказать как с помощью 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
Добавьте в файл /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.
Под этим же пользователем создайте директории. Они вам пригодятся в будущем.
mkdir -p {playbooks,scripts,templates}
Создание плейбука 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: <хэш пароля пользователя 'lnxcfg'. Ansible вернет сообщение с ошибкой, если просто указать пароль>
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: "{{ lookup('file', '/home/lnxcfg/.ssh/id_rsa.pub') }}"
Сгенерировать хэш пароля:
python3 -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=<ПАРОЛЬ>
Готово.
Источники
Доки Ansible
https://docs.ansible.com/
user – Manage user accounts
https://docs.ansible.com/ansible/latest/modules/user_module.html
authorized_key – Adds or removes an SSH authorized key
https://docs.ansible.com/ansible/latest/modules/authorized_key_module.html#authorized-key-module
Learning Ansible with CentOS 7 Linux
https://medium.com/@brad.simonin/learning-ansible-with-centos-7-linux-12461043fd02
Добавление учетных записей с помощью Ansible
https://ealebed.github.io/posts/2016/%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-%D1%83%D1%87%D0%B5%D1%82%D0%BD%D1%8B%D1%85-%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B5%D0%B9-%D1%81-%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E-ansible/
Новость отредактировал: yatakoi - 26-03-2024, 06:00
Причина: Добавлена информация как сгенерировать хэш пароля
Комментариев 3