Выполнение команд на удаленных серверах с помощью модуля 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