🐹 Ansible: Часть 4. Практические примеры плейбуков.

Содержание:

1. Введение.
2. Схема учебного стенда.
3. Подготовка сервера Ansible.

3.1. Отключение SELinux.
3.2. Обновление системы.
3.3. Установка Ansible.
3.4. Создание файла инвентаря.
3.5. Генерация ключей пользователя root.
3.6. Проброс root-ключей на узлы.
3.7. Проверка связи с узлами.
3.8. Настройка входа Ansible на самого себя.

4. Выполнение учебных задач на узлах.

4.1. Отключение SELinux и перезагрузка узлов.
4.2. Обновление операционных систем на узлах.
4.3. Установка группы полезных программ.
4.4. Настройка межсетевого экрана.
4.5. Установка web-сервера Nginx и тестирование отдачи тестовой страницы.
4.6. Добавить пользователей с sudo.
4.7. Удаление учетных записей пользователей.
4.8. Запуск консольных команд.
4.9. Объединение плейбуков в Основную книгу. 

5. Прочие операции с плейбуками.

5.1. Проверка синтаксиса плейбука.
5.2. Просмотр задач плейбука
5.3. Просмотр списка хостов плейбука.

6. Оригиналы источников информации.


На чем было опробовано:

  1. Ansible 2.9.18
  2. Hyper-V на Windows 10 Pro.
  3. Сервер Ansible: CentOS Linux release 7.9.2009 (Core).
  4. Node 1: CentOS Linux release 7.9.2009 (Core).
  5. Node 2: CentOS Linux release 7.9.2009 (Core).
  6. Node 3: CentOS Linux release 7.9.2009 (Core).

1. Введение.

Для тех, кто решит изучать Ansible, данный раздел будет крайне полезен. В данном разделе соберу некоторые полезные примеры из повседневной практики, чтобы вы могли понять как работает Ansible и научиться его использовать самостоятельно.

Официальную документацию с официальными примерами всегда можно почитать на сайте разработчиков Ansible.

Ссылка: docs.ansible.com.
Раздел: «Intro to playbooks».

Как установить и первоначально настроить Ansible описано здесь:

Ссылка: «Ansible: Часть 1. Описание, установка и первоначальная настройка.»

Так как простые задачи для Ansible реально простые, в буквальном смысле слова, то я принял решение вынести их в отдельную инструкцию:

Ссылка: «Ansible: Часть 2. Примеры простых задач.»

Рассмотрим структуру и правила написания таких сценариев более подробно.

Ссылка: «Ansible: Часть 3. Сценарии (плейбуки) — Playbooks.»

Как настраивать защищенные плейбуки описано в этом разделе.

Ссылка: «Ansible: Часть 5. Настройка защищенных плейбуков.»

2. Схема учебного стенда.

Пускай у нас будет вот такой стенд из 4х виртуальных машин под управлением CentOS 7:

Все сервера, в данном примере, имеют одинаковую операционную систему CentOS Linux release 7.9.2009 (Core), одинаковых пользователей root и одинаковые пароли на учетных записях root.

Задачи: для всех узлов.

  • отключить SELinux и перезагрузить узлы;
  • обновить операционную систему;
  • установить на всех узлах группу полезных программ Midnight Commander, wget, tar;
  • настроить межсетевой экран узлов на разрешение соединяться с 80 и 443 портами;
  • установить web-сервер Nginx и протестировать отдачу тестовой страницы, пробросить готовую композицию HTML5 на узлы;
  • добавить пользователей myrzik и barsik и настроить режим sudo для них;
  • удалить пользователей myrzik и barsik;
  • выполнить некоторые произвольные команды для консоли на всех узлах дистанционно.

Протестировать:

  • зайти на виртуальные машины под условными пользователями и переключиться в root;
  • зайти на каждую виртуальную машину по http и увидеть заставку Nginx.

Условие: удалённые виртуальные машины можно настраивать только системой Ansible.

3. Подготовка сервера Ansible.

Первым делом отключим на Ansible Server систему SELinux. Рамках учебного стенда она нам не нужна.

Когда вы устанавливаете CentOS 7, функция SELinux включена по умолчанию, из-за этого некоторые приложения в вашей системе могут фактически не поддерживать этот механизм безопасности. Чтобы такие приложения функционировали нормально, вам необходимо отключить SELinux.

Ссылка: «CentOS 7: Как временно или навсегда отключить SELinux».

3.1. Отключение SELinux.

Конечно в интернете имеется много способов настройки и эксплуатации этой системы, но в данной инструкции я, пока что, настраивать SELinux не буду.

Пожалуй, это самый суровый способ, но тоже работает.

Вводим команду:

# yum -y remove selinux*

Перезапустим Ansible Server:

# shutdown -r now

3.2. Обновление системы.

Обновим полностью операционную систему сервера Ansible:

# yum -y update && yum -y upgrade

3.3. Установка Ansible.

По умолчанию Ansible нет в репозитории CentOS 7.

Подключим дополнительный репозиторий EPEL:

# yum -y install epel-release

После устанавливаем сам сервер управления Ansible:

# yum -y install ansible

Проверка версии установленной версии Ansible:

# rpm -qa | grep ansible

Ответ:

или вот так:

# ansible --version

Ответ:

Отлично! Теперь у нас есть сервер Ansible.

3.4. Создание файла инвентаря.

Установим файловый менеджер и текстовый редактор в одном лице — Midnight Commander:

# yum -y install mc

Файл инвентаря по умолчанию обычно находится в /etc/ansible/hosts, но вы можете использовать опцию -i для указания пользовательских файлов при запуске команд и плейбуков Ansible.

Это удобный способ настройки индивидуального инвентаря для каждого проекта, который можно включить в системы контроля версий, такие как Git.

Создадим свой файл нашего инвентаря:

# cd ~

# mkdir -p ~/ansible-inventory

# cd ~/ansible-inventory

# touch my-test-servers.inventory

Откроем наш файл инвентаря:

# mcedit /root/ansible-inventory/my-test-servers.inventory

Создадим такой файл inventory вот с таким наполнением:

[test_servers]
server1 ansible_ssh_host=192.168.0.39 ansible_ssh_user=root
server2 ansible_ssh_host=192.168.0.30 ansible_ssh_user=root
server3 ansible_ssh_host=192.168.0.31 ansible_ssh_user=root

где

  • test_servers — это группа серверов, в которую добавлены три сервера с IP-адресами 192.168.0.30, 192.168.0.31 и 192.168.0.39;
  • server 1-3 — это индивидуальные алиасы каждого из серверов группы test_servers в списке инвентаря;
  • ansible_ssh_host — это специальная переменная, которая содержит IP-адрес узла, к которому будет создаваться соединение;
  • ansible_ssh_user — это еще одна специальная переменная которая говорит Ansible‘у подключаться под указанным аккаунтом, то есть пользователем. По умолчанию Ansible использует ваш текущий аккаунт пользователя, или другое значение по умолчанию, указанное в ~/.ansible.cfg (remote_user).

3.5. Генерация ключей пользователя root.

Создаём пару RSA-ключей для пользователя root на Ansible сервере:

# ssh-keygen

На все вопросы жмём Enter. Нам не нужны никакие пароли на ключи и генерируем ключи мы в каталог по умолчанию.

Ответ:

3.6. Проброс root-ключей на узлы.

Копируем открытые ключи пользователя root на узлы, которыми планируем управлять с помощью Ansible.

Выполним команду автоматической установки публичного ключа пользователя root на все узлы с авторизацией по паролю, до которых может дотянутся Ansible по списку инвентаря my-test-servers.inventory.

# ansible all -m authorized_key -a "user=root key='{{ lookup('file', '/root/.ssh/id_rsa.pub') }}' path=/root/.ssh/authorized_keys manage_dir=no" --ask-pass -i /root/ansible-inventory/my-test-servers.inventory

Ответ: длинный список изменений на каждом узле.

Конечно можно было и вручную всё распространить, у нас узлов 3 штуки, а представьте, если их было бы 10-20 штук:

# ssh-copy-id root@192.168.0.39
# ssh-copy-id root@192.168.0.30
# ssh-copy-id root@192.168.0.31

Ответы:

3.7. Проверка связи с узлами.

Чтобы убедиться, что Ansible может подключаться к узлам и запускать команды и плейбуки, вы можете использовать следующую команду:

# ansible -m ping test_servers -i /root/ansible-inventory/my-test-servers.inventory

Модуль ping проверит, есть ли у вас валидные учетные данные для подключения к нодам, определенным в файле инвентаря, и может ли Ansible запускать сценарии Python на удаленном сервере от имени root пользователя.

Ответ pong означает, что Ansible готов запускать команды и плейбуки на этом узле.

Ответ:

Выполним простую команду 'uptime' для проверки возможности управления узлами:

# ansible -a 'uptime' test_servers -i /root/ansible-inventory/my-test-servers.inventory

Ответ:

3.8. Настройка входа Ansible на самого себя.

Также настроим вход по ключу Ansible Server на самого себя:

# cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys

Проверяем:

# cat /root/.ssh/authorized_keys

Ответ:

К началу работы с Ansible учебный комплекс готов!

4. Выполнение учебных задач на узлах.

Внимание! Почти все типовые действия, которые вам потребуются для работы с Ansible, имеются на официальном сайте с технической документацией по этой системе. Не тратьте на поиски в интернете готовых решений, сразу открывайте официальное руководство пользователя Ansible и ищите там.

Ссылка: docs.ansible.com.

4.1. Отключение SELinux и перезагрузка узлов.

Когда вы устанавливаете CentOS 7, функция SELinux включена по умолчанию, из-за этого некоторые приложения в вашей системе могут фактически не поддерживать этот механизм безопасности. Чтобы такие приложения функционировали нормально, вам необходимо отключить SELinux. Рамках учебного стенда она нам не нужна.

Ссылка: «CentOS 7: Как временно или навсегда отключить SELinux».

Посмотрим и убедимся, что на всех узлах, стоит SELinux:

# ansible -m shell -a 'rpm -qa | grep selinux' test_servers -i /root/ansible-inventory/my-test-servers.inventory

Ответ:

Как видно SELinux присутствует в установленном состоянии на всех узлах. Выполним дезактивацию SELinux с помощью Ansible, без удаления SELinux с узлов.

Воспользуемся готовым решением selinux от создателей Ansible по дезактивации SELinux на узлах.

Ссылка: docs.ansible.com.

Раздел: «selinux — Change policy and state of SELinux».

Создадим плейбук для дезактивации SELinux на узлах с помощью Ansible Server:

# mcedit /root/ansible-playbooks/01-pb-selinux-disable.yml

Записываем в него содержимое:

---
- name: Операции с SELinux
  hosts: test_servers
  become_method: sudo
  become_user: root

  tasks:
  - name: Отключаем SELinux
    selinux:
      state: disabled

Скачать: 01-pb-selinux-disable.yml.

Проверим синтаксис плейбука 01-pb-selinux-disable.yml специальной утилитой --syntax-check от Ansible:

# ansible-playbook /root/ansible-playbooks/01-pb-selinux-disable.yml --syntax-check

Ответ:

Проверка синтаксиса пройдена.

Примечание! Я заранее проверил состояние SELinux на узлах. Он активен и работает.

# sestatus

Ответ:

Применим плейбук на узлы и посмотрим что будет с SELinux:

# ansible-playbook /root/ansible-playbooks/01-pb-selinux-disable.yml -i /root/ansible-inventory/my-test-servers.inventory

Ответ:

Чтобы завершить дезактивацию SELinux, требуется перезагрузить узлы. Перезагрузка узла с помощью Ansible не сложная задача.

Предполагаются следующие шаги:

  • SSH подключение на узел.
  • Перезагрузите узел.
  • Отключитесь, прежде чем узел закроет ваше ssh-соединение.
  • Подождите некоторое количество секунд, чтобы убедиться, что узел действительно выключен.
  • Попробуйте подключиться по ssh к узлу и выполнить команду.
  • Повторите попытку ssh, пока она не сработает.

В Ansible версии 2.7 или выше. 2.7 ввели модуль перезагрузки – reboot, и теперь все, что вам нужно сделать, это добавить это в свой плейбук:

---
- name: Перезагрузка серверов
  hosts: test_servers
  become_method: sudo
  become_user: root

  tasks:
  - name: Перезагрузка хостов и ожидание их перезагрузки
    reboot:
      msg: "Reboot initiated by Ansible"
      connect_timeout: 5
      reboot_timeout: 600
      pre_reboot_delay: 0
      post_reboot_delay: 30
      test_command: whoami

Скачать: 02-pb-reboot.yml.

Этот плейбук выполнит следующее:

  • Перезагрузит узел.
  • Подождет 30 секунд.
  • Попытается подключиться через SSH и запустить whoami.
  • Отключится через 5 секунд, если не сработает ssh.
  • Будет продолжать пытаться подключиться в течение 10 минут (600 секунд)

Применим плейбук:

# ansible-playbook /root/ansible-playbooks/02-pb-reboot.yml -i /root/ansible-inventory/my-test-servers.inventory

Ответ:

Примечание! После перезагрузки узлов я проверил состояние SELinux на узлах:

# sestatus

Ответ:

Как видно SELinux отключен на всех узлах дистанционно с помощью Ansible.

Примечание! В любой команде Ansible, которая требует перезагрузки после изменения узел будет перезагружен, когда playbook завершится, а затем Ansible будет ждать, пока узел не станет доступным, и ssh будет работать, прежде чем перейти к следующему плейбуку.

Добавьте директиву:

notify: Reboot host and wait for it to restart

Ссылка: docs.ansible.com.

Раздел: «Execute Ansible ‘actions’».

Примечание! Если вам нужно перезагрузиться на полпути через playbook вы можете заставить все задачи выполниться с помощью команды:

- name: Reboot if necessary
  meta: flush_handlers

Иногда это можно сделать, чтобы что-то изменить, заставить сервер перезагрузиться, а затем проверить, что изменения вступили в силу и все в том же playbook.

4.2. Обновление операционных систем на узлах.

Перед выполнением других учебных задач, обновим операционные системы на узловых серверах с помощью Ansible.

Воспользуемся готовым решением ansible.builtin.yum от создателей Ansible по обновлению программного обеспечения на узлах.

Ссылка: docs.ansible.com.
Раздел: «Manages packages with the yum package manager».

Создаем файл плейбука:

# mcedit /root/ansible-playbooks/03-pb-upgrade-all-packages.yml

Записываем в него содержимое:

---
- name: Обновление всех пакетов на узлах
  hosts: test_servers
  become_method: sudo
  become_user: root

  tasks:
  - name: Обновить все пакеты
    yum:
      name: '*'
      state: latest

Скачать: 03-pb-upgrade-all-packages.yml.

Проверим синтаксис плейбука 03-pb-upgrade-all-packages.yml специальной утилитой --syntax-check от Ansible:

# ansible-playbook /root/ansible-playbooks/03-pb-upgrade-all-packages.yml --syntax-check

Ответ:

Проверка синтаксиса пройдена.

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

# ansible-playbook /root/ansible-playbooks/03-pb-upgrade-all-packages.yml -i /root/ansible-inventory/my-test-servers.inventory

Долго-долго ждём, особенно если это самое первое обновление после установки узловых систем и они ни разу еще не обновлялись до этого.

После некоторого всплеска активности CPU на узлах Ansible всё завершилось.

Ответ:

Все пакеты на узлах успешно обновлены до последнего актуального состояния из доступных узлам репозиториев.

4.3. Установка группы полезных программ.

Про учебному сценарию требуется установить пакет программного обеспечения, который состоит из традиционного набора программ для многих серверов: mc, wget, tar.

Снова воспользуемся готовым решением ansible.builtin.yum от создателей Ansible по установке программного обеспечения mc, wget, tar на узлах.

Ссылка: docs.ansible.com.
Раздел: «Manages packages with the yum package manager».

Создаем файл плейбука:

# mcedit /root/ansible-playbooks/04-pb-progs-install.yml

Записываем в него содержимое:

---
- name: Установка полезных программ на всех узлах
  hosts: test_servers
  become_method: sudo
  become_user: root

  tasks:
  - name: Установить группу программ
    yum:
      name: "{{ package }}"
    vars:
      package:
      - mc
      - wget
      - tar
      state: latest

Скачать: 04-pb-progs-install.yml.

Проверим синтаксис плейбука 04-pb-progs-install.yml специальной утилитой --syntax-check от Ansible:

# ansible-playbook /root/ansible-playbooks/04-pb-progs-install.yml --syntax-check

Ответ:

Проверка синтаксиса пройдена.

Применим плейбук на узлы и посмотрим как установится группа программного обеспечения:

# ansible-playbook /root/ansible-playbooks/04-pb-progs-install.yml -i /root/ansible-inventory/my-test-servers.inventory

Некоторое время ждём.

Ответ:

Все пакеты на узлах успешно установлены программы mc, wget, tar из доступных узлам репозиториев.

4.4. Настройка межсетевого экрана.

Для успешной и безопасной работы любого сервера первым делом требуется настраивать его сетевую безопасность. Настроим разрешение обращаться к узлам по 80 порту и 443 порту.

Воспользуемся готовым решением ansible.posix.firewalld от создателей Ansible по настройке межсетевого экрана firewalld на узлах.

Ссылка: docs.ansible.com.
Раздел: «ansible.posix.firewalld – Manage arbitrary ports/services with firewalld».

Отдельно установим модуль ansible.posix.firewalld на Ansible сервер:

# ansible-galaxy collection install ansible.posix

Ответ:

Ansible поменяет настройки в файлах конфигурации firewalld. Для того, чтобы новые настройки были задействованы, требуется перезапустить firewalld на узлах.

В этом перезапуске службы межсетевого экрана нам поможет модуль ansible.builtin.service от создателей Ansible.

Ссылка: docs.ansible.com.
Раздел: «ansible.builtin.service – Manage services».

Создаем файл плейбука:

# mcedit /root/ansible-playbooks/05-pb-http-https.yml

Записываем в него содержимое:

--
- name: Разрешение 80 и 443 порта - firewalld
  hosts: test_servers
  become_method: sudo
  become_user: root

  tasks:
  - name: Разрешим 80 порт
    ansible.posix.firewalld:
      service: http
      permanent: yes
      state: enabled
  - name: Разрешим 443 порт
    ansible.posix.firewalld:
      service: https
      permanent: yes
      state: enabled
  - name: Перезапустим service firewalld на всех узлах
    ansible.builtin.service:
      name: firewalld
      state: restarted

Скачать: 05-pb-http-https.yml.

Проверим синтаксис плейбука 05-pb-http-https.yml специальной утилитой --syntax-check от Ansible:

# ansible-playbook /root/ansible-playbooks/05-pb-http-https.yml --syntax-check

Ответ:

Проверка синтаксиса пройдена.

Примечание! Перед запуском плейбука проверим состояние межсетевого экрана на любом из узле.

# firewall-cmd --list-all

Ответ:

Как видно — порты 80 и 443 закрыты, то есть отсутствуют с списке разрешенных.

Применим плейбук на узлы разрешим узлам соединения по 80 и 443 порту:

# ansible-playbook /root/ansible-playbooks/05-pb-http-https.yml -i /root/ansible-inventory/my-test-servers.inventory

Некоторое время ждём.

Ответ:

Примечание! Проверим состояние межсетевого экрана на любом из узле.

# firewall-cmd --list-all

Ответ:

Как видно — порты 80 и 443 открыты, то есть отсутствуют с списке разрешенных.

Все узлы успешно получили разрешение на использование 80 и 443 порта.

4.5. Установка web-сервера Nginx и тестирование отдачи тестовой страницы.

Для тестовых узлов я выбрал Nginx в качестве учебного web-сервера. Его и установим.

Снова воспользуемся готовым решением ansible.builtin.yum от создателей Ansible по установке web-сервера Nginx на узлах.

Ссылка: docs.ansible.com.
Раздел: «Manages packages with the yum package manager».

Создаем файл плейбука:

# mcedit /root/ansible-playbooks/06-pb-nginx-install.yml

Записываем в него содержимое:

--
- name: Установка web-сервера Nginx на всех узлах
  hosts: test_servers
  become_method: sudo
  become_user: root

  tasks:
  - name: Создаем файл nginx.repo оригинального репозитория Nginx на узлах
    copy:
      content: "[nginx-mainline]\nname=nginx mainline repo\nbaseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/\ngpgcheck=1\nenabled=1\ngpgkey=https://nginx.org/keys/nginx_signing.key\n
      dest: "/etc/yum.repos.d/nginx.repo"
      backup: yes
      owner: root
      group: root
      mode: 0644
  - name: Установим Nginx на узлы
    yum:
      name: nginx
      state: latest
  - name: Запустим Nginx на узлах
    ansible.builtin.service:
      name: nginx
      state: started

Скачать: 06-pb-nginx-install.yml.

Проверим синтаксис плейбука 06-pb-nginx-install.yml специальной утилитой --syntax-check от Ansible:

# ansible-playbook /root/ansible-playbooks/06-pb-nginx-install.yml --syntax-check

Ответ:

Проверка синтаксиса пройдена.

Применим плейбук на узлы и посмотрим как установится web-сервера Nginx на узлах:

# ansible-playbook /root/ansible-playbooks/06-pb-nginx-install.yml -i /root/ansible-inventory/my-test-servers.inventory

Некоторое время ждём.

Ответ:

Проверим доступность демонстрационной страницы HTML web-сервера на узлах Ansible.

Наберем в браузере адрес какого-нибудь узла:

# http://192.168.0.30

Ответ на всех узлах будет одинаковый:

Web-сервер Nginx развернут. Можете использовать его в своих целях.

Что еще интересного можно сделать:

  • поменять на готовую страничку приветствия, через проброс файла;
  • написать свою страничку на HTML5 и подбросить её в виде текстовой строки через плейбук;
  • восстановить копию баз данных, подкинуть файлы хостинга и конфигурации Nginx;
  • и так далее.

Если вам не нравится данная стандартная скучная картинка, то ее всегда можно разнообразить красивой заглушкой на HTML5.

Вот описание замысла: инструкция «Nginx: Модификация базовой страницы приветствия. Заглушка на HTML5». Реализуем это.

По умолчанию index.html — заставка Nginx, хранится в каталоге /usr/share/nginx/html на узлах, значит, если её принудительно заменить на что-то другое, то Nginx это будет добросовестно показывать.

В копировании содержимого Ansible каталога в другой каталог узлов, поможет модуль ansible.builtin.copy.

Ссылка: docs.ansible.com.
Раздел: «Copy files to remote locations».

Создадим каталог /root/ansible-files/nginx/ntml5/zastavka для хранения содержимого заглушки на HTML5.

# mkdir -p /root/ansible-files/nginx/html5/zastavka

Заранее скачайте заставку на HTML5 и распакуйте её в каталог /root/ansible-files/nginx/ntml5/zastavka. Будем копировать содержимое этого каталога на узлы Ansible.

Создаем файл плейбука:

# mcedit /root/ansible-playbooks/07-pb-nginx-html5.yml

Записываем в него содержимое:

--
- name: Копирование каталогов Ansible в каталог узлов
  hosts: test_servers
  become_method: sudo
  become_user: root

  tasks:
# Копируйте дважды, так как иногда файлы пропускаются (в основном только один файл пропускается из папки, если папка не существует).
  - name: Копирование из каталога в каталог
    copy:
      src: "/root/ansible-files/nginx/html5/zastavka/"
      dest: "/usr/share/nginx/html/"
      owner: root
      group: root
      mode: 0644
      backup: yes
    ignore_errors: true

Скачать: 07-pb-nginx-html5.yml.

Примечание: Если вы передаете несколько путей с помощью переменной, тогда:

src: "/ корень / {{элемент}}"

Примечание: Если вы передаете путь, используя переменную для разных элементов, тогда:

src: "/ root / {{item.source_path}}"

Проверим синтаксис плейбука 07-pb-nginx-html5.yml специальной утилитой --syntax-check от Ansible:

# ansible-playbook /root/ansible-playbooks/07-pb-nginx-html5.yml --syntax-check

Ответ:

Проверка синтаксиса пройдена.

Применим плейбук на узлы и посмотрим как измениться страница приветствия web-сервера Nginx на узлах:

# ansible-playbook /root/ansible-playbooks/07-pb-nginx-html5.yml -i /root/ansible-inventory/my-test-servers.inventory

Некоторое время ждём.

Ответ:

Проверим доступность новой демонстрационной страницы HTML web-сервера на узлах Ansible.

Наберем в браузере адрес какого-нибудь узла:

# http://192.168.0.39

Ответ на всех узлах одинаковый:

Web-сервер получил новую заглушку HTML5 и Nginx поменял страничку приветствия, которая была по умолчанию.

4.6. Добавить пользователей с sudo.

Для обслуживания тестовых серверов создадим пару учетных записей для самых трудолюбивых сотрудников, которые будут работать не покладая лапок. Учетный записи для пользователей: Мурзик и Барсик.

Создадим на самом сервере Ansible двух пользователей: myrzik и barsik. Генерируем для них ключи. Можно и готовые ключи использовать для установки на узлах, но у меня их нет. Барсик с Мурзиком не прислали ключи.

Создание:

# adduser myrzik
# adduser barsik

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

# passwd myrzik
# passwd barsik

Генерируем для них ключи:

# su myrzik
# ssh-keygen

На все вопросы для myrzik просто жмём Enter.

# su barsik
# ssh-keygen

На все вопросы для barsik просто жмём Enter.

Теперь у нас на сервере Ansible появилось две учетные записи для наших пушистых коллег.

Добавим на узлы с помощью Ansible учетные записи пользователей myrzik и barsik вход по ключам, а так же режим sudo без пароля для них.

В работе Ansible с учетными записями пользователей поможет модуль ansible.builtin.user.

Ссылка: docs.ansible.com.
Раздел: «Manage user accounts».

Создаем файл плейбука:

# mcedit /root/ansible-playbooks/08-pb-sudo-users.yml

Записываем в него содержимое:

--
- name: Дистанционно добавление произвольных учетных записей с Ansible на узлы
  hosts: test_servers
  become_method: sudo
  become_user: root

  tasks:
  - name: Убедимся, что у нас на узлах есть группа "wheel"
    group:
      name: wheel
      state: present

  - name: Разрешим пользователям группы "wheel" иметь sudo без пароля
    lineinfile:
      dest: /etc/sudoers
      state: present
      regexp: '^%wheel'
      line: '%wheel ALL=(ALL) NOPASSWD: ALL'
      validate: visudo -cf %s

  - name: Создадим пользователя myrzik и поместим его в группу "wheel"
    ansible.builtin.user:
      name: myrzik
      comment: Cat Myrzik
      group: wheel

  - name: Пробросим публичный ключ пользователя myrzik с Ansible
    authorized_key:
      user: myrzik
      state: present
      key: "{{ lookup('file', '/home/myrzik/.ssh/id_rsa.pub') }}"
      path: /home/myrzik/.ssh/authorized_keys

  - name: Создадим пользователя barsik и поместим его в группу "wheel"
    ansible.builtin.user:
      name: barsik
      comment: Cat Barsik
      group: wheel

  - name: Пробросим публичный ключ пользователя barsik с Ansible
    authorized_key:
      user: barsik
      state: present
      key: "{{ lookup('file', '/home/barsik/.ssh/id_rsa.pub') }}"
      path: /home/barsik/.ssh/authorized_keys

Скачать: 08-pb-sudo-users.yml.

Проверим синтаксис плейбука 08-pb-sudo-users.yml специальной утилитой --syntax-check от Ansible:

# ansible-playbook /root/ansible-playbooks/08-pb-sudo-users.yml --syntax-check

Ответ:

Проверка синтаксиса пройдена.

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

# ansible-playbook /root/ansible-playbooks/08-pb-sudo-users.yml -i /root/ansible-inventory/my-test-servers.inventory

Ответ:

На все узлы были добавлены учетные записи myrzik и barsik с входом по ключу и sudo возможностями.

Прогуляемся самостоятельно учетной записью myrzik по узлам, потому что у него лапки, и проверим доступ к sudo.

# su myrzik

# ssh myrzik@192.168.0.39

# sudo su

Мы стали root.

Вернёмся обратно на Ansible сервер:

# exit

# exit

# exit

Ответы:

Для учетной записи barsik аналогично, у него тоже лапки:

Всё работает исправно!

4.7. Удаление учетных записей пользователей.

Так как пользователи Мурзик и Барсик, начали хулиганить на узлах и ронять сервера своими лапками, срочно удалим их учетные записи со всех узлов!

Для удаления учетных записей воспользуемся готовым решением ansible.builtin.user от создателей Ansible.

Ссылка: docs.ansible.com.
Раздел: «Manage user accounts».

Создаем файл плейбука:

# mcedit /root/ansible-playbooks/09-pb-users-del.yml

Записываем в него содержимое:

---
- name: Дистанционно удалим произвольные учетные записи на всех узлах
  hosts: test_servers
  become_method: sudo
  become_user: root

  tasks:
  - name: Удалим учетную запись myrzik на узлах
    ansible.builtin.user:
      name: myrzik
      state: absent
      remove: yes

  - name: Удалим учетную запись barsik на узлах
    ansible.builtin.user:
      name: barsik
      state: absent
      remove: yes

Скачать: 09-pb-users-del.yml .

Проверим синтаксис плейбука 09-pb-users-del.yml специальной утилитой --syntax-check от Ansible:

# ansible-playbook /root/ansible-playbooks/09-pb-users-del.yml --syntax-check

Ответ:

Проверка синтаксиса пройдена.

Применим плейбук на узлы и посмотрим как удалятся учетные записи:

# ansible-playbook /root/ansible-playbooks/09-pb-users-del.yml -i /root/ansible-inventory/my-test-servers.inventory

Некоторое время ждём.

Ответ:

Указанные в плейбуке учетные на узлах Ansible удалены.

4.8. Запуск консольных команд.

Иногда на узлах требуется запускать простые банальные консольные команды.

Воспользуемся модулем ansible.builtin.shell от создателей Ansible.

Ссылка: docs.ansible.com.
Раздел: «Execute shell commands on targets».

Создаем файл плейбука:

# mcedit /root/ansible-playbooks/10-pb-shell.yml

Записываем в него содержимое:

---
- name: Запустим с помощью Ansible команду для командной строки на узлах
  hosts: test_servers
  become_method: sudo
  become_user: root

  tasks:
  - name: Запустим дистанционно запись генерированной строки в файл
    ansible.builtin.shell: openssl rand -base64 32 >> somefile.txt
    args:
      chdir: /root
      creates: somefile.txt
  - name: Скопируем полученный файл внутри каталога
    ansible.builtin.shell: cp /root/somefile.txt /root/somefile2.txt

Скачать: 10-pb-shell.yml с моего сайта.

Проверим синтаксис плейбука 10-pb-shell.yml специальной утилитой --syntax-check от Ansible:

# ansible-playbook /root/ansible-playbooks/10-pb-shell.yml --syntax-check

Ответ:

Применим плейбук на узлы и посмотрим как удалятся учетные записи:

# ansible-playbook /root/ansible-playbooks/10-pb-shell.yml -i /root/ansible-inventory/my-test-servers.inventory

Некоторое время ждём.

Ответ:

Команда для командной строки на узлах Ansible исполнена.

4.9. Объединение плейбуков в Основную книгу. 

Если ваши плейбуки должны работать в определённом порядке и если все они являются обязательными, то создайте Основную книгу и включите файлы с задачами с помощью операторов import_playbook.

Например:

---
- import_playbook: A-systemd-networkd.yml
- import_playbook: B-fail2ban-ssh.yml
- import_playbook: C-enable-watchdog.yml

Создадим Основную книгу:

# mcedit /root/ansible-playbooks/my-main-book.yml

Вот такой вот будет Основная книга нашем в учебном варианте:

---
- name: Запустим с помощью Ansible сборник плейбуков - Основная книга
  hosts: test_servers
  become_method: sudo
  become_user: root

- import_playbook: 01-pb-selinux-disable.yml
- import_playbook: 02-pb-reboot.yml
- import_playbook: 03-pb-upgrade-all-packages.yml
- import_playbook: 04-pb-progs-install.yml
- import_playbook: 05-pb-http-https.yml
- import_playbook: 06-pb-nginx-install.yml
- import_playbook: 07-pb-nginx-html5.yml
- import_playbook: 08-pb-sudo-users.yml
- import_playbook: 09-pb-users-del.yml
- import_playbook: 10-pb-shell.yml

Проверка синтаксиса плейбука:

# ansible-playbook /root/ansible-playbooks/my-main-book.yml --syntax-check

Ответ:

Применим Основную книгу на узлы и посмотрим как по экрану поползет длинная вереница событий на узлах:

# ansible-playbook /root/ansible-playbooks/my-main-book.yml -i /root/ansible-inventory/my-test-servers.inventory

Некоторое время ждём.

Ответ:

Все задачи во всех плейбуках успешно выполнены!

5. Прочие операции с плейбуками.

5.1. Проверка синтаксиса плейбука:

# ansible-playbook /root/ansible-playbooks/01-pb-selinux-disable.yml --syntax-check

Ответ:

5.2. Просмотр задач, которые будут выполнены в плейбуке:

# ansible-playbook /root/ansible-playbooks/01-pb-selinux-disable.yml --list-tasks

Ответ:

5.3. Просмотр списка узлов, на которых будет выполняться в плейбук:

# ansible-playbook /root/ansible-playbooks/01-pb-selinux-disable.yml --list-hosts

Ответ:

6. Оригиналы источников информации.

  1. kamaok.org.ua «Установка и использование Ansible на Centos7».
  2. oblako.kz «Установка Ansible на Centos 7.3».
  3. tproger.ru «Что такое Ansible и как его использовать».
  4. habr.com «Пособие по Ansible».
  5. stackru.com «Можно ли записать эти команды в Ansible Playbook?»
  6. habr.com «Заметка по ansible. Server reboot.»
  7. itisgood.ru «Перезагрузка хоста с помощью Ansible».
  8. codeby.net «Как создать новый файл config в Ansible playbook».
  9. qastack.ru «Скопируйте несколько файлов с помощью Ansible».
  10. qastack.ru «Как создать каталог с помощью Ansible».
  11. docs.ansible.com «selinux — Change policy and state of SELinux».
  12. docs.ansible.com «ansible.builtin.meta – Execute Ansible ‘actions’».
  13. docs.ansible.com «ansible.builtin.yum — Manages packages with the yum package manager».
  14. docs.ansible.com «ansible.posix.firewalld – Manage arbitrary ports/services with firewalld».
  15. docs.ansible.com «ansible.builtin.service — Manage services».
  16. docs.ansible.com «ansible.builtin.copy — Copy files to remote locations».
  17. docs.ansible.com «ansible.builtin.user — Manage user accounts».
  18. docs.ansible.com «ansible.builtin.shell – Execute shell commands on targets».
  19. sprosi.pro «Как запустить несколько playbooks в соответствии с Ansible?».