Виконання команд на віддалених серверах за допомогою модуля Ansible Shell

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

У цій статті ми розглянемо, як виконувати команди на віддалених серверах за допомогою модуля Ansible shell. Крім того, ми також розглянемо виконання ad-hoc команд Ansible та створення playbook для запуску різних shell-команд.

Передумови

Для використання модуля Ansible shell необхідно виконати такі умови:

У цьому посібнику використовується Ubuntu 22.04. Отже, Ansible має бути встановлений і налаштований у вашій системі Ubuntu.
Має бути налаштований віддалений хост, на якому ви будете виконувати команди за допомогою модуля Ansible shell.

Що таке модуль Ansible Shell?

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

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

Різниця: модуль Ansible Shell vs. модуль Command

Модулі Ansible shell і command є досить схожими та зазвичай дають однакові результати. Проте між ними існує кілька відмінностей, які наведено нижче:

Модуль Ansible shell підтримує всі спеціальні оператори, змінні середовища, конвеєри та перенаправлення. Натомість модуль command не підтримує оператори (<, >, &, ;, ||), змінні середовища та конвеєри.

Модуль command не дозволяє виконувати команди безпосередньо в оболонці. У цьому випадку модуль Ansible shell надає більшу гнучкість, оскільки дозволяє напряму виконувати команди в shell цільових хостів. За замовчуванням він використовує оболонку /bin/sh для виконання команд. Також можна налаштувати використання інших оболонок для запуску команд на віддалених хостах.

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

Початок роботи з командами Ansible Shell: виконання ad-hoc команд

Ad-hoc команди — це однорядкові команди, які не призначені для повторного використання в майбутньому. Однак за допомогою ad-hoc shell-команд Ansible можна швидко виконувати окремі завдання. Базовий синтаксис ad-hoc команд наведено нижче:

ansible [pattern] -m [ansible-module] -a {commands with options}

У наведеному вище синтаксисі pattern представляє групу хостів, до якої належить цільовий хост. Опція -m визначає тип модуля, а опція -a приймає аргументи команди.

Приклад використання ad-hoc команд Ansible

Розглянемо приклад, щоб пояснити синтаксис ad-hoc команд Ansible. У цьому прикладі ми спробуємо відобразити дату та час на цільовому хості.

$ ansible 192.168.1.14 -u ansible -m shell -a “timedatectl”

Наведена команда під’єднається до віддаленого хоста через SSH і виконає команду timedatectl для відображення налаштувань дати й часу.

$ ansible <ip-address> -u ansible -m shell -a “timedatectl | grep Time”

Ця команда відфільтрує та виведе лише рядки, що містять слово “Time”.

Отримання системної інформації

$ ansible <ip-address> -u ansible -m shell -a “uptime

Команда виконує uptime після підключення до віддаленого хоста.

$ ansible <ip-address> -u ansible -m shell -a setup

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

Як використовувати модуль Ansible Shell?

Перед виконанням shell-команд необхідно знати основні параметри:

chdir — змінює поточний каталог перед виконанням команди.
cmd — рядок з командою та аргументами.
executable — абсолютний шлях до оболонки.
removes — пропускає кроки, якщо файл не існує.
stdin — задає стандартний ввід команди.
warn — вмикає або вимикає попередження.

Запуск команд Ansible за допомогою модуля Shell

Основна перевага Ansible — використання playbook для виконання складних завдань на віддалених хостах.

Запуск однієї команди за допомогою модуля Ansible Shell

- name: Shell module example hosts: database_servers tasks: - name: Check system information shell: "df -h" register: "os_info" - debug: msg: "{{"os_info".stdout_lines}}"

Запуск playbook:

$ ansible-playbook --ask-become-pass -i hosts environment_var.yml

Запуск кількох команд за допомогою модуля Ansible Shell

$ sudo nano testplaybook.yml

Playbook виконує кілька завдань послідовно, використовуючи змінні для гнучкості.

$ ansible-playbook --ask-become-pass -i hosts testplaybook.yml

Встановлення пакета за допомогою модуля Ansible Shell

hosts: database_servers become: yes tasks: name: apt: update_cache: yes name: install apache2 package apt: name: apache2

Запобігання ін’єкціям shell-команд

Для безпечного використання модуля shell застосовується техніка quote filtering, яка захищає змінні від ін’єкцій.

- name: Create a table in the { database name } database `shell`: `mysql -u root -psecret -e "CREATE TABLE { quote| table name | quote } (id INT, name VARCHAR(255));"` become: yes - name: Ansible Quote Filter Example hosts: database servers vars: - database name: mydb - table name: my table

Висновок

Модуль Ansible shell є гнучким і потужним інструментом, який спрощує конфігурацію віддалених серверів і розширює можливості керування. Завдяки наведеним прикладам ви зможете ефективно використовувати модуль Ansible shell у своїй Linux-системі.

Blog