Зарегистрируйтесь, чтобы продолжить обучение

Плейбук Основы автоматизации в Ansible

Одним из основных понятий в Ansible является плейбук. Это просто yaml-файл, в котором мы указываем, какие задачи и на каких серверах будут выполняться. Пример такого файла playbook.yml:

# На какой группе серверов
- hosts: webservers

  tasks:
    - name: install redis server
      # apt-get update && apt-get install redis-server
      ansible.builtin.apt: # имя модуля Ansible
        name: redis-server
        state: present
        update_cache: yes

    - name: remove redis server
      # apt-get remove redis-server
      ansible.builtin.apt:
        name: redis-server
        state: absent

В этом плейбуке на группе хостов webservers выполняются две задачи (таски). Первая — это установка redis-server, и вторая — его удаление. Структура любой задачи такая:

  • имя задачи — необязательный параметр, в котором описывается задача. Нужна только для вывода во время выполнения плейбука.
  • модуль и его параметры – определяет команду, которая будет выполнена на указанной группе серверов. В примере выше это модуль apt, который запускает пакетный менеджер apt входящий в стандартную поставку Ubuntu. С его помощью устанавливаются и удаляются программы.

Имя модуля в задачах задается с префиксом ansible.builtin. Ansible позволяет создавать свои модули у которых имена могут совпадать со встроенными модулями. Поэтому разработчики ввели пространства имен, позволяющие избежать неоднозначностей (какой модуль имелся ввиду?).

Каждый модуль принимает параметры. В первой задаче три параметра:

  • name: redis-server — имя пакета.
  • state: present — состояние, в которое требуется привести модуль. Ansible убедится, что этот пакет есть, либо доустановит его.
  • update_cache: yes — выполняет команду apt-get update для того, чтобы обновить информацию о пакетах в индексе. Во второй задаче обновлять индекс не требуется. Достаточно указать состояние state: absent, чтобы Ansible просто удалил redis-сервер.

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

Playbook

Для запуска плейбука используется команда ansible-playbook, которой мы передаем путь к файлу playbook.yml и указываем inventory-файл:

# В отличие от ad-hoc режима, группа хостов указывается внутри плейбука
ansible-playbook playbook.yml -i inventory.ini

При запуске этой команды первая же задача упадет с ошибкой Failed to lock apt for exclusive operation. Из этой ошибки следует, что команда выполняется без прав администратора и не может выполнить установку программ. Чтобы это изменить, можно заходить на сервер под root, что очень часто неприемлемо, и так лучше не делать. Поэтому в Ansible существует механизм переключения пользователя уже внутри. Он называется become. В простейшем случае достаточно прописать become: yes в нужные задачи:

- hosts: webservers

  tasks:
    - name: install redis server
      ansible.builtin.apt:
        name: redis-server
        state: present
        update_cache: yes
      become: yes # <---

    - name: remove redis server
      ansible.builtin.apt:
        name: redis-server
        state: absent
      become: yes # <---

По умолчанию become использует sudo и переключает в root, поэтому у вашего пользователя должны быть необходимые права. Если понадобится другой пользователь, то его можно указать в параметре become_user. Естественно необходимо чтобы у вашего пользователя было sudo. Теперь задача отрабатывает. Обновление индекса и установка занимает некоторое время:

TASK [install redis server] *********************************
changed: [157.230.82.133]

TASK [remove redis server] **********************************
changed: [157.230.82.133]

В терминале вывод станет желтым, это обозначает что задачи успешно выполнились. redis-server был установлен и удален с сервера. Если redis-server окажется установлен, то повторной установки не произойдет. Ansible убедится, что state: present, и перейдет к следующей задаче.


Самостоятельная работа

  1. Создайте в облаке сервер
  2. Создайте плейбук, в котором опишите установку git для удаленных серверов
  3. Выполните его, зайдите по ssh на один из серверов и убедитесь в том, что git был установлен

    git --version
    git version 2.32.0
    
  4. Создайте отдельный плейбук, в котором выполняется удаление git. Зайдите по ssh на сервер и проверьте, что Git удален

    git --version
    Command 'git' not found, but can be installed with:
    apt install git
    
  5. Залейте изменения на Github


Дополнительные материалы

  1. Документация Ansible
  2. Список модулей Ansible

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Для полного доступа к курсу нужен базовый план

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

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»