Добавление пользователя и 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 {playbooks,scripts,templates}

Создание плейбука useradd.yml

Давайте теперь создадим плейбук с помощью которого на удаленном сервере будет создан пользователь lnxcfg с правами sudo, а так же будет передан открытый ключ этого пользователя, чтобы в дальнейшем мы могли подключаться к серверу по publickey.

В директории /home/lnxcfg/playbooks создайте файл useradd.yml с таким содержимым.
---
- hosts: webservers
  become: true
  remote_user: root
  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') }}"

Права файла 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 и запускаем наш плейбук с параметром --ask-passw, чтобы сообщить Ansible о том, что подключиться к удаленному серверу надо под root.
[lnxcfg@centos-2gb-nbg-vpn playbooks]$ ansible-playbook useradd.yml --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.

Источники

Доки 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/

Если у вас что-то не получается или есть вопросы, пишите в комментариях.

Просьба поделиться статьёй в социальных сетях. Больше ссылок, больше шансов найти эту информацию тем, кому она нужна.
+ 0 -

Добавить комментарий