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