Перейти до змісту

Основи Ansible

У цьому розділі ви дізнаєтеся, як працювати з Ansible.


Цілі: В цьому розділі ви дізнаєтеся як:

✔ Реалізувати Ansible;
✔ Застосувати зміни конфігурації на сервері;
✔ Створити перші збірники ігор Ansible;

🏁 ansible, module, playbook

Знання: ⭐ ⭐ ⭐
Складність: ⭐ ⭐

Час читання: 30 хвилин


Ansible централізує та автоматизує задачі адміністратора. Це є:

  • agentless (не вимагає спеціального розгортання на клієнтах),
  • idempotent (однаковий ефект під час кожного запуску).

Він використовує протокол SSH для віддаленого налаштування клієнтів Linux або протокол WinRM для роботи з клієнтами Windows. Якщо жоден із цих протоколів недоступний, Ansible завжди може використовувати API, що робить Ansible справжнім швейцарським ножем для конфігурації серверів, робочих станцій, служб докерів, мережевого обладнання тощо (фактично, майже всього).

Важливо

Відкриття SSH або WinRM надходить до всіх клієнтів із сервера Ansible, що робить його критичним елементом архітектури, який потрібно ретельно контролювати.

Оскільки Ansible здебільшого базується на push-завантаженні, він не зберігатиме стан своїх цільових серверів між кожним своїм виконанням. Навпаки, він виконуватиме нові перевірки стану під час кожного виконання. Кажуть, без стану.

Це допоможе вам у:

  • забезпеченні (розгортанні нової віртуальної машини),
  • розгортанні додатків,
  • управлінні конфігурацією,
  • автоматизації,
  • оркестровка (коли використовується більше ніж 1 target).

Примітка

Ansible спочатку був написаний Майклом Де Хааном, засновником інших інструментів, таких як Cobbler.

Michael DeHaan

Найраніша перша версія - 0.0.1, яка була випущена 9 березня 2012 року.

17 жовтня 2015 року AnsibleWorks (компанія, що стоїть за Ansible) була придбана Red Hat за 150 мільйонів доларів.

Особливості Ansible

Щоб запропонувати графічний інтерфейс для щоденного використання Ansible, ви можете встановити деякі інструменти, наприклад Ansible Tower (RedHat), який не є безкоштовним, його відповідник з відкритим кодом Awx або інші проекти, такі як Jenkins і чудовий Rundeck, також можна використовувати.

Анотація

Щоб пройти цей тренінг, вам знадобляться принаймні 2 сервери під Rocky8:

  • першим буде машина керування, на ній буде встановлено Ansible.
  • другий буде сервером для налаштування та керування (інший Linux, ніж Rocky Linux, підійде так само добре).

У наведених нижче прикладах станція адміністрування має IP-адресу 172.16.1.10, керована станція – 172.16.1.11. Ви повинні адаптувати приклади відповідно до свого плану IP-адресації.

Терміни Ansible

  • Машина керування (management machine): машина, на якій встановлено Ansible. Оскільки Ansible безагентний (agentless), програмне забезпечення не розгортається на керованих серверах.
  • Керовані вузли: цільові пристрої, якими керує Ansible, також називаються «хостами». Це можуть бути сервери, мережеві пристрої або будь-який інший комп’ютер.
  • Інвентар: файл, що містить інформацію про керовані сервери.
  • Завдання: завдання – це блок, що визначає процедуру, яку потрібно виконати (наприклад, створити користувача або групу, встановити програмний пакет тощо).
  • Модуль: модуль реферує завдання. Ansible надає багато модулів.
  • Playbooks: простий файл у форматі yaml із визначенням цільових серверів і завдань, які потрібно виконати.
  • Роль: роль дозволяє вам упорядковувати підручники та всі інші необхідні файли (шаблони, сценарії тощо), щоб полегшити спільний доступ до коду та його повторне використання.
  • Колекція: колекція включає логічний набір посібників, ролей, модулів і плагінів.
  • Факти: це глобальні змінні, що містять інформацію про систему (назва машини, версія системи, мережевий інтерфейс і конфігурація тощо).
  • Обробники: вони використовуються для зупинки або перезапуску служби у разі зміни.

Установка на сервер управління

Ansible доступний у сховищі EPEL, але інколи він може бути застарим для поточної версії, і ви захочете працювати з новішою версією.

Тому ми розглянемо два види установки:

  • той, що базується на репозиторіях EPEL
  • один на основі менеджера пакунків Python pip

EPEL потрібен для обох версій, тому ви можете встановити його зараз:

  • Установка EPEL:
$ sudo dnf install epel-release

Установка від EPEL

Якщо ми встановимо Ansible з EPEL, ми зможемо зробити наступне:

$ sudo dnf install ansible

А потім перевірте встановлення:

$ ansible --version
ansible [core 2.14.2]
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/home/rocky/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3.11/site-packages/ansible  ansible collection location = /home/rocky/.ansible/collections:/usr/share/ansible/collections
  executable location = /usr/bin/ansible
  python version = 3.11.2 (main, Jun 22 2023, 04:35:24) [GCC 8.5.0 20210514 
(Red Hat 8.5.0-18)] (/usr/bin/python3.11)
  jinja version = 3.1.2
  libyaml = True

$ python3 --version
Python 3.6.8

Зверніть увагу, що ansible постачається зі своєю власною версією python, відмінною від системної версії Python (тут 3.11.2 проти 3.6.8). Вам потрібно врахувати це під час інсталяції модулів Python за допомогою pip, необхідних для інсталяції (наприклад, pip3.11 install PyVMomi).

Встановлення з python pip

Оскільки ми хочемо використовувати новішу версію Ansible, ми встановимо її з python3-pip:

Примітка

Видаліть Ansible, якщо ви встановили його раніше з EPEL.

На цьому етапі ми можемо встановити ansible з потрібною версією python.

$ sudo dnf install python38 python38-pip python38-wheel python3-argcomplete rust cargo curl

Примітка

python3-argcomplete надається EPEL. Будь ласка, встановіть epel-release, якщо це ще не зроблено. Цей пакет допоможе вам виконати команди Ansible.

Тепер ми можемо встановити Ansible:

$ pip3.8 install --user ansible
$ activate-global-python-argcomplete --user

Перевірте свою версію Ansible:

$ ansible --version
ansible [core 2.13.11]
  config file = None
  configured module search path = ['/home/rocky/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /home/rocky/.local/lib/python3.8/site-packages/ansible
  ansible collection location = /home/rocky/.ansible/collections:/usr/share/ansible/collections
  executable location = /home/rocky/.local/bin/ansible
  python version = 3.8.16 (default, Jun 25 2023, 05:53:51) [GCC 8.5.0 20210514 (Red Hat 8.5.0-18)]
  jinja version = 3.1.2
  libyaml = True

Примітка

Версія, встановлена вручну, у нашому випадку старша за версію, запаковану RPM, оскільки ми використовували старішу версію python. Це спостереження змінюватиметься залежно від часу та віку дистрибутива та версії python, звичайно.

Файли конфігурації

Конфігурація сервера знаходиться в /etc/ansible.

Існує два основних файли конфігурації:

  • Основний конфігураційний файл ansible.cfg, де знаходяться команди, модулі, плагіни та конфігурація ssh;
  • Файл інвентаризації керування клієнтською машиною hosts, де оголошено клієнтів і групи клієнтів.

Конфігураційний файл буде створено автоматично, якщо Ansible було встановлено через пакет RPM. При встановленні pip цей файл не існує. Нам доведеться створити його вручну завдяки команді ansible-config:

$ ansible-config -h
usage: ansible-config [-h] [--version] [-v] {list,dump,view,init} ...

Перегляд доступної конфігурації.

позиційні аргументи:
   {list,dump,view,init}
     список Надрукувати всі параметри конфігурації
     dump Дамп конфігурації
     перегляд Переглянути файл конфігурації
     init Створити початкову конфігурацію

Приклад:

ansible-config init --disabled > /etc/ansible/ansible.cfg

Параметр --disabled дозволяє вам закоментувати набір параметрів, додавши до них префікс ;.

Примітка

Ви також можете вбудувати конфігурацію Ansible у своє сховище коду, при цьому Ansible завантажуватиме файли конфігурації, які він знайде, у такому порядку (обробка першого файлу, який він зустріне, та ігнорування решти):

  • якщо встановлено змінну середовища $ANSIBLE_CONFIG, завантажте вказаний файл.
  • ansible.cfg, якщо існує в поточному каталозі.
  • ~/.ansible.cfg, якщо існує (у домашньому каталозі користувача).

Файл за замовчуванням завантажується, якщо жоден із цих трьох файлів не знайдено.

Файл інвентаризації /etc/ansible/hosts

Оскільки Ansible доведеться працювати з усім вашим обладнанням, яке потрібно налаштувати, необхідно забезпечити його одним (чи кількома) добре структурованими файлами інвентаризації, які ідеально відповідають вашій організації.

Іноді необхідно добре подумати, як створити цей файл.

Перейдіть до файлу інвентаризації за умовчанням, який знаходиться під /etc/ansible/hosts. Деякі приклади наведено та прокоментовано:

# This is the default ansible 'hosts' file.
#
# It should live in /etc/ansible/hosts
#
#   - Comments begin with the '#' character
#   - Blank lines are ignored
#   - Groups of hosts are delimited by [header] elements
#   - You can enter hostnames or ip addresses
#   - A hostname/ip can be a member of multiple groups

# Ex 1: Ungrouped hosts, specify before any group headers:

## green.example.com
## blue.example.com
## 192.168.100.1
## 192.168.100.10

# Ex 2: A collection of hosts belonging to the 'webservers' group:

## [webservers]
## alpha.example.org
## beta.example.org
## 192.168.1.100
## 192.168.1.110

# If you have multiple hosts following a pattern, you can specify
# them like this:

## www[001:006].example.com

# Ex 3: A collection of database servers in the 'dbservers' group:

## [dbservers]
##
## db01.intranet.mydomain.net
## db02.intranet.mydomain.net
## 10.25.1.56
## 10.25.1.57

# Here's another example of host ranges, this time there are no
# leading 0s:

## db-[99:101]-node.example.com

Як бачимо, файл, наданий як приклад, використовує формат INI, добре відомий системним адміністраторам. Зверніть увагу, що ви можете вибрати інший формат файлу (наприклад, yaml), але для перших тестів формат INI добре адаптований для наших майбутніх прикладів.

Інвентаризація може бути створена автоматично у виробництві, особливо якщо у вас є середовище віртуалізації, наприклад VMware VSphere, або хмарне середовище (Aws, OpenStack або інше).

  • Створення групи хостів у /etc/ansible/hosts:

Як ви могли помітити, групи оголошуються у квадратних дужках. Потім йдуть елементи, що належать до груп. Ви можете створити, наприклад, групу rocky8, вставивши наступний блок у цей файл:

[rocky8]
172.16.1.10
172.16.1.11

Групи можна використовувати в інших групах. У цьому випадку необхідно вказати, що батьківська група складається з підгруп з атрибутом :children, як це:

[linux:children]
rocky8
debian9

[ansible:children]
ansible_management
ansible_clients

[ansible_management]
172.16.1.10

[ansible_clients]
172.16.1.10

Ми не будемо зупинятися на інвентаризації, але якщо ви зацікавлені, перегляньте це посилання.

Тепер, коли наш сервер керування встановлено та наш інвентар готовий, настав час запустити наші перші команди ansible.

ansible використання командного рядка

Команда ansible запускає завдання на одному чи кількох цільових хостах.

ansible <host-pattern> [-m module_name] [-a args] [options]

Приклади:

Важливо

Оскільки ми ще не налаштували автентифікацію на наших 2 тестових серверах, не всі наступні приклади працюватимуть. Вони наведені як приклади, щоб полегшити розуміння, і будуть повністю функціональними пізніше в цьому розділі.

  • Перелічіть хости, що належать до групи rocky8:
ansible rocky8 --list-hosts
  • Виконайте тестування групи хостів за допомогою модуля ping:
ansible rocky8 -m ping
  • Відображення фактів із групи хостів за допомогою модуля setup:
ansible rocky8 -m setup
  • Виконайте команду в групі хостів, викликавши модуль command з аргументами:
ansible rocky8 -m command -a 'uptime'
  • Виконайте команду з правами адміністратора:
ansible ansible_clients --become -m command -a 'reboot'
  • Виконайте команду за допомогою спеціального файлу інвентаризації:
ansible rocky8 -i ./local-inventory -m command -a 'date'

Примітка

Як у цьому прикладі, іноді простіше розділити декларацію керованих пристроїв на кілька файлів (наприклад, за хмарним проектом) і надати Ansible шлях до цих файлів, а не підтримувати довгий файл інвентаризації.

Опція Опис
-a 'arguments' Аргументи для передачі в модуль.
-b -K Запитує пароль і виконує команду з вищими привілегіями.
--user=username Використовує цього користувача для підключення до цільового хосту замість поточного користувача.
--become-user=username Виконує операцію від імені цього користувача (за замовчуванням: root).
-C Симуляція. Не вносить жодних змін до target, але виконує перевірку, щоб побачити, що слід змінити.
-m module Запускає викликаний модуль

Підготовка клієнта

На машинах керування та клієнтах ми створимо користувача ansible, призначеного для операцій, які виконує Ansible. Цей користувач має використовувати права sudo, тому його потрібно додати до групи wheel.

Цей користувач буде використовуватися:

  • На стороні станції адміністрування: для виконання команд ansible і ssh для керованих клієнтів.
  • На керованих станціях (тут сервер, який служить вашою станцією адміністрування, також служить клієнтом, тому ним керують самі по собі), для виконання команд, запущених із станції адміністрування: тому він повинен мати права sudo.

На обох машинах створіть користувача ansible, присвяченого ansible:

$ sudo useradd ansible
$ sudo usermod -aG wheel ansible

Встановіть пароль для цього користувача:

$ sudo passwd ansible

Змініть конфігурацію sudoers, щоб дозволити членам групи wheel використовувати sudo без пароля:

$ sudo visudo

Наша мета тут — закоментувати параметр за замовчуванням і розкоментувати параметр NOPASSWD, щоб ці рядки виглядали так, коли ми закінчимо:

## Allows people in group wheel to run all commands
# %wheel  ALL=(ALL)       ALL

## Same thing without a password
%wheel        ALL=(ALL)       NOPASSWD: ALL

Важливо

Якщо ви отримуєте таке повідомлення про помилку під час введення команд Ansible, це, ймовірно, означає, що ви забули цей крок на одному зі своїх клієнтів: "msg": "Missing sudo password

Використовуючи керування з цього моменту, почніть працювати з цим новим користувачем:

$ sudo su - ansible

Перевірка за допомогою модуля ping

За замовчуванням Ansible не дозволяє вхід із паролем.

Розкоментуйте наступний рядок із розділу [defaults] у файлі конфігурації /etc/ansible/ansible.cfg і встановіть для нього значення True:

ask_pass      = True

Запустіть ping на кожному сервері групи rocky8:

# ansible rocky8 -m ping
SSH password:
172.16.1.10 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
172.16.1.11 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

Примітка

Вас просять ввести ansible пароль віддалених серверів, що є проблемою безпеки...

Порада

Якщо ви отримуєте цю помилку "msg": to use the 'ssh' connection type with passwords, you must install the sshpass program", ви можете просто встановити sshpass на станції керування:

$ sudo dnf install sshpass

анотація

Тепер ви можете перевірити команди, які раніше не працювали в цій главі.

Аутентифікація за ключем

Автентифікацію за паролем буде замінено набагато більш безпечною автентифікацією за приватним/відкритим ключем.

Створення ключа SSH

Подвійний ключ буде згенеровано за допомогою команди ssh-keygen на станції керування користувачем ansible:

[ansible]$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ansible/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/ansible/.ssh/id_rsa.
Your public key has been saved in /home/ansible/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:Oa1d2hYzzdO0e/K10XPad25TA1nrSVRPIuS4fnmKr9g ansible@localhost.localdomain
The key's randomart image is:
+---[RSA 3072]----+
|           .o . +|
|           o . =.|
|          . . + +|
|         o . = =.|
|        S o = B.o|
|         = + = =+|
|        . + = o+B|
|         o + o *@|
|        . Eoo .+B|
+----[SHA256]-----+

Відкритий ключ можна скопіювати на сервери:

# ssh-copy-id ansible@172.16.1.10
# ssh-copy-id ansible@172.16.1.11

Повторно прокоментуйте наступний рядок із розділу [defaults] у файлі конфігурації /etc/ansible/ansible.cfg, щоб запобігти автентифікації паролем:

#ask_pass      = True

Тест автентифікації закритого ключа

Для наступного тесту використовується модуль shell, що дозволяє віддалено виконувати команди:

# ansible rocky8 -m shell -a "uptime"
172.16.1.10 | SUCCESS | rc=0 >>
 12:36:18 up 57 min,  1 user,  load average: 0.00, 0.00, 0.00

172.16.1.11 | SUCCESS | rc=0 >>
 12:37:07 up 57 min,  1 user,  load average: 0.00, 0.00, 0.00

Пароль не потрібен, автентифікація приватного/відкритого ключа працює!

Примітка

У робочому середовищі тепер ви повинні видалити ansible паролі, встановлені раніше для забезпечення вашої безпеки (оскільки тепер пароль автентифікації не потрібен).

Використання Ansible

Ansible можна використовувати з оболонки або playbooks.

Модулі

Список модулів, класифікованих за категоріями, можна знайти тут. Ansible пропонує понад 750!

Тепер модулі згруповано в колекції модулів, список яких можна знайти тут.

Колекції — це формат розповсюдження вмісту Ansible, який може містити посібники, ролі, модулі та плагіни.

Модуль викликається за допомогою параметра -m команди ansible:

ansible <host-pattern> [-m module_name] [-a args] [options]

Практично для будь-якої потреби є модуль! Таким чином, замість використання модуля оболонки рекомендується шукати модуль, адаптований до потреб.

Кожна категорія потреби має свій модуль. Ось неповний список:

Тип Приклади
Управління системою user (керування користувачами), group (керування групами) тощо.
Управління програмним забезпеченням dnf,yum, apt, pip, npm
Керування файлами copy, fetch, lineinfile, template, archive
Управління базами даних mysql, postgresql, redis
Управління хмарою amazon S3, cloudstack, openstack
Управління кластером consul, zookeeper
Надсилання команд shell, script, expect
Завантаження get_url
Керування джерелом git, gitlab

Приклад встановлення програмного забезпечення

Модуль dnf дозволяє інсталювати програмне забезпечення на цільових клієнтах:

# ansible rocky8 --become -m dnf -a name="httpd"
172.16.1.10 | SUCCESS => {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [
      ...
      \n\nComplete!\n"
    ]
}
172.16.1.11 | SUCCESS => {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [
      ...
    \n\nComplete!\n"
    ]
}

Встановлене програмне забезпечення є службою, тепер необхідно запустити його за допомогою модуля systemd:

# ansible rocky8 --become  -m systemd -a "name=httpd state=started"
172.16.1.10 | SUCCESS => {
    "changed": true,
    "name": "httpd",
    "state": "started"
}
172.16.1.11 | SUCCESS => {
    "changed": true,
    "name": "httpd",
    "state": "started"
}

Порада

Спробуйте двічі запустити останні 2 команди. Ви помітите, що перший раз Ansible виконає дії для досягнення стану, встановленого командою. Другого разу він нічого не зробить, оскільки виявить, що стан уже досягнуто!

Вправи

Щоб дізнатися більше про Ansible і звикнути до пошуку документації Ansible, ось кілька вправ, які ви можете виконати, перш ніж продовжити:

  • Створіть групи Paris, Tokio, NewYork
  • Створіть користувача supervisor
  • Змініть користувача, щоб мати uid 10000
  • Змініть користувача так, щоб він належав до групи Paris
  • Встановіть програмне забезпечення дерева
  • Зупиніть службу crond
  • Створіть порожній файл із правами 0644
  • Оновіть дистрибутив клієнта
  • Перезапустіть клієнт

Важливо

Не використовуйте модуль оболонки. Подивіться відповідні модулі в документації!

Модуль setup: вступ до фактів

Системні факти – це змінні, отримані Ansible через його модуль setup.

Подивіться на різні факти про своїх клієнтів, щоб отримати уявлення про кількість інформації, яку можна легко отримати за допомогою простої команди.

Пізніше ми побачимо, як використовувати факти в наших підручниках і створювати власні факти.

# ansible ansible_clients -m setup | less
192.168.1.11 | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "192.168.1.11"
        ],
        "ansible_all_ipv6_addresses": [
            "2001:861:3dc3:fcf0:a00:27ff:fef7:28be",
            "fe80::a00:27ff:fef7:28be"
        ],
        "ansible_apparmor": {
            "status": "disabled"
        },
        "ansible_architecture": "x86_64",
        "ansible_bios_date": "12/01/2006",
        "ansible_bios_vendor": "innotek GmbH",
        "ansible_bios_version": "VirtualBox",
        "ansible_board_asset_tag": "NA",
        "ansible_board_name": "VirtualBox",
        "ansible_board_serial": "NA",
        "ansible_board_vendor": "Oracle Corporation",
        ...

Тепер, коли ми побачили, як налаштувати віддалений сервер за допомогою Ansible у командному рядку, ми можемо представити поняття playbook. Playbooks — ще один спосіб використання Ansible, який не набагато складніший, але полегшить повторне використання вашого коду.

Playbooks

Playbooks Ansible описують політику, яка буде застосована до віддалених систем, щоб примусово їх конфігурувати. Playbooks написані у зрозумілому текстовому форматі, який об’єднує набір завдань: формат yaml.

Примітка

Дізнайтеся більше про yaml тут

ansible-playbook <file.yml> ... [options]

Параметри ідентичні команді ansible.

Команда повертає такі коди помилок:

Код Помилка
0 OK або немає відповідного хоста
1 Помилка
2 Один або кілька хостів не працюють
3 Один або кілька хостів недоступні
4 Analyze error
5 Погані або неповні варіанти
99 Запуск перервано користувачем
250 Неочікувана помилка

Примітка

Будь ласка, зверніть увагу, що ansible поверне Ok, якщо жоден хост не збігається з вашою метою, що може ввести вас в оману!

Приклад посібника з Apache і MySQL

Наступний playbook дозволяє нам інсталювати Apache і MariaDB на наших цільових серверах.

Створіть файл test.yml із таким вмістом:

---
- hosts: rocky8 <1>
  become: true <2>
  become_user: root

  tasks:

    - name: ensure apache is at the latest version
      dnf: name=httpd,php,php-mysqli state=latest

    - name: ensure httpd is started
      systemd: name=httpd state=started

    - name: ensure mariadb is at the latest version
      dnf: name=mariadb-server state=latest

    - name: ensure mariadb is started
      systemd: name=mariadb state=started
...
  • <1> Цільова група або цільовий сервер повинні існувати в інвентарі
  • <2> Після підключення користувач стає root (через sudo за замовчуванням)

Виконання playbook виконується командою ansible-playbook:

$ ansible-playbook test.yml

PLAY [rocky8] ****************************************************************

TASK [setup] ******************************************************************
ok: [172.16.1.10]
ok: [172.16.1.11]

TASK [ensure apache is at the latest version] *********************************
ok: [172.16.1.10]
ok: [172.16.1.11]

TASK [ensure httpd is started] ************************************************
changed: [172.16.1.10]
changed: [172.16.1.11]

TASK [ensure mariadb is at the latest version] **********************************
changed: [172.16.1.10]
changed: [172.16.1.11]

TASK [ensure mariadb is started] ***********************************************
changed: [172.16.1.10]
changed: [172.16.1.11]

PLAY RECAP *********************************************************************
172.16.1.10             : ok=5    changed=3    unreachable=0    failed=0
172.16.1.11             : ok=5    changed=3    unreachable=0    failed=0

Для кращої читабельності рекомендовано писати ваші п’єси в повному форматі yaml. У попередньому прикладі аргументи подано в тому самому рядку, що й модуль, значення аргументу після його назви розділено =. Подивіться ту саму playbook на повному yaml:

---
- hosts: rocky8
  become: true
  become_user: root

  tasks:

    - name: ensure apache is at the latest version
      dnf:
        name: httpd,php,php-mysqli
        state: latest

    - name: ensure httpd is started
      systemd:
        name: httpd
        state: started

    - name: ensure mariadb is at the latest version
      dnf:
        name: mariadb-server
        state: latest

    - name: ensure mariadb is started
      systemd:
        name: mariadb
        state: started
...

Порада

dnf — це один із модулів, який дозволяє надати йому список як аргумент.

Примітка щодо колекцій: Ansible тепер надає модулі у формі колекцій. Деякі модулі надаються за замовчуванням у колекції ansible.builtin, інші потрібно встановити вручну за допомогою:

ansible-galaxy collection install [collectionname]
де [collectionname] — це назва колекції (квадратні дужки тут використовуються, щоб підкреслити необхідність заміни її фактичною назвою колекції, і НЕ є частиною команди).

Попередній приклад слід записати так:

---
- hosts: rocky8
  become: true
  become_user: root

  tasks:

    - name: ensure apache is at the latest version
      ansible.builtin.dnf:
        name: httpd,php,php-mysqli
        state: latest

    - name: ensure httpd is started
      ansible.builtin.systemd:
        name: httpd
        state: started

    - name: ensure mariadb is at the latest version
      ansible.builtin.dnf:
        name: mariadb-server
        state: latest

    - name: ensure mariadb is started
      ansible.builtin.systemd:
        name: mariadb
        state: started
...

Посібник не обмежується однією метою:

---
- hosts: webservers
  become: true
  become_user: root

  tasks:

    - name: ensure apache is at the latest version
      ansible.builtin.dnf:
        name: httpd,php,php-mysqli
        state: latest

    - name: ensure httpd is started
      ansible.builtin.systemd:
        name: httpd
        state: started

- hosts: databases
  become: true
  become_user: root

    - name: ensure mariadb is at the latest version
      ansible.builtin.dnf:
        name: mariadb-server
        state: latest

    - name: ensure mariadb is started
      ansible.builtin.systemd:
        name: mariadb
        state: started
...

Ви можете перевірити синтаксис вашої playbook:

$ ansible-playbook --syntax-check play.yml

Ви також можете використовувати "лінтер" для yaml:

$ dnf install -y yamllint

потім перевірте синтаксис yaml своїх playbooks:

$ yamllint test.yml
test.yml
  8:1       error    syntax error: could not find expected ':' (syntax)

Результати вправ

  • Створіть групи Paris, Tokio, NewYork
  • Створіть користувача supervisor
  • Змініть користувача, щоб мати uid 10000
  • Змініть користувача так, щоб він належав до групи Paris
  • Встановіть програмне забезпечення дерева
  • Зупиніть службу crond
  • Створіть порожній файл із правами 0644
  • Оновіть дистрибутив клієнта
  • Перезапустіть клієнт
ansible ansible_clients --become -m group -a "name=Paris"
ansible ansible_clients --become -m group -a "name=Tokio"
ansible ansible_clients --become -m group -a "name=NewYork"
ansible ansible_clients --become -m user -a "name=Supervisor"
ansible ansible_clients --become -m user -a "name=Supervisor uid=10000"
ansible ansible_clients --become -m user -a "name=Supervisor uid=10000 groups=Paris"
ansible ansible_clients --become -m dnf -a "name=tree"
ansible ansible_clients --become -m systemd -a "name=crond state=stopped"
ansible ansible_clients --become -m copy -a "content='' dest=/tmp/test force=no mode=0644"
ansible ansible_clients --become -m dnf -a "name=* state=latest"
ansible ansible_clients --become -m reboot

Author: Antoine Le Morvan

Contributors: Steven Spencer, tianci li, Aditya Putta, Ganna Zhyrnova