Виконання команд на віддалених серверах за допомогою модуля оболонки Ansible
Ansible - це широко розповсюджений інструмент керування конфігурацією, який спрощує керування кількома серверами. Він спрощує такі завдання, як налаштування сервера та встановлення додатків, завдяки автоматизації, дозволяючи вам керувати численними віддаленими серверами та послідовно запускати завдання з центрального вузла ядра. Крім того, Ansible популярний завдяки численним модулям і здатності безперешкодно працювати через SSH без необхідності встановлення додаткового програмного забезпечення на цільових серверах.
У цьому уроці ми навчимося запускати команди на віддалених серверах за допомогою модуля оболонки Ansible. Крім того, ми також розглянемо, як запускати спеціальні команди Ansible і створити плейбук для виконання різних команд оболонки.
Необхідні умови
Для використання модуля оболонки Ansible вам потрібно мати такі передумови:
- У цьому посібнику ми використовуємо Ubuntu 22.04. Отже, Ansible має бути встановлений і налаштований у вашій системі Ubuntu.
- Слід налаштувати віддалений хост, на якому ви будете виконувати команди за допомогою модуля оболонки Ansible.
Що таке модуль оболонки Ansible?
Модуль оболонки Ansible дозволяє користувачам виконувати команди в командній оболонці цільових систем. Він дозволяє запускати складні команди з використанням труб і перенаправлення на віддалених об'єктах зі збереженням оригінальності виконання команди.
Під час запуску команд у модулі командного інтерпретатора Ansible, він приймає ім'я команди, параметри або аргументи, розділені роздільниками білого простору, і виконує ці команди на віддалених хостах.
Різниця: Модуль оболонки Ansible проти командного модуля
І модуль оболонки Ansible, і командний модуль досить схожі і дають однакові результати. Однак, між цими двома модулями існує декілька відмінностей, які ми перерахували нижче:
- Модуль оболонки Ansible підтримує всі спеціальні оператори, змінні середовища, канали та перенаправлення. Тоді як командні модулі не підтримують оператори(<, >, &,;, | |), змінні оточення і канали.
- Командний модуль не дозволяє користувачам виконувати команди безпосередньо у командному рядку. У цьому випадку модуль оболонки Ansible пропонує більшу гнучкість, ніж командний модуль. За допомогою модуля оболонки ви можете безпосередньо виконувати команди в командному рядку цільових хостів. За замовчуванням для запуску команд використовується оболонка «/bin/sh». Ви також можете налаштувати інші оболонки для запуску команд на віддалених хостах.
- Користувачі Ansible вважають за краще використовувати командні модулі з точки зору безпеки при виконанні команд на цільових системах. Команди, що виконуються у командному модулі Ansible, безпечніші і пропонують більш передбачувані варіанти, ніж у модулі оболонки Ansible. Крім того, командний модуль не впливає на віддалене середовище оболонки користувача.
Початок роботи з командами оболонки Ansible: Запуск спеціальних команд
Спеціальні команди - це однорядкові команди, які не можна повторно використовувати у майбутньому. Однак, ви можете використовувати спеціальні команди оболонки Ansible для швидкого запуску окремих завдань. Нижче наведено базовий синтаксис спеціальних команд:
ansible [pattern] -m [ansible-module] -a {commands with options}
У наведеному вище синтаксисі шаблон представляє групу хостів, до якої належить цільовий хост. Опція '-m' вказує тип модуля, а опція '-a ' отримує аргументи команди.
Давайте розглянемо приклад для пояснення синтаксису команди Ansible Ad-hoc. У цьому прикладі ми спробуємо відобразити дату і час цільового хоста. Тут ми підключилися лише до одного хоста і створили окремого користувача «ansible». Для відображення дати і часу віддаленого хоста скористайтеся наступною командою:
$ ansible 192.168.1.14 -u ansible -m shell -a «timedatectl»
Наведена вище спеціальна команда Ansible з'єднається з віддаленим хостом за IP-адресою «192.168.1.14», використовуючи ім'я користувача «ansible» по SSH. Після цього на віддаленому хості буде виконано команду «timedatectl», яка використовується для відображення інформації про налаштування дати і часу системи.
$ ansible <ip-address> -u ansible -m shell -a “timedatectl | grep Time”
За допомогою наведеної вище спеціальної команди ansible виконає команду «timedatectl», а потім за допомогою команди grep відфільтрує і покаже рядки, що містять «Time».
Аналогічно, ви можете відобразити системну інформацію за допомогою команди «uptime» і середнє завантаження. Для цього скористайтеся наступною командою:
$ ansible <ip-address> -u ansible -m shell -a “uptime”
Коли ви запустите наведену вище команду оболонки Ansible, вона виконає команду uptime після з'єднання з віддаленим хостом.
$ ansible <ip-address> -u ansible -m shell -a setup
Наведена вище команда слугує для збору системних фактів та інформації про віддалений хост за допомогою Ansible.
Як користуватися модулем оболонки Ansible?
Перш ніж запускати команди оболонки Ansible, важливо знати основні параметри оболонки, які вам потрібно буде передати під час використання модуля оболонки Ansible:
chdir - змінює поточний каталог перед виконанням команди.
cmd - Рядок, що містить команду для запуску разом з усіма пов'язаними з нею аргументами.
executable - Вимагає вказати абсолютний шлях для зміни оболонки, яку використовує користувач.
removes - Приймає ім'я файлу і використовується для виключення кроків, якщо файлу не існує.
stdin - Дозволяє користувачеві встановити для параметра «stdin» команди певне значення.
warn - Приймає (за замовчуванням) значення «так» або «ні», вмикаючи або вимикаючи попередження про завдання.
Після цього, давайте розглянемо деякі приклади використання оболонки Ansible.
Команди запуску Ansible за допомогою модуля оболонки
Справжньою силою Ansible є використання плейбуків, які дозволяють виконувати розширені завдання на цільових хостах. Окрім використання спеціальних команд, ви також можете використовувати модуль оболонки Ansible у плейбуках для визначення завдань для віддалених хостів.
Запуск однієї команди за допомогою модуля оболонки Ansible
Ви також можете запустити окрему команду за допомогою модуля оболонки Ansible. Для цього створіть плейбук і вставте у цей файл наступні рядки коду:
- name: Shell module example hosts: database_servers tasks: - name: Check system information shell: "df -h" register: "os_info" - debug: msg: "{{"os_info".stdout_lines}}"
Тепер збережіть зміни у цьому файлі і вийдіть з нього за допомогою «Ctrl+X». Після цього запустіть цей плейбук за допомогою наступної команди:
$ ansible-playbook --ask-become-pass -i hosts environment_var.yml
Після запуску наведеної вище команди у вікні терміналу ви побачите наступну інформацію:
Запуск декількох команд у Ansible за допомогою модуля оболонки
За допомогою Ansible ви можете запускати декілька завдань послідовно. Щоб створити плейбук Ansible, створіть порожній файл у редакторі вихідного коду. У цьому посібнику ми використовуємо редактор nano для створення плейбука.
$ sudo nano testplaybook.yml
Наведена вище плейбук Ansible виконує різні завдання, такі як створення користувача, оновлення кешу пакунків і встановлення або оновлення пакунка Nginx на вказаному віддаленому цільовому хості. Він використовує змінні, щоб зробити плейбук більш гнучким і придатним для багаторазового використання.
Збережіть наведений вище файл за допомогою «Ctrl+O “ і вийдіть з нього за допомогою ”Ctrl+x».
Тут ми використовуємо власний файл інвентаризації «hosts». Щоб запустити цей плейбук, скористайтеся наступною командою:
$ ansible-playbook --ask-become-pass -i hosts testplaybook.yml
У наведеній вище команді «--ask-become-pass» попросить вас ввести пароль root, а потім виведе на екран наступний результат:
Встановлення пакунка з модулем оболонки Ansible
Ви також можете встановити пакунок на цільовому віддаленому хості. Розглянемо наступний приклад встановлення пакунків «apache2» на цільовий хост за допомогою Ansible:
hosts: database_servers become: yes tasks: name: apt: update_cache: yes name: встановити пакет apache2 apt: name: apache2
Після запуску наведеного вище сценарію ви побачите, що apache2 встановлено на віддалених серверах.
Запобігання командному втручанню в командний інтерпретатор
Як ми вже обговорювали раніше, командний модуль в Ansible вважається безпечнішим вибором для виконання команд на віддалених системах. Однак, він має певні обмеження з точки зору функціональності.
Для безпечного використання модуля оболонки ви можете застосувати техніку, яка називається «фільтрація лапок», щоб запобігти іменам змінних від потенційної ін'єкції команд. У наведеному нижче прикладі це продемонстровано на прикладі ін'єкції команд, щоб забезпечити безпеку ваших команд у командному рядку.
- 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 створює таблицю MySQL з унікальним ім'ям у вказаній базі даних, використовуючи фільтр лапок для захисту від потенційних проблем зі спеціальними символами в назві таблиці.
Висновок
Модуль оболонки Ansible - це гнучкий і надійний інструмент, який покращує контроль користувача і спрощує конфігурацію віддалених серверів. У цій статті ми розглянули, як використовувати модуль оболонки Ansible, його параметри та необхідні аргументи. Ми сподіваємося, що з цими знаннями ви зможете ефективно використовувати модуль оболонки Ansible у вашій системі Linux.
Blog