Лабораторная работа №7: Автоматизация с Playbooks
Цель работы
Section titled “Цель работы”Научиться писать полноценные playbooks (сценарии) на языке YAML для автоматизации задач, используя переменные, циклы и обработчики для установки и настройки Docker.
Основные теоретические положения
Section titled “Основные теоретические положения”1. Playbook (Плейбук)
Section titled “1. Playbook (Плейбук)”Плейбук — это YAML-файл, в котором в упорядоченном виде описан набор задач (tasks), которые нужно выполнить на определенных хостах.
- Рекомендуемая литература: Ansible Playbooks (Документация Ansible)
2. Переменные и циклы (vars и loop)
Section titled “2. Переменные и циклы (vars и loop)”- Переменные (
vars): Позволяют выносить значения (имена пакетов, пути) в отдельную секцию, делая плейбук более гибким и читаемым. - Циклы (
loop): Позволяют выполнить одну и ту же задачу несколько раз с разными параметрами. Идеально для установки списка пакетов или создания нескольких пользователей. - Рекомендуемая литература: Loops (Документация Ansible)
3. Управление сервисами (service module)
Section titled “3. Управление сервисами (service module)”Этот модуль позволяет управлять системными службами (systemd, sysvinit). Ключевые параметры:
name: Имя сервиса (например,docker).state:started(запущен),stopped(остановлен),restarted(перезапущен).enabled: yes: Добавить сервис в автозагрузку.- Рекомендуемая литература: service module (Документация Ansible)
4. Обработчики (handlers)
Section titled “4. Обработчики (handlers)”Обработчики — это специальные задачи, которые выполняются только один раз в конце плейбука и только в том случае, если какая-либо из основных задач уведомила их об изменениях с помощью директивы notify.
- Применение: Идеально для перезапуска сервиса после изменения его конфигурационного файла. Это гораздо эффективнее, чем перезапускать сервис на каждом шаге.
- Рекомендуемая литература: Handlers (Документация Ansible)
Задания для выполнения
Section titled “Задания для выполнения”-
Подготовка (10 мин):
- На
Main-serverперейдите в вашу директориюansible-project. - Важно: Подключитесь к
Web-nodeиDb-nodeи полностью удалите Docker, если он был установлен ранее, чтобы мы могли проверить работу плейбука с нуля.Terminal window sudo apt-get purge docker-ce docker-ce-cli containerd.io -ysudo rm -rf /var/lib/docker /etc/apt/keyrings/docker.gpg
- На
-
Написание плейбука (50 мин):
- В директории
ansible-projectсоздайте файлinstall_docker.yml. - Напишите плейбук, который будет устанавливать и настраивать Docker на всех хостах. Используйте переменные для списка пакетов, циклы и обработчик для перезапуска Docker.
install_docker.yml ---- hosts: allbecome: yesvars:docker_packages:- docker-ce- docker-ce-cli- containerd.io- docker-buildx-plugin- docker-compose-plugintasks:- name: Install dependenciesapt:name: ['ca-certificates', 'curl', 'gnupg']state: presentupdate_cache: yes- name: Create directory for GPG keyfile:path: /etc/apt/keyringsstate: directorymode: '0755'- name: Add Docker GPG keyshell: "curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg"args:creates: /etc/apt/keyrings/docker.gpg # Не выполнять, если файл уже есть- name: Add Docker repositoryapt_repository:repo: "deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu {{ ansible_distribution_release }} stable"state: presentfilename: dockernotify: Update apt cache # Уведомляем обработчик- name: Install Docker packages using a loopapt:name: "{{ docker_packages }}"state: present- name: Ensure Docker service is running and enabledservice:name: dockerstate: startedenabled: yes- name: Add user to docker groupuser:name: "{{ ansible_user }}"groups: dockerappend: yeshandlers:- name: Update apt cacheapt:update_cache: yes - В директории
-
Запуск и проверка (30 мин ):
- Запустите плейбук с
Main-server:Terminal window ansible-playbook -i inventory.ini install_docker.yml - Проследите за выводом. Обратите внимание, что задача
Update apt cacheиз секцииhandlersбудет вызвана только если задачаAdd Docker repositoryвнесла изменения. - Запустите плейбук второй раз. Теперь все задачи должны быть
ok(зеленые), и обработчик не будет вызван. - Подключитесь к
Web-nodeи выполнитеdocker --versionиsystemctl status docker, чтобы убедиться, что Docker не просто установлен, но и корректно работает.
- Запустите плейбук с
Контрольные вопросы
Section titled “Контрольные вопросы”- Что такое
handlerи в каком случае он выполняется? - Как с помощью Ansible установить сразу несколько пакетов, перечислив их в секции
vars? - Какая задача у модуля
serviceв этом плейбуке? - Что делает директива
notify? - Почему использование
handlersдля перезапуска сервисов или обновления кэша является лучшей практикой, чем просто добавление этих шагов вtasks?