Ansible: 30 модулів для Senior DevOps інженерів (Частина 1)
Одна із задач DevOps інженера — автоматизація всього, що можна. Автоматизувати доставлення, настройку та розгортання застосунків можна з Ansible. Це ПЗ, що дозволяє управляти конфігурацією, оркеструвати, централізовано встановлювати застосунки та паралельно виконувати типові завдання на групі систем.
Щоб використовувати його на повну потужність, варто ознайомитися з модулями та їх використанням. Знайшли та переклали корисний матеріал, що допоможе розібратися у темі.
Модулі — окремі одиниці коду, які можна використовувати з командного рядка або в плейбуці, щоб змінити цільовий вузол або отримати з нього певну інформацію. Ansible виконує кожен модуль на віддаленій ноді та повертає необхідні значення. Модулі також називають плагінами завдань або бібліотек.
Є кілька найважливіших модулів Ansible, які часто використовують для автоматизації різних завдань. Їх досить багато, тож цю тему ми розділимо на три частини.
Зараз ми розглянемо модулі для:
- перевірки підключення хосту та цільового вузла,
- отримання інформації з ноди,
- встановлення та керування пакетами,
- запуску на вузлах базових команд та сценаріїв.
Нумо досліджувати!
ping
Цей модуль використовують для перевірки підключення до віддаленого хосту та часто, щоби перевірити python на ньому. Також підходить для перегляду входів у систему та прав користувача.
---
- name: ping module
hosts: all
become: false
tasks:
- name: test connection
ping:
В результаті отримаєте:
host-1 | SUCCESS => {
“ansible_facts”: {
“discovered_interpreter_python”: “/usr/bin/python”
},
“changed”: false,
“ping”: “pong”
}
Що важливо знати про модуль ping:
- Він не підходить для ICMP, проте працює за замовчуванням на SSH або будь-якому іншому визначеному методі підключення.
- Ping приймає дані та видає значення pong, crash або інший рядок.
- Значення за замовчуванням — pong. Це означає, що все добре.
- У випадку невдачі, дані отримають значення crash, а модуль видасть виняток.
setup
Setup допомагає зібрати дані про ноди — ім’я хосту, ip-адресу, інформацію про операційну систему та інші.
Цей модуль автоматично викликає плейбук, щоб зібрати корисні змінні про віддалений хост. Користувач отримує інформацію у зручному форматі JSON, де всі значення починаються з «ansible_».
ansible host-1 -m setup -u ec2-user
Команда приведе до такого результату:
Ви також можете фільтрувати результат за допомогою параметра filter:
ansible all -m setup -u ec2-user -a 'filter=ansible_os_family'
yum
Цей модуль знадобиться, щоб встановлювати різні пакунки або ПЗ на версіях Linux, заснованих на Red Hat.
---
- name: Update Package on linux system
hosts: all
become: yes
tasks:
- name: Uninstall Apache
yum:
name: nginx
state: absent
- name: Install a list of packages with a list variable
yum:
name: "{{ packages }}"
vars:
packages:
- httpd
- httpd-tools
apt
Модуль для керування програмним забезпеченням в Linux на основі Debian.
---
- name: Update Package on debian system
hosts: all
become: yes
tasks:
- name: Run the equivalent of "apt-get update" as a separate step
apt:
update_cache: yes
- name: Install latest version of "openjdk-6-jdk"
apt:
name: openjdk-6-jdk
state: latest
install_recommends: no
package
Модуль package керує пакетами на цільовій ноді. При цьому він не вказує модуль менеджера пакунків — lyum, apt або інший. Його зручно використовувати у різнорідному середовищі машин, адже вам не треба створювати конкретне завдання для кожного менеджера пакетів. Він діє як проксі базового модуля менеджера пакетів.
---
- name: Update Packages on target system
hosts: all
become: yes
tasks:
- name: Install ntpdate
ansible.builtin.package:
name: ntpdate
state: present
- name: Install the latest version of Apache and MariaDB
ansible.builtin.package:
name:
- httpd
- mariadb-server
state: latest
pip
Використовують для керування пакунками python у цільовій системі.
---
- name: Update python packages
hosts: all
become: yes
tasks:
- name: Install multi python packages with version specifiers
pip:
name:
- django>1.11.0,<1.12.0
- bottle>0.10,<0.20,!=0.11
- name: Install specified python requirements
pip:
requirements: /my_app/requirements.txt
npm
Цей модуль використовують для керування пакетами node.js. Він не входить до базових модулів Ansible. Щоб використати його у плейбуці, вкажіть community.general.npm.
---
- name: npm module
hosts: all
tasks:
- name: Install "coffee-script" node.js package.
community.general.npm:
name: coffee-script
path: /app/location
- name: Install packages based on package.json.
community.general.npm:
path: /app/location
raw
Цей модуль дозволяє виконати команду SSH із низьким рівнем доступу. Це корисно у декількох випадках. Найпопулярніший варіант — для встановлення python у системі, у якій його немає. Інший варіант використання: для спілкування з пристроями, наприклад, маршрутизаторами, на яких не встановлено python.
В інших випадках краще використовувати модулі shell або command. Аргументи, які отримує raw, запускаються безпосередньо через налаштовану віддалену оболонку.
---
- name: raw module usage
hosts: all
become: yes
tasks:
- name: Bootstrap a host without python2 installed
raw: dnf install -y python2 python2-dnf libselinux-python
- name: Run a command that uses non-posix shell-isms (in this example /bin/sh doesn't handle redirection and wildcards together but bash does)
raw: cat < /tmp/*txt
args:
executable: /bin/bash
command
Використовуйте цей модуль для того, щоб виконати команди на віддаленому вузлі. Здебільшого мова про прості команди Linux. Тут вони не обробляються через оболонку, тож змінні, як $HOSTNAME, та операції «*», «<», «>», «|», «;» і «&» не працюватимуть.
Для таких цілей у Windows підійде модуль win_command.
---
- name: command module
hosts: all
tasks:
- name: Run command if /path/to/database does not exist (without 'args')
command: /usr/bin/make_database.sh db_user db_name creates=/path/to/database
- name: Run command if /path/to/database does not exist (with 'args' keyword)
ansible.builtin.command: /usr/bin/make_database.sh db_user db_name
args:
creates: /path/to/database
shell
Модуль задуманий, щоб виконувати команди оболонки на цільових хостах на основі Unix. На противагу модулю command, shell приймає дуже складні команди з каналами та редиректами.
Цей модуль підходить лише для машин на базі Linux. Для Windows є win_powershell.
---
- name: shell module
hosts: all
tasks:
- name: This command will change the working directory to somedir/ and will only run when somedir/somelog.txt doesn't exist
shell: somescript.sh >> somelog.txt
args:
chdir: somedir/
creates: somelog.txt
- name: This command will change the working directory to somedir/
shell:
cmd: ls -l | grep log
chdir: somedir/
- name: Run a command that uses non-posix shell-isms (in this example /bin/sh doesn't handle redirection and wildcards together but bash does)
shell: cat < /tmp/*txt
args:
executable: /bin/bash
script
Script використовують, щоб запустити локальний сценарій на віддаленій ноді. Коли ми викликаємо модуль shell і надаємо йому локальний сценарій оболонки, спершу він передає його ноді, а потім виконує. Модулю script не потрібен python на віддаленому вузлі, а сценарій виконується через оболонку.
Вузли на основі Windows теж підтримують цей модуль.
---
- name: script module
hosts: all
tasks:
- name: Run a script with arguments (free form)
ansible.builtin.script: /some/local/script.sh --some-argument 1234
- name: Run a script with arguments (using 'cmd' parameter)
ansible.builtin.script:
cmd: /some/local/script.sh --some-argument 1234
Висновок
Тепер ви знаєте 11 модулів Ansible, що допоможуть автоматизувати різні завдання. Інші 29 розглянемо у наступних публікаціях. Якщо хочете дізнатись більше про це програмне забезпечення або покращити свої навички вже зараз — радимо звернути увагу на наш курс «Адміністрування та автоматизація за допомогою Ansible».
За три тижні навчимо встановлювати та налаштовувати оточення Ansible, створювати плейбуки з нуля та застосовувати їх на практиці, працювати з модулями й Ansible Galaxy, писати ролі, налаштовувати їх змінні, а також застосовувати в роботі Ansible AWX.
Мерщій до нових навичок! 😎