Добавление пользователя и 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
Далее все действия будем производить под 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
  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=<ПАРОЛЬ>


Готово.

Не забудьте изменить права файла 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/

Новость отредактировал: yatakoi - 26-03-2024, 06:00
Причина: Добавлена информация как сгенерировать хэш пароля

Комментариев 3

  1. Офлайн
    Mike
    Mike 5 сентября 2021 00:30
    + +6 -
    Добрый день,
    а подскажите, что делает generate_ssh_key: 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
    ?
    Она генерит ключ для пользователя lnxcfg на удаленном сервере ведь? А мы его разве используем для каких-то целей?

    Ведь для того чтобы самим заходить на этот сервер мы туда копируем свой публичный ключ в
    - name: Установить authorized key из файла id_rsa.pub
        authorized_key:
    1. Офлайн
      Сергей
      Сергей 17 мая 2023 17:34
      + +1 -
      Вот вот ) тоже не понял этот момент) зачем генерить ключ на клиенте если задача в том чтобы раскидать ключ контроллера на клиенты)
  2. Офлайн
    Дмитрий
    Дмитрий 20 июля 2023 20:43
    + 0 -
    А подскажите как можно перекинуть уже имеющийся публичный ключ в authorized keys второго хоста?

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