Підручник з Ansible для початківців: Плейбук та команди

⚡ Розумний підсумок

Ansible — це безагентний механізм автоматизації з відкритим кодом, який налаштовує сервери через SSH, виконує спеціальні команди та керує складними розгортаннями за допомогою плейбуків YAML, ролей та шаблонів багаторазового використання в Linux та... Windows інфраструктури.

  • 🧩 Безагентний Archiтекстура: Ansible підключається до клієнтів через SSH та надсилає модулі, тому на керованих вузлах не потрібно встановлювати агентське програмне забезпечення.
  • 📥 Установка: Налаштуйте Ansible на контрольному вузлі за допомогою yum та EPEL на CentOS або RHEL, або за допомогою apt та PPA на Ubuntu або Дебіан.
  • Спеціальні команди: Виконуйте одноразові завдання, такі як ping, копіювати або виконувати операції yum по всьому інвентарю, використовуючи синтаксис модуля ansible -m.
  • 📜 П'єси: Опишіть бажаний стан у плейбуках YAML, які групують плагіати, завдання та модулі для послідовного налаштування багатьох серверів.
  • 🧱 Ролі та шаблони: Розділіть великі плейбуки на ролі повторного використання, створені за допомогою ansible-galaxy, та відрендеріть файли конфігурації за допомогою шаблонів Jinja2.
  • 🔁 Клінери та факти: Запускайте обробники через сповіщувачі про зміни та використовуйте змінні gather_facts для умовної, повторюваної автоматизації.
  • 🎯 Приклад: Один плейбук p4.yml може запускати ролі selinux, httpd та resolver на всіх хостах, кожна з яких контролюється тегом.

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

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

Що таке Ansible?

Неможливо — це інструмент автоматизації та оркестрації з відкритим кодом для налаштування програмного забезпечення, керування конфігурацією та розгортання програмного забезпечення. Він налаштовує Unix-подібні системи та Windows системи, надаючи інфраструктуру у вигляді коду за допомогою власної декларативної мови. Ansible часто порівнюють з агентними інструментами, такими як Ляльковий.

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

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

Навіщо використовувати Ansible?

Ось деякі важливі переваги використання Ansible:

  • Одна з найважливіших переваг Ansible полягає в тому, що він безкоштовний для всіх.
  • Для встановлення та використання не потрібні спеціальні навички системного адміністратора, а офіційна документація є дуже вичерпною.
  • Його модульність, що включає плагіни, модулі, інвентаризацію та плейбуки, робить Ansible чудовим помічником для оркестрації великих середовищ.
  • Ansible легкий та узгоджений, без обмежень щодо операційної системи чи базового обладнання.
  • Він дуже безпечний завдяки безагентному дизайну та використанню функцій безпеки OpenSSH.
  • Ansible має плавну криву навчання, підкріплену ретельною документацією та легкою для вивчення структурою та конфігурацією.

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

Історія Ansible

Ось важливі віхи в історії Ansible:

  • Проєкт Ansible розпочався у лютому 2012 року. Його вперше розробив Майкл ДеХаан, творець Cobbler та Func (Fedora Unified Network Controller).
  • Спочатку компанія під назвою AnsibleWorks Inc., яка фінансує Ansible, була придбана RedHat у 2015 році, а пізніше разом з RedHat перейшла під управління... IBM парасолька.
  • Сьогодні Ansible входить до складу таких дистрибутивів, як Fedora Linux, RHEL, CentOS та… Oracle Linux

Важливі терміни, що використовуються в Ansible

Наступні терміни зустрічаються в цьому посібнику з Ansible і їх варто знати, перш ніж почати:

Ansible сервер

Машина, на якій встановлено Ansible та з якої запускаються всі завдання та плейбуки.

Модулі

Модуль — це команда або набір подібних команд Ansible, призначених для виконання на стороні клієнта.

Завдання

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

Роль

Спосіб організації завдань та пов'язаних з ними файлів для подальшого виклику в плейбуці.

факт

Інформація, отримана з глобальних змінних клієнтської системи за допомогою операції gather_facts.

Інвентаризація

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

Play

Виконання п'єси.

Handler

Завдання, яке викликається лише за наявності сповіщувача.

Сповіщувач

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

Тег

Ім'я, встановлене для завдання, яке можна використовувати пізніше для виконання лише цього конкретного завдання або групи завдань.

Інсталяція Ansible в Linux

Після того, як ви зважили всі варіанти та вирішили скористатися Ansible, наступним кроком є ​​його встановлення на вашу систему. Наступний короткий посібник охоплює встановлення на найпопулярніші Linux розподілу.

Встановіть Ansible на системи Centos/RedHat

Крок 1) Встановіть репозиторій EPEL.

[root@ansible-server ~]# sudo yum install epel-release

Крок 2) Встановіть пакет ansible.

[root@ansible-server ~]# sudo  yum install -y ansible

Встановіть Ansible на системи Centos/RedHat

Встановити ansible на Ubuntu/Системи Debian

Крок 1) Виконайте оновлення пакетів.

$ sudo apt update

Крок 2) Встановіть пакет software-properties-common.

$ sudo apt install software-properties-common

Крок 3) Встановіть особистий архів пакетів Ansible.

$ sudo apt-add-repository ppa:ansible/ansible

Крок 4) Встановіть ансібл.

$ sudo apt update
$ sudo apt install ansible

Ansible ad-hoc команди

Один із найпростіших способів використання Ansible – це спеціальні команди. Вони корисні, коли потрібно виконати команду на одному сервері або на групі серверів. Спеціальні команди не зберігаються для подальшого використання, але вони є швидким способом взаємодії з вибраними вами серверами.

Для цього посібника з Ansible налаштовано простий файл hosts для двох серверів, що містить host1 та host2.

Ви можете підтвердити, що хости доступні з сервера Ansible, виконавши команду ping команда на всіх хостах.

[root@ansible-server test_ansible]# ansible -i hosts all -m ping
host1 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
host2 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

Ansible ad-hoc команди

Пояснення:

  1. Статус команди, в даному випадку SUCCESS
  2. Хост, на якому виконано команду
  3. Команда, видана через параметр -m, у цьому випадку ping
  4. За допомогою параметра -i ви можете вказати на файл hosts.

Ви також можете виконати ту саму команду на одному хості, коли це необхідно.

[root@ansible-server test_ansible]# ansible -i hosts all -m ping --limit host2
host2 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

Ansible ad-hoc команди

Пояснення:

  1. Параметр Limit можна використовувати для виконання команд лише на певних хостах у файлі хосту
  2. Ім’я хоста, як визначено у файлі інвентаризації

Якщо вам потрібно швидко скопіювати файл до кількох місць призначення, скористайтеся модулем копіювання, який використовує SCP. Команда та її вивід виглядають так:

[root@ansible-server test_ansible]# ansible -i hosts all -m copy -a "src=/root/test_ansible/testfile dest=/tmp/testfile"
host1 | SUCCESS => {
    "changed": true,
    "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "dest": "/tmp/testfile",
    "gid": 0,
    "group": "root",
    "md5sum": "d41d8cd98f00b204e9800998ecf8427e",
    "mode": "0644",
    "owner": "root",
    "size": 0,
    "src": "/root/.ansible/tmp/ansible-tmp-1562216392.43-256741011164877/source",
    "state": "file",
    "uid": 0
}
host2 | SUCCESS => {
    "changed": true,
    "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "dest": "/tmp/testfile",
    "gid": 0,
    "group": "root",
    "md5sum": "d41d8cd98f00b204e9800998ecf8427e",
    "mode": "0644",
    "owner": "root",
    "size": 0,
    "src": "/root/.ansible/tmp/ansible-tmp-1562216392.6-280302911361278/source",
    "state": "file",
    "uid": 0
}

Ansible ad-hoc команди

Пояснення:

  1. Визначено модуль копіювання
  2. Аргументами модуля в цьому випадку є абсолютний шлях джерела та абсолютний шлях призначення.
  3. Вивід команди Ansible відображає успішність команди копіювання та інші деталі, як-от контрольні суми sha1 або md5 для перевірки цілісності файлу та метадані, як-от власник, розмір або дозволи. Легко встановити пакет на групі серверів. У Ansible є кілька модулів, які взаємодіють із використовуваними інсталяторами, наприклад yum, apt, dnf тощо.

У наступному прикладі ви встановите пакет з модулем yum на два хости CentOS.

[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=present'
host1 | SUCCESS => {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [


"Loaded plugins: fastestmirror\nLoading mirror speeds from cached hostfile\n * base: mirror.netsite.dk\n * elrepo: mirrors.xservers.ro\n * epel: fedora.mirrors.telekom.ro\n * extras: centos.mirrors.telekom.ro\n * remi-php70: remi.schlundtech.de\n * remi-safe: remi.schlundtech.de\n * updates: centos.mirror.iphh.net\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n========================================================================\n Package         Arch              Version                Repository       Size\n========================================================================\nInstalling:\n ncdu            x86_64            1.14-1.el7             epel             51 k\n\nTransaction Summary\n========================================================================\nInstall  1 Package\n\nTotal download size: 51 k\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Installing : ncdu-1.14-1.el7.x86_64                                       1/1 \n  Verifying  : ncdu-1.14-1.el7.x86_64                                       1/1 \n\nInstalled:\n  ncdu.x86_64 0:1.14-1.el7                                                      \n\nComplete!\n"
    ]
}
host2 | SUCCESS => {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [
        "Loaded plugins: fastestmirror\nLoading mirror speeds from cached hostfile\n * base: mirror.netsite.dk\n * elrepo: mirrors.leadhosts.com\n * epel: mirrors.nav.ro\n * extras: centos.mirrors.telekom.ro\n * remi-php70: mirrors.uni-ruse.bg\n * remi-safe: mirrors.uni-ruse.bg\n * updates: centos.mirror.iphh.net\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n========================================================================\n Package         Arch              Version                Repository       Size\n========================================================================\nInstalling:\n ncdu            x86_64            1.14-1.el7             epel             51 k\n\nTransaction Summary\n========================================================================\nInstall  1 Package\n\nTotal download size: 51 k\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Installing : ncdu-1.14-1.el7.x86_64                                       1/1 \n  Verifying  : ncdu-1.14-1.el7.x86_64                                       1/1 \n\nInstalled:\n  ncdu.x86_64 0:1.14-1.el7                                                      \n\nComplete!\n"
    ]
}

Ansible ad-hoc команди

Пояснення:

  1. У цьому прикладі використовується модуль Yum
  2. Він визначає аргументи модуля, і в цьому випадку ви виберете назву пакета та його стан. Наприклад, якщо стан відсутній, пакет буде обшуканий і, якщо знайдений, видалений
  3. Коли позначено жовтим кольором, ви побачите результат команди ansible зі зміненим станом, тобто в цьому випадку пакунок знайдено та встановлено.
  4. Статус команди встановлення yum, виданої через ansible. У цьому випадку встановлено пакет ncdu.x86_64 0:1.14-1.el7.

Звичайно, всі параметри інсталятора yum можна використовувати через Ansible, включаючи оновлення, встановлення, останню версію та видалення.

У наведеному нижче прикладі та сама команда виконується для видалення попередньо встановленого пакета ncdu.

[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=absent'
host1 | SUCCESS => {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [
        "Loaded plugins: fastestmirror\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be erased\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n========================================================================\n Package         Arch              Version               Repository        Size\n========================================================================\nRemoving:\n ncdu            x86_64            1.14-1.el7            @epel             87 k\n\nTransaction Summary\n========================================================================\nRemove  1 Package\n\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Erasing    : ncdu-1.14-1.el7.x86_64                                       1/1 \n  Verifying  : ncdu-1.14-1.el7.x86_64                                       1/1 \n\nRemoved:\n  ncdu.x86_64 0:1.14-1.el7                                                      \n\nComplete!\n"
    ]
}
host2 | SUCCESS => {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [
        "Loaded plugins: fastestmirror\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be erased\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n========================================================================\n Package         Arch              Version               Repository        Size\n========================================================================\nRemoving:\n ncdu            x86_64            1.14-1.el7            @epel             87 k\n\nTransaction Summary\n========================================================================\nRemove  1 Package\n\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Erasing    : ncdu-1.14-1.el7.x86_64                                       1/1 \n  Verifying  : ncdu-1.14-1.el7.x86_64                                       1/1 \n\nRemoved:\n  ncdu.x86_64 0:1.14-1.el7                                                      \n\nComplete!\n"
    ]
}

Ansible ad-hoc команди

Пояснення:

  1. Результат команди yum показує, що пакет було видалено.

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

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

Ansible ad-hoc команди

Ansible Playbooks

Ansible Playbooks – це спосіб надсилання команд до віддалених систем за допомогою скриптів. Плейбуки налаштовують складні системні середовища та підвищують гнучкість, запускаючи один скрипт на одній або кількох системах. Вони поводяться радше як мова конфігурації, ніж як мова програмування.

Команди плейбуку використовують формат YAML, тому синтаксису потрібно мало, але відступи слід дотримуватися. Як випливає з назви, плейбук – це набір ігор. За допомогою плейбуку можна призначати певні ролі деяким хостам та різні ролі іншим, керуючи багатьма серверами в одному файлі.

Перш ніж продовжити розгляд прикладів плейбуків, варто визначити завдання. Завдання – це інтерфейс до модулів Ansible для ролей та плейбуків.

Тепер розглянемо гру Ansible з однією грою, яка містить кілька завдань, як показано нижче:

---

- hosts: group1
  tasks:
  - name: Install lldpad package
    yum:
      name: lldpad
      state: latest
  - name: check lldpad service status
    service:
      name: lldpad
      state: started

Ansible Playbooks

У наведеному вище плейбуці хости групи group1 у файлі hosts призначені для встановлення пакета lldpad за допомогою модуля yum. Служба lldpad, створена після встановлення, потім запускається за допомогою модуля service, який здебільшого взаємодіє з ансамблем systemd.

Пояснення:

  1. Група хостів, на яких запускатиметься п’єса
  2. Модуль Yum використовується в цьому завданні для встановлення lldpad
  3. Сервісний модуль використовується, щоб перевірити, чи працює служба після встановлення

Кожен плейбук Ansible працює з файлом інвентаризації. Файл інвентаризації містить список серверів, розділених на групи, що забезпечує кращий контроль над такими деталями, як IP-адреса та SSH-порт для кожного хоста.

Файл інвентаризації для цього прикладу плейбуку виглядає наступним чином. Є дві групи, group1 та group2, кожна з яких містить host1 та host2 відповідно.

[group1]
host1 ansible_host=192.168.100.2 ansible_ssh_port=22
[group2]
host2 ansible_host=192.168.100.3 ansible_ssh_port=22

Ansible Playbooks

Пояснення:

  1. Назва групи
  2. Ім’я хосту з IP-адресою та портом ssh, у цьому випадку стандартним, 22.

Наступний приклад плейбуку Ansible містить два відтворення для двох груп хостів. Для першої групи, group1, SELinux увімкнено, і коли його ввімкнено, на екрані хоста з'являється повідомлення.

Для другої групи пакет httpd встановлюється лише якщо ansible_os_family — це RedHat, а ansible_system_vendor — HP.

ansible_os_family та ansible_system_vendor – це змінні, зібрані за допомогою опції gather_facts, і їх можна використовувати як у цьому умовному прикладі.

---

- hosts: group1
  tasks:
  - name: Enable SELinux
    selinux:
      state: enabled
    when: ansible_os_family == 'Debian'
    register: enable_selinux

  - debug:
      Imsg: "Selinux Enabled. Please restart the server to apply changes."
    when: enable_selinux.changed == true

- hosts: group2
  tasks:
  - name: Install apache
    yum:
      name: httpd
      state: present
    when: ansible_system_vendor == 'HP' and ansible_os_family == 'RedHat'

Ansible Playbooks

Пояснення:

  1. Приклад пропозиції when, у цьому випадку, коли тип ОС – Debian. Змінна ansible_os_family збирається за допомогою функції gather_facts.
  2. Вихід завдання зареєстровано для майбутнього використання під назвою enable_selinux
  3. Інший приклад речення when. У цьому випадку для користувача хоста буде показано повідомлення, якщо SELinux справді було ввімкнено раніше.
  4. Ще один приклад речення when, що складається з двох правил

Окрім завдань, існують також спеціальні завдання, які називаються обробниками. Обробник повинен мати унікальне ім'я в усьому плейбуку. Обробники працюють як звичайні завдання, але обробник може бути повідомлений через сповіщувач.

Якщо обробник не отримує сповіщення під час виконання плейбуку, він не виконується. Однак, якщо обробник сповіщається про кілька завдань, він виконується лише один раз після завершення всіх завдань.

У наведеному нижче прикладі певне завдання має розділ сповіщення, який викликає інше завдання. Якщо вивід першого завдання змінюється, викликається завдання-обробник. Типовим прикладом є зміна файлу конфігурації, а потім перезапуск відповідної служби.

---

- hosts: group2
  tasks:
  - name: sshd config file modify port
    lineinfile:
     path: /etc/ssh/sshd_config
     regexp: 'Port 28675'
     line: '#Port 22'
    notify:
       - restart sshd
handlers
    - name: restart sshd
      service: sshd
        name: sshd
        state: restarted

У цьому випадку, якщо перше завдання, «sshd config file modify port», змінюється, тобто порт вже не дорівнює 28675, порт змінюється, і завдання повідомляє обробник з такою ж назвою, що перезапускає службу sshd.

Ansible Playbooks

Пояснення:

  1. Приклад сповіщувача
  2. Приклад обробника

Анзибні ролі

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

Ролі зберігаються в окремих каталогах і дотримуються певної структури каталогів.

[root@ansible-server test2]# tree
.
`-- role1
    |-- defaults
    |   `-- main.yml
    |-- handlers
    |   `-- main.yml
    |-- meta
    |   `-- main.yml
    |-- README.md
    |-- tasks
    |   `-- main.yml
    |-- tests
    |   |-- inventory
    |   `-- test.yml
    `-- vars
        `-- main.yml

7 directories, 8 files

YAML-файл у каталозі defaults містить змінні за замовчуванням, що використовуються з плейбуком. Категорія handlers зберігає обробники, а каталог meta містить інформацію про залежності автора та ролі. Каталог tasks містить основний YAML-файл для ролі.

Директорія tests містить зразок плейбуку YAML та зразок файлу інвентаризації, і вона здебільшого використовується для тестування перед створенням фактичної ролі.

Директорія vars містить YAML-файл, де визначено всі змінні, що використовуються роллю. Директорії templates та files містять шаблони та файли, що використовуються завданнями в ролі.

Щоб створити дерево каталогів для ролі, скористайтеся такою командою, вказавши ім'я ролі як останній параметр:

[root@ansible-server test2]# ansible-galaxy init role1

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

У наступному прикладі показано, як виглядає базовий шаблон Jinja2 та як його використовувати в ролі.

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

{% for resolver in resolver_ip_addresses %}
nameserver {{ resolver }}
{% endfor %}

options timeout:1
options attempts:5
options rotate

У цьому прикладі каталог playbook визначає кілька змінних, зокрема resolver_ip_addresses, з різними значеннями залежно від центру обробки даних.

- name: Set resolver for server
  template:
    src: dns.j2
    dest: /etc/resolv.conf
    group: root
    owner: root
    mode: "0644"
    tag: resolver

Анзибні ролі

Пояснення:

  1. Назва шаблону, який буде використовуватися. Шаблон знаходиться в каталозі шаблонів у шляху ролі
  2. Шлях призначення імені файлу, який буде замінено на шаблон, на стороні клієнта.
  3. Дозволи цільового файлу

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

Ansible Case Study

У цьому розділі ми аналізуємо тематичне дослідження базового посібника з Ansible, який має три ролі. Мета полягає в тому, щоб навести практичний приклад концепцій, розглянутих досі. Деякі попередні приклади з цього посібника адаптовані та повторно використані в цьому посібнику.

Нижче наведено структуру каталогів плейбуку. Використаний YAML-файл — p4.yml.

[root@ansible-server test_ansible]# ls -lrth
total 16K
-rw-r--r--. 1 root root   0 Jul  3 10:13 testfile
-rw-r--r--. 1 root root 203 Jul  3 13:30 p1.yml
-rw-r--r--. 1 root root 125 Jul  3 15:00 hosts
-rw-r--r--. 1 root root 488 Jul  3 16:40 p2.yml
-rw-r--r--. 1 root root 188 Jul  4 17:33 p4.yml
drwxr-xr-x. 5 root root  47 Jul  4 17:35 roles
[root@ansible-server test_ansible]# cd roles
[root@ansible-server roles]# ls -lrth
total 12K
drwxr-xr-x. 9 root root 4.0K Jul  4 12:52 httpd
drwxr-xr-x. 9 root root 4.0K Jul  4 13:55 selinux
drwxr-xr-x. 9 root root 4.0K Jul  4 16:54 resolver

У плейбуці є три ролі. Роль resolver встановлює певний сервер імен на серверах, копіюючи файл до місця призначення /etc/resolv.conf. Роль httpd встановлює пакет httpd з модулем yum, а третя роль вмикає SELinux та повідомляє зареєстрованого користувача про необхідність перезавантаження системи. Кожна роль була створена за допомогою команди ansible-galaxy.

Роль розв’язувача, завдання main.yml:

Ansible Case Study

Роль Httpd, завдання main.yml:

Ansible Case Study

Роль Selinux, завдання main.yml:

Ansible Case Study

Нижче наведено плейбук p4.yml. Він працює на всіх хостах, якщо не вказано інше в командному рядку, запускається від імені користувача root на порту 22 (SSH), збирає інформацію перед запуском ролей та запускає всі три ролі. Кожну роль можна запустити незалежно, вказавши її тег у командному рядку ansible-playbook за допомогою параметра -t.

---

- hosts: all
  user: root
  port: 22
  gather_facts: True
  roles:
    - { role: selinux, tags: selinux }
    - { role: httpd, tags: httpd }
    - { role: resolver, tags: resolver }

Потім ви можете запустити плейбук p4.yml на двох хостах та інтерпретувати вивід. Цю саму команду можна виконати з параметром –check для пробного запуску та з параметром -k, коли потрібно використовувати автентифікацію за паролем.

Ansible Case Study

Пояснення:

  1. Команда Ansible-playbook, яка запускає p4.yml
  2. Playbook пропускає роль SELinux, оскільки її вже ввімкнено.
  3. Ansible виявив, що httpd-пакет уже встановлено, тому він повертає нормально.
  4. Резолвер було налаштовано, а роль розв’язувача змінилася.

Шпаргалка Ansible Commands

Встановіть репозиторій EPEL на системах Centos/RHEL

[root@ansible-server ~]# sudo yum install epel-release

Встановіть пакет ansible на системах Centos/RHEL

[root@ansible-server ~]# sudo  yum install -y ansible

Виконайте оновлення пакетів у Debian/Ubuntu системи

$ sudo apt update

Встановіть загальний пакунок software-properties-common на Debian/Ubuntu системи

$ sudo apt install software-properties-common

Встановіть особистий архів пакетів ansible на Debian/Ubuntu системи

$ sudo apt-add-repository ppa:ansible/ansible

Встановити ansible на Debian/Ubuntu системи

$ sudo apt update
$ sudo apt install ansible

Випуск а ping команда на всіх серверах, визначених у файлі інвентаризації з назвою hosts

[root@ansible-server test_ansible]# ansible -i hosts all -m ping

Випуск а ping команда лише на хості2

[root@ansible-server test_ansible]# ansible -i hosts all -m ping --limit host2

Скопіюйте файл «testfile» на всі хости у файлі інвентаризації

[root@ansible-server test_ansible]# ansible -i hosts all -m copy -a "src=/root/test_ansible/testfile dest=/tmp/testfile"

Встановіть пакет ncdu на всіх хостах

[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=present'

Видаліть пакет ncdu на всіх хостах

[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=absent'

Створіть структуру каталогів для ролі під назвою role1.

[root@ansible-server test2]# ansible-galaxy init role1

Посібник із застосуванням p4.yml

[root@ansible-server test_ansible]# ansible-playbook -i hosts p4.yml --check

Запустіть p4.yml playbook з автентифікацією пароля для всіх хостів

[root@ansible-server test_ansible]# ansible-playbook -i hosts p4.yml -k

Поширені запитання

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

Плейбуки Ansible написані мовою YAML, яка є зрозумілою для людини та залежить від відступів, а не від дужок. Шаблони використовують мову шаблонів Jinja2, тоді як факти та змінні дозволяють одному плейбуку адаптуватися до багатьох хостів. Для початку роботи не потрібні знання загального програмування.

Ansible працює без агентів та на основі push-повідомлень, надсилаючи зміни через SSH. Ляльковий та Chef зазвичай базуються на агентах та пул-орієнтації. Ansible використовує YAML, тоді як Chef використовує Ruby, а Puppet — власний DSL. Багато команд обирають Ansible через його нижчу криву навчання.

Так. Ansible — це безкоштовний движок з відкритим вихідним кодом, ліцензований GNU GPL, який підтримується Red Hat та великою спільнотою. Основний рушій та тисячі модулів не коштують нічого. Red Hat також продає Ansible Automation Platform, платний продукт, який додає графічний інтерфейс, доступ на основі ролей та підтримку.

Так. Окрім хостів Linux та Unix, до яких можна отримати доступ через SSH, Ansible також керує Windows вузли через WinRM з використанням виділених Windows модулі. Він може встановлювати пакети, редагувати реєстр, керувати службами та запускати PowerShell, тому змішаний Linux та Windows Автопарки автоматизовані з одного вузла керування.

Ansible Galaxy — це публічний центр для обміну та завантаження ролей і колекцій спільноти. Команда ansible-galaxy створює структуру каталогів ролі та встановлює опубліковані ролі, тож ви можете повторно використовувати перевірену автоматизацію, замість того, щоб писати кожен плейбук з нуля.

Помічники ШІ можуть створювати плейбуки YAML на основі запитів простою мовою, пояснювати незнайомі модулі та пропонувати виправлення для невдалих завдань або синтаксичних помилок. Вони також можуть конвертувати скрипти оболонки в ідемпотентні завдання. Завжди перевіряйте згенеровані плейбуки на правильність назв модулів та ідемпотентність перед їх запуском.

Так. Копілот GitHub автоматично завершує завдання плейбуку, записи інвентаризації та шаблони Jinja2 з короткого коментаря або імені файлу. Розглядайте його вивід як відправну точку та перевіряйте відступи, параметри модулів та назви змінних, оскільки згенерований YAML може посилатися на застарілий синтаксис або неіснуючі модулі.

Підсумуйте цей пост за допомогою: