Skip to content

Лабораторная работа №7: Автоматизация с Playbooks

Научиться писать полноценные playbooks (сценарии) на языке YAML для автоматизации задач, используя переменные, циклы и обработчики для установки и настройки Docker.

Основные теоретические положения

Section titled “Основные теоретические положения”

Плейбук — это YAML-файл, в котором в упорядоченном виде описан набор задач (tasks), которые нужно выполнить на определенных хостах.

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)

Обработчики — это специальные задачи, которые выполняются только один раз в конце плейбука и только в том случае, если какая-либо из основных задач уведомила их об изменениях с помощью директивы notify.

  • Применение: Идеально для перезапуска сервиса после изменения его конфигурационного файла. Это гораздо эффективнее, чем перезапускать сервис на каждом шаге.
  • Рекомендуемая литература: Handlers (Документация Ansible)

Задания для выполнения

Section titled “Задания для выполнения”
  1. Подготовка (10 мин):

    • На Main-server перейдите в вашу директорию ansible-project.
    • Важно: Подключитесь к Web-node и Db-node и полностью удалите Docker, если он был установлен ранее, чтобы мы могли проверить работу плейбука с нуля.
      Terminal window
      sudo apt-get purge docker-ce docker-ce-cli containerd.io -y
      sudo rm -rf /var/lib/docker /etc/apt/keyrings/docker.gpg
  2. Написание плейбука (50 мин):

    • В директории ansible-project создайте файл install_docker.yml.
    • Напишите плейбук, который будет устанавливать и настраивать Docker на всех хостах. Используйте переменные для списка пакетов, циклы и обработчик для перезапуска Docker.
    install_docker.yml
    ---
    - hosts: all
    become: yes
    vars:
    docker_packages:
    - docker-ce
    - docker-ce-cli
    - containerd.io
    - docker-buildx-plugin
    - docker-compose-plugin
    tasks:
    - name: Install dependencies
    apt:
    name: ['ca-certificates', 'curl', 'gnupg']
    state: present
    update_cache: yes
    - name: Create directory for GPG key
    file:
    path: /etc/apt/keyrings
    state: directory
    mode: '0755'
    - name: Add Docker GPG key
    shell: "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 repository
    apt_repository:
    repo: "deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu {{ ansible_distribution_release }} stable"
    state: present
    filename: docker
    notify: Update apt cache # Уведомляем обработчик
    - name: Install Docker packages using a loop
    apt:
    name: "{{ docker_packages }}"
    state: present
    - name: Ensure Docker service is running and enabled
    service:
    name: docker
    state: started
    enabled: yes
    - name: Add user to docker group
    user:
    name: "{{ ansible_user }}"
    groups: docker
    append: yes
    handlers:
    - name: Update apt cache
    apt:
    update_cache: yes
  3. Запуск и проверка (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 не просто установлен, но и корректно работает.
  1. Что такое handler и в каком случае он выполняется?
  2. Как с помощью Ansible установить сразу несколько пакетов, перечислив их в секции vars?
  3. Какая задача у модуля service в этом плейбуке?
  4. Что делает директива notify?
  5. Почему использование handlers для перезапуска сервисов или обновления кэша является лучшей практикой, чем просто добавление этих шагов в tasks?