На чем было опробовано:
- Ansible 2.9.18
- Hyper-V на Windows 10 Pro.
- Сервер Ansible: CentOS Linux release 7.9.2009 (Core).
- Node 1: CentOS Linux release 7.9.2009 (Core).
- Node 2: CentOS Linux release 7.9.2009 (Core).
- 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».
Конечно в интернете имеется много способов настройки и эксплуатации этой системы, но в данной инструкции я, пока что, настраивать SELinux не буду.
Пожалуй, это самый суровый способ, но тоже работает.
Вводим команду:
# yum -y remove selinux*
Перезапустим Ansible Server:
# shutdown -r now
Обновим полностью операционную систему сервера Ansible:
# yum -y update && yum -y upgrade
По умолчанию 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
Ответы:
Чтобы убедиться, что 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
специальной утилитой --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
.
Ссылка: docs.ansible.com.
Раздел: «ansible.builtin.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
Этот плейбук выполнит следующее:
- Перезагрузит узел.
- Подождет 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
специальной утилитой --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
специальной утилитой --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
специальной утилитой --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 порта.
Чтобы открыть какой-либо конкретный порт, сделайте по аналогии:
---
- name: Разрешение в firewalld порта 10051 для zabbix-agent на узлах
hosts:
cos7client1
cos7client2
cos7client3
cos7gla
become_method: sudo
become_user: root
tasks:
- name: Открыть порт 10051 по UDP
firewalld:
port: 10051/udp
permanent: yes
state: enabled
- name: Открыть порт 10051 по TCP
firewalld:
port: 10051/tcp
permanent: yes
state: enabled
- name: Перезапустим firewalld на всех узлах
ansible.builtin.service:
name: firewalld
state: restarted
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 reponbaseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/ngpgcheck=1nenabled=1ngpgkey=https://nginx.org/keys/nginx_signing.keynmodule_hotfixes=true"
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
специальной утилитой --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
Примечание: Если вы передаете несколько путей с помощью переменной, тогда:
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
специальной утилитой --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
специальной утилитой --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
специальной утилитой --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 исполнена.
Есть еще способы запустить консольную команду:
---
- name: Установка zabbix-agent на узлах
hosts:
cos7client1
cos7client2
cos7client3
become_method: sudo
become_user: root
tasks:
- name: Установка репозитория docker и установка docker на узлы
ansible.builtin.shell: "curl -fsSL https://get.docker.com/ | sh"
- name: Поставим в автозапуск docker на узлах
ansible.builtin.service:
name: docker
enabled: yes
- name: Запустим docker на узлах
ansible.builtin.service:
name: docker
state: started
- name: Версия docker на узлах
ansible.builtin.shell: docker info
- name: Executing a Command Using Shell Module
shell: docker info
- name: Executing a command using command module
command: docker info
Для того, что бы увидеть что выводит команда в консоль узла, введите ключ -vvv
:
# ansible-playbook /ansible/roles/docker-install.yml -i /ansible/hosts/pb-zs-stend.yaml -l cos7client1 -vvv
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. Оригиналы источников информации.
- kamaok.org.ua «Установка и использование Ansible на Centos7».
- oblako.kz «Установка Ansible на Centos 7.3».
- tproger.ru «Что такое Ansible и как его использовать».
- habr.com «Пособие по Ansible».
- stackru.com «Можно ли записать эти команды в Ansible Playbook?»
- habr.com «Заметка по ansible. Server reboot.»
- itisgood.ru «Перезагрузка хоста с помощью Ansible».
- codeby.net «Как создать новый файл config в Ansible playbook».
- qastack.ru «Скопируйте несколько файлов с помощью Ansible».
- qastack.ru «Как создать каталог с помощью Ansible».
- docs.ansible.com «selinux — Change policy and state of SELinux».
- docs.ansible.com «ansible.builtin.meta – Execute Ansible ‘actions’».
- docs.ansible.com «ansible.builtin.yum — Manages packages with the yum package manager».
- docs.ansible.com «ansible.posix.firewalld – Manage arbitrary ports/services with firewalld».
- docs.ansible.com «ansible.builtin.service — Manage services».
- docs.ansible.com «ansible.builtin.copy — Copy files to remote locations».
- docs.ansible.com «ansible.builtin.user — Manage user accounts».
- docs.ansible.com «ansible.builtin.shell – Execute shell commands on targets».
- docs.ansible.com «ansible.builtin.reboot – Reboot a machine».
- sprosi.pro «Как запустить несколько playbooks в соответствии с Ansible?»
- Источник: https://hamsterden.ru/practical-examples-of-playbooks/