Ansible — это широко используемый инструмент управления конфигурацией, который упрощает управление несколькими серверами. Он оптимизирует такие задачи, как настройка серверов и установка программ, благодаря автоматизации, которая позволяет обрабатывать многочисленные удаленные серверы и последовательно выполнять задачи с центрального узла. Кроме того, Ansible популярен благодаря многочисленным модулям и способности бесперебойно работать через SSH без необходимости установки дополнительного программного обеспечения на целевых серверах.

В этом руководстве мы узнаем, как выполнять команды на удаленных серверах с помощью модуля Ansible Shell. Кроме того, мы также рассмотрим, как выполнять команды Ansible ad-hoc и создавать плейбук для выполнения различных команд оболочки.

Необходимые условия

Для использования модуля Ansible Shell необходимо выполнить следующие условия:

  1. В этом руководстве мы используем Ubuntu 22.04. Итак, Ansible должен быть установлен и настроен в вашей системе Ubuntu.
  2. Необходимо настроить удаленный хост, на котором вы будете выполнять команды с помощью модуля оболочки Ansible.

Что такое модуль оболочки Ansible?

Модуль оболочки Ansible позволяет пользователям выполнять команды в оболочке целевых систем. Он позволяет пользователям выполнять сложные команды с использованием трубопроводов и перенаправления на удаленных целях, сохраняя оригинальность выполнения команды.

При выполнении команд в модуле оболочки Ansible он берет имя команды, параметры или аргументы, разделенные разделителями пробелов, и выполняет эти команды на удаленных хостах.

Отличие: модуль оболочки Ansible и модуль команд

Модуль оболочки Ansible и модуль команд достаточно похожи и дают одинаковые результаты. Однако между этими двумя модулями существует несколько отличий, которые мы перечислили ниже:

  1. Модуль оболочки Ansible поддерживает все специальные операторы, переменные среды, конвейеры и перенаправления. В то же время модули команд не поддерживают операторы (<, >, &,;, | |), переменные среды и конвейеры.
  2. Модуль команд не позволяет пользователям выполнять команды непосредственно в оболочке. В этом случае модуль оболочки Ansible предлагает большую гибкость, чем модуль команд. С помощью модуля оболочки вы можете напрямую выполнять команды в оболочке целевых хостов. По умолчанию для выполнения команд используется оболочка «/bin/sh». Вы также можете настроить другие оболочки для выполнения команд на удаленных хостах.
  3. Пользователи 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:

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

После запуска вышеуказанного плейбука вы заметите, что 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