Выполнение команд на удаленных серверах с помощью модуля оболочки Ansible

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

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

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

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

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

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

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

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

Разница: Модуль оболочки Ansible против командного модуля

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

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

executing commands on remote servers with the ansible shell module

Приведенная выше специальная команда 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»

executing commands on remote servers with the ansible shell module

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

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

Приведенная выше команда служит для сбора системных фактов и информации об удаленном хосте с помощью Ansible.

executing commands on remote servers with the ansible shell module

Как пользоваться модулем оболочки Ansible?

Прежде чем запускать команды оболочки Ansible, важно знать основные параметры оболочки, которые вам нужно будет передать при использовании модуля оболочки Ansible:

chdir - изменяет текущий каталог перед выполнением команды.

cmd - строка, содержащая команду для запуска вместе со всеми связанными с ней аргументами.

executable - Требует указать абсолютный путь для изменения оболочки, используемой пользователем.

removes - Принимает имя файла и используется для исключения шагов, если файл не существует.

stdin - Позволяет пользователю установить для параметра «stdin» команды определенное значение.

warn - Принимает (по умолчанию) значение «да» или «нет», включая или выключая предупреждение о задании.

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

Команды запуска Ansible с помощью модуля оболочки

Настоящей силой Ansible является использование плейбуков, которые позволяют выполнять расширенные задачи на целевых хостах. Помимо использования специальных команд, вы также можете использовать модуль оболочки Ansible в плейбуках для определения задач для удаленных хостов.

Запуск одной команды с помощью модуля оболочки Ansible

Вы также можете запустить отдельную команду с помощью модуля оболочки Ansible. Для этого создайте плейбук и вставьте в этот файл следующие строки кода:

- имя: Shell module example
 hosts: database_servers
 задачи:
 - name: Проверка системной информации
 shell:
 «df -h»
 register: «os_info»
 - отладка:
 msg: «{{»os_info«.stdout_lines}}»

Теперь сохраните изменения в этом файле и выйдите из него с помощью «Ctrl+X». После этого запустите этот плейбук с помощью следующей команды:

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

После запуска приведенной выше команды в окне терминала вы увидите следующую информацию:

executing commands on remote servers with the ansible shell module

Запуск нескольких команд в Ansible с помощью модуля оболочки с помощью модуля оболочки

С помощью Ansible вы можете запускать несколько задач последовательно. Чтобы создать плейбук Ansible, создайте пустой файл в редакторе исходного кода. В этом руководстве мы используем редактор nano для создания плейбука.

$ sudo nano testplaybook.yml

executing commands on remote servers with the ansible shell module

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

Сохраните приведенный выше файл с помощью «Ctrl+O „ и выйдите из него с помощью “Ctrl+x».

Здесь мы используем собственный файл инвентаризации «hosts». Чтобы запустить этот плейбук, воспользуйтесь следующей командой:

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

В приведенной выше команде «--ask-become-pass» попросит вас ввести пароль root, а затем выведет на экран следующий результат:

Установка пакета с модулем оболочки Ansible с модулем оболочки

executing commands on remote servers with the ansible shell module

Вы также можете установить пакет на целевой удаленный хост. Рассмотрим следующий пример установки пакета «apache2 » на целевой хост с помощью Ansible:

hosts: database_servers
стать: да
задачи:
имя:
apt:
 update_cache: да
имя: установить пакет apache2
apt:
 имя: apache2

После запуска приведенного выше сценария вы увидите, что apache2 установлен на удаленных серверах.

executing commands on remote servers with the ansible shell module

Предотвращение командного вмешательства в командный интерпретатор

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

Для безопасного использования модуля оболочки вы можете применить технику, называемую «фильтрацией кавычек», чтобы предотвратить имена переменных от потенциальной инъекции команд. В приведенном ниже примере это продемонстрировано на примере вставки команд, чтобы обеспечить безопасность ваших команд в командной строке.

- имя: Создать таблицу в базе данных { имя базы данных }
 ``shell`: `mysql -u root -psecret -e «CREATE TABLE { quote| table name | quote } (id INT, name VARCHAR(255));»`
 стать: да
- имя: Пример фильтра цитат Ansible
 хосты: серверы баз данных
 vars:
 - имя базы данных: mydb
 - имя таблицы: my table

Приведенный выше пример Ansible создает таблицу MySQL с уникальным именем в указанной базе данных, используя фильтр кавычек для защиты от потенциальных проблем со специальными символами в названии таблицы.

Вывод

Модуль оболочки Ansible - это гибкий и надежный инструмент, который улучшает контроль пользователя и упрощает конфигурацию удаленных серверов. В этой статье мы рассмотрели, как использовать модуль оболочки Ansible, его параметры и необходимые аргументы. Мы надеемся, что с этими знаниями вы сможете эффективно использовать модуль оболочки Ansible в вашей системе Linux.

Blog