Хочется чего-то интересного, а интересно что-то автоматизировать в плане обслуживания.

Ansible – инструмент в задачу которого будет управление всеми другими узлами через единый центр, взаимодействие осуществляется через SSH соединение, либо с использованием логина и пароля, либо с помощью публичного ключа.

Схема взаимодействия через Ansible с

Пояснение по работе Ansible:

  • через файл hosts происходит инвентаризация удаленный узлов, с которыми предстоит работа
  • через файл playbook (файла с расширением YAML) все также опираясь на файл инвентаризации (файл hosts), но описывается список действий, к примеру: установить, обновить, переместить и т.д.

За основу беру свои заметки:

Что понадобится? несколько систем на с которыми центральная система будет взаимодействовать посредством Ansible, у меня это будет

VM: Ubuntu 20.04 Server

  • Hostname: srv-us2004b

VM2: Ubuntu 18.04 Server

  • Hostname: srv-us1804c
  • IP: 172.33.33.133

VM3: Ubuntu 18.04 Server

  • Hostname: srv-us1804d
  • IP: 172.33.33.128

Шаг №1: Обновляю систему Ubuntu 20.04 на самую последнюю версию установленных пакетов из дефолтных репозитариев:

ekzorchik@srv-us2004b:~$ sudo rm -Rf /var/lib/apt/lists && sudo apt-get update && sudo apt-get upgrade -y

Шаг №2: Текущая версия приложения Ansible в дефолтных репозитариях Ubuntu 20.04 Server:

ekzorchik@srv-us2004b:~$ apt-cache show ansible | grep Version

Version: 2.9.6+dfsg-1

ekzorchik@srv-us2004b:~$

ekzorchik@srv-us2004b:~$ sudo apt-get install -y ansible

ekzorchik@srv-us2004b:~$ sudo apt-get remove --purge -y ansible

Шаг №3: Но использовать будут самую последнюю доступную в подключаемых репозитариях:

ekzorchik@srv-us2004b:~$ sudo apt-add-repository ppa:ansible/ansible

ekzorchik@srv-us2004b:~$ apt-cache show ansible | grep Version

Version: 4.9.0-1ppa~focal -> самая последняя актуальная для моего дистрибутива

Version: 2.9.6+dfsg-1

ekzorchik@srv-us2004b:~$

ekzorchik@srv-us2004b:~$ sudo apt-get install -y ansible

Шаг №4: На узлах в качестве учетной записи использую логин ekzorchik и дабы команды с правами суперпользователя исполнялись, изменяю файл visudo:

ekzorchik@srv-bionic:~$ sudo visudo

ekzorchik ALL=(ALL) NOPASSWD:ALL

Шаг №5: Копирую публичный ключ с Ubuntu 20.04 Server на узлы с которыми буду взаимодействовать:

ekzorchik@srv-us2004b:~$ ssh-keygen -t rsa

ekzorchik@srv-us2004b:~$ ssh-copy-id -i ~/.ssh/id_rsa.pub ekzorchik@172.33.33.133

ekzorchik@srv-us2004b:~$ ssh-copy-id -i ~/.ssh/id_rsa.pub ekzorchik@172.33.33.128

sudo nano /etc/ssh/sshd_config

PubkeyAuthentication yes

sudo service ssh restart

Проверяю что могу подключаться без ввода пароля:

ekzorchik@srv-us2004b:~$ ssh -l ekzorchik 172.33.33.133 "uname -a"

Linux srv-bionic 4.15.0-128-generic #131-Ubuntu SMP Wed Dec 9 06:57:35 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

ekzorchik@srv-us2004b:~$ ssh -l ekzorchik 172.33.33.128 "uname -a"

Linux srv-bionic 4.15.0-136-generic #140-Ubuntu SMP Thu Jan 28 05:20:47 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

ekzorchik@srv-us2004b:~$

Шаг №6: Изменяю под кем ansible будет взаимодействовать с узлами и указываю какой приватный ключ использовать:

ekzorchik@srv-us2004b:~$ sudo nano /etc/ansible/ansible.cfg

#remote_user = root

remote_user = ekzorchik

private_key_file = /home/ekzorchik/.ssh/id_rsa

#порой переданная строка с консоли ни с первого раза отрабатывает, значит нужно увеличить таймаут:

timeout=20

#deprecation_warnings = True

deprecation_warnings=False

После не забываем сохранить внесенные изменения.

Шаг №7: Создаю дефолтную копию инвентаризованного файла hosts:

Синтаксис хостов внутри файла hosts

[group]

IP

DNS

DNS[001:006].polygon.local

DNS-[001:006].polygon.local

ekzorchik@srv-us2004b:~$ sudo mv /etc/ansible/hosts /etc/ansible/hosts.default

Шаг №8: Создаю группу хостов в файле hosts:

ekzorchik@srv-us2004b:~$ sudo nano /etc/ansible/hosts

[bionic]

172.33.33.133

172.33.33.128

Шаг №9: Пробую взаимодействовать через Ansible с удаленными хостами:

ekzorchik@srv-us2004b:~$ sudo ansible bionic -m shell -a 'uname -a'

[DEPRECATION WARNING]: Distribution Ubuntu 18.04 on host 172.33.33.128 should

use /usr/bin/python3, but is using /usr/bin/python for backward compatibility

with prior Ansible releases. A future Ansible release will default to using the

discovered platform python for this host. See

https://docs.ansible.com/ansible-

core/2.11/reference_appendices/interpreter_discovery.html for more information.

This feature will be removed in version 2.12. Deprecation warnings can be

disabled by setting deprecation_warnings=False in ansible.cfg.

172.33.33.128 | CHANGED | rc=0 >>

Linux srv-bionic 4.15.0-136-generic #140-Ubuntu SMP Thu Jan 28 05:20:47 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

[DEPRECATION WARNING]: Distribution Ubuntu 18.04 on host 172.33.33.133 should

use /usr/bin/python3, but is using /usr/bin/python for backward compatibility

with prior Ansible releases. A future Ansible release will default to using the

discovered platform python for this host. See

https://docs.ansible.com/ansible-

core/2.11/reference_appendices/interpreter_discovery.html for more information.

This feature will be removed in version 2.12. Deprecation warnings can be

disabled by setting deprecation_warnings=False in ansible.cfg.

172.33.33.133 | CHANGED | rc=0 >>

Linux srv-bionic 4.15.0-128-generic #131-Ubuntu SMP Wed Dec 9 06:57:35 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

ekzorchik@srv-us2004b:~$

Если Ваш собственный файл с хостами находится в другом месте то чтобы выполнить по нему действия следует задействовать ключ «-i»:

ansible -i ~/hosts -m ping all

где ключ

  • -m → использовать модуль
  •  -a ‘uptime’ → передать параметр к задействованному модулю

Или можно указать конкретный хост, а не применять запрос ко всей группе хостов обозначенных в квадратных скобках:

ekzorchik@srv-us2004b:~$ sudo ansible 172.33.33.133 -m shell -a 'uname -a'

172.33.33.133 | CHANGED | rc=0 >>

Linux srv-bionic 4.15.0-128-generic #131-Ubuntu SMP Wed Dec 9 06:57:35 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

На заметку: Дабы при выполнении через ansible не было диагностических сообщений на консоль уже после того как все отлажено и работает, можно добавить параметр:

ekzorchik@srv-us2004b:~$ sudo nano /etc/ansible/ansible.cfg

#deprecation_warnings = True

deprecation_warnings=False

После не забываем сохранить внесенные изменения.

Отлично, подключение успешно через публичный ключ прошло.

Шаг №10: Чтобы обновить обслуживаемые системы до последнего состояния в рамках текущего релиза, для этого использую модуль raw:

ekzorchik@srv-us2004b:~$ sudo ansible bionic -m shell -a 'sudo rm -rf /var/lib/apt/lists && sudo apt-get update && sudo apt-get autoremove -y && sudo apt-get clean && sudo apt-get upgrade -y'

ekzorchik@srv-us2004b:~$ sudo ansible bionic -m shell -a 'uname -a'

172.33.33.128 | CHANGED | rc=0 >>

Linux srv-bionic 4.15.0-136-generic #140-Ubuntu SMP Thu Jan 28 05:20:47 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

172.33.33.133 | CHANGED | rc=0 >>

Linux srv-bionic 4.15.0-128-generic #131-Ubuntu SMP Wed Dec 9 06:57:35 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

ekzorchik@srv-us2004b:~$

ekzorchik@srv-us2004b:~$ sudo ansible bionic -m shell -a 'lsb_release -a'

172.33.33.133 | CHANGED | rc=0 >>

Distributor ID: Ubuntu

Description:    Ubuntu 18.04.6 LTS

Release:        18.04

Codename:       bionicNo LSB modules are available.

172.33.33.128 | CHANGED | rc=0 >>

Distributor ID: Ubuntu

Description:    Ubuntu 18.04.6 LTS

Release:        18.04

Codename:       bionicNo LSB modules are available.

ekzorchik@srv-us2004b:~$

Странно почему версия ядра разная, 128 и 136, разбираю как сделать одинаковыми или более новыми:

ekzorchik@srv-us2004b:~$ sudo ansible bionic -m shell -a 'sudo apt-get install -y linux-generic linux-headers-generic linux-image-generic'

ekzorchik@srv-us2004b:~$ sudo ansible bionic -m shell -a 'sudo shutdown -r'

172.33.33.133 | CHANGED | rc=0 >>

Shutdown scheduled for Fri 2021-11-26 12:32:37 MSK, use 'shutdown -c' to cancel.

172.33.33.128 | CHANGED | rc=0 >>

Shutdown scheduled for Fri 2021-11-26 12:32:36 MSK, use 'shutdown -c' to cancel.

ekzorchik@srv-us2004b:~$

ekzorchik@srv-us2004b:~$ sudo ansible bionic -m shell -a 'uname -a'

172.33.33.133 | CHANGED | rc=0 >>

Linux srv-bionic 4.15.0-162-generic #170-Ubuntu SMP Mon Oct 18 11:38:05 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

172.33.33.128 | CHANGED | rc=0 >>

Linux srv-bionic 4.15.0-162-generic #170-Ubuntu SMP Mon Oct 18 11:38:05 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

Отлично, что мне и требовалось. А требовалось, как через Ubuntu 20.04 с помощью Ansible взаимодействовать с удаленными узлами. Я понимаю, что выше написанное это малая часть, но начинать же нужно с чего-то, а после если требует задача усложнять взаимодействие.

Итого, на этом пока все, с уважением автор блога Олло Александр aka ekzorchik.