🐹 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. Оригиналы источников информации.
На чем было опробовано:
- 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.
Проверим синтаксис плейбука 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
Этот плейбук выполнит следующее:
- Перезагрузит узел.
- Подождет 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. Оригиналы источников информации.
- 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».
- sprosi.pro «Как запустить несколько playbooks в соответствии с Ansible?».