Знакомство с Ansible. Часть 3. Ansible playbook

В предыдущих публикация мы с вами говорили о тех вещах, без которые нельзя было приступить к основной части элементов работы с Ansible – Ansible playbook. Все предыдущие команды мы с вами выполняли буквально в одну строку. Но мы с вами познакомились с очень важными элементами- файлами инвентаризации и модулями. Этих знаний нам должно быть достаточно для того, чтобы приступить к изучению playbook.

Что такое playbook

Playbook – это последовательность команд, которые Ansible выполняет на управляемом хосте. Каждый шаг определяется в отдельном действие – задаче. У каждой задачи есть свое имя (хотя это не обязательно), используемый модуль и набор параметров для этого модуля.

Также в задачах playbook могут быть определены условия запуска (или пропуска) задачи, а также различные шаблоны. Но о шаблонах мы поговорим в отдельной публикации.

Каждый playbook также содержит информацию о том, на каких серверах или группах серверов необходимо выполнять.

Структура playbook представляет из себя документ с yml разметкой. Но об этом мы поговорим в следующем разделе.

Общая структура playbook

Каждый playbook включает в себя ряд секций:

  • Имя, хотя этот параметр опционален.
  • Перечень хостов или групп, на которых необходимо запустить playbook.
  • Перечень задач.
  • Каждая задача в свою очередь может включать структуру с именем и набором параметров.

т.е. в самом простом варианте Ansible playbook может выглядеть следующим образом:

---
- name: Install curl
  hosts: front
  become: yes
  tasks:
  - name: Install curl package
    apt:
      name: curl
      state: present

Давайте разберем его чуть более детаельно.

Строка с тремя символами – это стандартное начало документа формата YML. Справедливости ради стоит отметить, что эта строка опциональна, её не обязательно включать.:

---

Далее следует название playbook. Дефис перед названием говорит о том, что это список YML и что потенциально таких секций может быть несколько:

- name: Install curl

Затем определяется хост или группа хостов, для которой laybook необходимо выполнить. В моем случае – это группа front:

hosts: front

Для установки пакета необходимо запросить повышение привилегий через sudo:

become: yes

Следующая строка объявляет начало списка с перечнем задач:

tasks:

Вот эту секцию стоит рассматривать вместе, т.к. она представляет из себя одну конкретную задачу – установку утилиты curl:

- name: Install curl package
    apt:
      name: curl
      state: present

В YML документах очень важны отступы. Соответственно внутри блока с объявление задачи используется модуль apt. В свою очереди внутри модуля apt указаны два параметра – имя пакета (параметр name) и состояние пакета (параметр state). Эквивалентный аналог этой записи в командном интерфейсе Ansible выглядел бы следующим образом:

ansible -m apt -a "name: curl state=present"

Секция с определением задач может быть несколько. Например, ниже я приведу пример секции tasks, которая определяет список из двух задач – для установки утилит curl и wget:

  tasks:
  - name: Install curl package
    apt:
      name: curl
      state: present
  - name: Install wget package
    apt:
      name: wget
      state: present

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

Пример Ansible playbook

Теперь я приведу парочку примеров.

Пример 1. Базовый playbook

В этом примере я объединю примеры и предыдущей публикации, где мы устанавливали nginx и запускали сервис через командный интерфейс Ansible. Сейчас мы с вами сделаем все тоже самое, только уже с помощью полноценного playbook.

Ниже я приведу структуру нашего playbook для установки nginx и запуска сервиса. Сначала мы обновим кэш apt, а затем установим nginx и настроем его автоматический запуск.:

---
- name: Install and start nginx
  hosts: front
  become: yes
  tasks:
  - name: Update apt repo metainfo
    apt:
      update_cache: yes
      force_apt_get: yes
  - name: Install nginx
    apt:
      name: nginx
      state: present
  - name: Start and enable autostart for nginx
    service:
      name: nginx
      state: started
      enabled: yes

Для запуска playbook используется утилита ansible-playbook. У этой утилиты очень много точно таких же параметров запуска, как и у утилиты ansible. Давайте попробуем запустить наш laybook:

ansible-playbook -i inv.ini install_nginx.yml -K
roman@ansible:~$ ansible-playbook -i inv.ini install_nginx.yml -K
BECOME password: 

PLAY [Install and start nginx] *****************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************************
ok: [tst1]

TASK [Update apt repo metainfo] ****************************************************************************************************
changed: [tst1]

TASK [Install nginx] ***************************************************************************************************************
ok: [tst1]

TASK [Start and enable autostart for nginx] ****************************************************************************************
ok: [tst1]

PLAY RECAP *************************************************************************************************************************
tst1                       : ok=4    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

roman@ansible:~$ 

Как видно из вывода – если какие-то действия уже выполнены (например установлены пакеты), то ansible не будет выполнять повторно эти действия. Это был простой пример запуска playbook.

Пример 2. Пример многозадачного playbook

В примере выше в нашем playbook была всего одна задача (play) – Install and start nginx. Она включала в себя три подзадачи – обновления кеша утилиты apt, установка пакеты nginx и запуск nginx. Однако, playbook может включать несколько задач (play). Для каждой из них определяются свои хосты и параметры запуска.

Приведу пример расширенного playbook. Он представляет из себя playbook из предыдущего примера, но дополнен еще одной задачей (play), которая устанавливает дополнительные пакеты на сервера из группы back. Паkеты могут быть любыми – я, например, проверю наличие вот этих пакетов – curl и wget.

Пример такого laybook я привожу ниже:

---
- name: Install and start nginx
  hosts: front
  become: yes
  tasks:
  - name: Update apt repo metainfo
    apt:
      update_cache: yes
      force_apt_get: yes
  - name: Install nginx
    apt:
      name: nginx
      state: present
  - name: Start and enable autostart for nginx
    service:
      name: nginx
      state: started
      enabled: yes

- name: Install curl and wget
  hosts: back
  become: yes
  tasks:
  - name: Update apt repo metainfo
    apt:
      update_cache: yes
      force_apt_get: yes
  - name: Install curl, wget
    apt:
      pkg:
      - curl
      - wget

Обратите внимание – в этом playbook два действия (play) – “Install and start nginx” и “Install curl and wget”. Каждое из которых включает в себя несколько

Результат запуска такого playbook я привожу ниже:

ansible-playbook -i inv.ini install_apps.yml -K
roman@ansible:~$ ansible-playbook -i inv.ini install_apps.yml -K
BECOME password: 

PLAY [Install and start nginx] *****************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************************
ok: [tst1]

TASK [Update apt repo metainfo] ****************************************************************************************************
changed: [tst1]

TASK [Install nginx] ***************************************************************************************************************
ok: [tst1]

TASK [Start and enable autostart for nginx] ****************************************************************************************
ok: [tst1]

PLAY [Install curl and wget] *******************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************************
ok: [tst2]

TASK [Update apt repo metainfo] ****************************************************************************************************
changed: [tst2]

TASK [Install curl, wget] **********************************************************************************************************
ok: [tst2]

PLAY RECAP *************************************************************************************************************************
tst1                       : ok=4    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
tst2                       : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

roman@ansible:~$ 

Как видно из листинга Ansible приводит сводную информацию по каждому из действий и в заключении приводит результирующую таблицу – какие группы или хосты были затронуты и изменены.

На этом я завершаю расскажу про playbook. В следующей публикации мы с вами поговорим о переменных и шаблонах Ansible.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *