Блог "Дети ОИТа"
/поиск

Просмотр имени хоста (модуль command используется по умолчанию)

Ansible предоставляет два основных способа автоматизации: **playbook** для сложных, повторяемых сценариев и **ad-hoc команды** для быстрых одноразовых задач. Ad-hoc команды используют утилиту `ansible

Ansible предоставляет два основных способа автоматизации: playbook для сложных, повторяемых сценариев и ad-hoc команды для быстрых одноразовых задач. Ad-hoc команды используют утилиту ansible (не ansible-playbook) и позволяют выполнить одну задачу на одном или нескольких управляемых узлах без создания файла плейбука.

Ad-hoc команды незаменимы в следующих ситуациях:

  • Быстрая проверка: проверить доступность хостов (ping), получить информацию о системе (setup).
  • Массовые операции: перезагрузить группу серверов, скопировать файл конфигурации, установить обновление безопасности.
  • Диагностика: проверить занятость диска (df -h) или список процессов (ps aux) на группе серверов.
  • Обучение и тестирование: изучить работу модулей Ansible перед написанием плейбука.

1. Основы синтаксиса ad-hoc команд

Базовая структура команды выглядит так:

ansible <шаблон_хостов> -m <модуль> -a "<аргументы_модуля>" [глобальные_параметры]

Компоненты команды:

Часть Описание Пример
шаблон_хостов Целевые хосты или группы из инвентаря (inventory) all, webservers, "*.example.com", 192.168.1.10
-m Имя используемого модуля ping, shell, copy, community.general.nginx_status
-a Аргументы, передаваемые модулю (в кавычках) 'src=/etc/hosts dest=/tmp/hosts', 'df -h'
Глобальные параметры Дополнительные настройки подключения -u root (пользователь), -k (запрос пароля SSH), -b (become, повышение привилегий), -f 10 (количество параллельных процессов)

1.1. Настройка окружения

Перед использованием ad-hoc команд необходимо:

  1. Создать инвентарный файл (по умолчанию /etc/ansible/hosts или указать через -i):
    
    [webservers]
    web1.example.com
    web2.example.com
    [databases]
    db1.example.com
    db2.example.com
  1. Настроить подключение по SSH (пароль или ключи).

1.2. Первая команда: проверка доступности


ansible all -m ping -u admin -k
  • all — применяем ко всем хостам из инвентаря.
  • -m ping — используем модуль ping.
  • -u admin — подключаемся пользователем admin.
  • -k — запрашиваем пароль SSH.

Успешный ответ каждого хоста должен содержать "pong" .

2. Модули для выполнения команд

Это самая простая и гибкая категория модулей. Они позволяют выполнять произвольные команды на удаленных узлах.

2.1. Модуль command (модуль по умолчанию)

Модуль command используется, если параметр -m не указан. Он выполняет команду напрямую, без участия shell .

Особенности:

  • Не поддерживает shell-операторы: |, >, <, &, ; .
  • Поддерживает параметры: chdir (сменить директорию перед выполнением), creates (не выполнять, если файл существует), removes (выполнить, если файл существует) .

Примеры:



ansible all -a "hostname"

ansible webservers -m command -a "chdir=/home ls -la"

ansible all -m command -a "touch /tmp/flag.txt creates=/tmp/flag.txt"

2.2. Модуль shell

Модуль shell выполняет команду через оболочку /bin/sh на удаленном узле, поэтому поддерживает все возможности shell.

Особенности:

  • Поддерживает пайпы, перенаправление, переменные окружения.
  • Поддерживает те же параметры (chdir, creates, removes), что и command .
  • Предупреждение: при использовании shell нужно внимательно экранировать кавычки, чтобы локальный shell не интерпретировал их раньше времени .

Примеры:



ansible webservers -m shell -a "ps aux | grep nginx | wc -l"

ansible all -m shell -a "echo 'Hello from Ansible' > /tmp/welcome.txt"

ansible all -m shell -a "echo $HOME"

2.3. Модуль raw

Модуль raw выполняет команду через SSH напрямую, не требуя Python на удаленной стороне . Это «спасательный круг» для систем с минимальной установкой, где нет Python.

Особенности:

  • Не поддерживает параметры chdir, creates, removes.
  • Полезен для начальной установки Python или других критических компонентов .

Примеры:



ansible bare_metal_servers -m raw -a "yum install -y python3" -b

ansible all -m raw -a "cat /etc/os-release"

2.4. Модуль script

Модуль script копирует локальный скрипт с управляющей машины на удаленные узлы и выполняет его .

Особенности:

  • Скрипт не обязательно должен быть исполняемым на управляющей машине.
  • Поддерживает параметры chdir, creates, removes .
  • Результат выполнения скрипта возвращается на управляющую машину.

Примеры:







ansible all -m script -a "/home/user/scripts/check_disk.sh"

ansible all -m script -a "/home/user/scripts/init_server.sh creates=/etc/.initialized"

Таблица сравнения командных модулей :

Модуль Shell-операторы Параметры chdir и др. Требует Python Сценарий использования
command ❌ ✅ ✅ Простые команды без спецсимволов
shell ✅ ✅ ✅ Сложные команды с пайпами и редиректами
raw ✅ ❌ ❌ Системы без Python, bootstrapping
script ✅ (внутри скрипта) ✅ ✅ (на узле) Запуск сложных скриптов

3. Модули управления файлами и каталогами

3.1. Модуль copy

Копирует файл с управляющей машины на удаленные узлы .

Примеры:



ansible webservers -m copy -a "src=/etc/nginx/nginx.conf dest=/etc/nginx/nginx.conf backup=yes mode=0644 owner=root group=root"



3.2. Модуль fetch

Используется для копирования файлов с удаленных узлов на управляющую машину . Файлы сохраняются в директорию, организованную по именам хостов.



ansible webservers -m fetch -a "src=/var/log/nginx/access.log dest=/tmp/logs/ flat=no"

Параметр flat=yes сохранит все файлы в одну директорию, но будьте осторожны с перезаписью.

3.3. Модуль file

Управляет свойствами файлов, каталогов и символических ссылок .

Примеры:



ansible all -m file -a "path=/opt/myapp state=directory mode=0755"

ansible all -m file -a "path=/var/log/myapp.log state=touch mode=0644 owner=appuser"

ansible all -m file -a "path=/tmp/old_file state=absent"

ansible all -m file -a "src=/opt/app/current/bin/app dest=/usr/local/bin/app state=link"

3.4. Модуль lineinfile

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



ansible all -m lineinfile -a "path=/etc/hosts line='192.168.1.10 backup-server'"

ansible all -m lineinfile -a "path=/etc/selinux/config regexp='^SELINUX=' line='SELINUX=disabled'" -b

4. Модули управления пакетами и ПО

Ansible поддерживает менеджеры пакетов всех основных ОС.

4.1. Модуль yum (RHEL/CentOS/Fedora)



ansible webservers -m yum -a "name=nginx state=latest" -b

ansible webservers -m yum -a "name=nginx-1.20.1 state=present" -b

ansible all -m yum -a "name=telnet state=absent" -b

В нашем случае это должен быть общий модуль package или apt_rpm. Модуль package может работать без python3-module-rpm на управляемых машинах, в то время как apt_rpm - нет.

5. Модули управления сервисами

5.1. Модуль service (системы SysV init)



ansible webservers -m service -a "name=nginx state=started enabled=yes" -b

ansible webservers -m service -a "name=nginx state=restarted" -b

5.2. Модуль systemd (системы с systemd)



ansible all -m systemd -a "name=docker daemon_reload=yes state=started" -b

Более специализированный модуль для systemd, но service обычно работает с обеими системами.

6. Модули управления пользователями и группами

6.1. Модуль user



ansible all -m user -a "name=john uid=1040 group=users shell=/bin/bash home=/home/john" -b

ansible all -m user -a "name=john state=absent remove=yes" -b

6.2. Модуль group



ansible all -m group -a "name=developers state=present gid=5000" -b

7. Модули сбора информации (факты)

7.1. Модуль setup

Этот модуль собирает обширную информацию (факты) об управляемых узлах: ОС, сетевые интерфейсы, память, диски и т.д. .



ansible all -m setup

ansible all -m setup -a "filter=ansible_os_family"

ansible all -m setup -a "filter=ansible_default_ipv4"

8. Коллекция community.general

Начиная с Ansible 2.10, модули были организованы в коллекции. Коллекция community.general содержит огромное количество дополнительных модулей, поддерживаемых сообществом, для работы с самыми разными системами: базами данных, облачными провайдерами, мониторингом и т.д.

Установка коллекции (если не установлена по умолчанию):


ansible-galaxy collection install community.general

Модуль community.general.ufw (управление фаерволом UFW в Ubuntu)



ansible ubuntu_servers -m community.general.ufw -a "rule=allow port=22 proto=tcp" -b

ansible ubuntu_servers -m community.general.ufw -a "state=enabled policy=deny" -b

Модуль community.general.pacman (менеджер пакетов Arch Linux)



ansible arch_servers -m community.general.pacman -a "name=vim state=present" -b

Модуль community.general.dconf (управление настройками GNOME)



ansible desktop_servers -m community.general.dconf -a "key=/org/gnome/desktop/background/picture-uri value='file:///usr/share/backgrounds/my-wallpaper.jpg'"

9. Полезные практические приемы

9.1. Ограничение выполнения (--limit)

Выполнить команду только на части хостов группы :


ansible webservers -m shell -a "uptime" --limit web1.example.com,web2.example.com

9.2. Работа с несколькими процессами (--forks/-f)

Увеличение числа параллельных процессов ускоряет работу на большой инфраструктуре. По умолчанию используется 5 форков .



ansible all -m shell -a "df -h" -f 10

9.3. Повышение привилегий (--become/-b)

Для выполнения команд, требующих прав root .



ansible all -m yum -a "name=htop state=present" -b

ansible all -m service -a "name=firewalld state=stopped" -b -K

9.4. Проверка режима (--check/-C)

Режим «проверки» (имитация выполнения) . Ansible покажет, какие изменения произошли бы, но не применит их.


ansible webservers -m copy -a "src=/etc/hosts dest=/tmp/hosts" -C

9.5. Использование инвентарных переменных

В аргументах модулей можно использовать переменные, определенные в инвентаре.



[webservers]
web1 ansible_host=192.168.1.10 custom_user=deploy



ansible web1 -m user -a "name={{ custom_user }} state=present"

9.6. Интеграция в bash-скрипты

Ad-hoc команды легко встраиваются в скрипты для выполнения рутинных задач .


#!/bin/bash

echo "Собираем логи с веб-серверов..."
ansible webservers -m fetch -a "src=/var/log/nginx/error.log dest=./logs/ flat=no"
echo "Архивируем собранные логи..."
tar -czf logs_$(date +%Y%m%d).tar.gz logs/
echo "Готово!"

10. Идемпотентность в ad-hoc командах

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

Специализированные модули (например, yum, user, service) спроектированы идемпотентными. Модули command и shell, по умолчанию, не идемпотентны — они просто выполняют команду каждый раз.

Пример неидемпотентного поведения:



ansible all -m shell -a "echo 'new entry' >> /tmp/log.txt"

Как сделать идемпотентным выполнение команд:

  1. Использовать параметры creates / removes :
    
    # Выполнить команду, только если файла нет (идемпотентно)
    ansible all -m command -a "touch /etc/.configured creates=/etc/.configured"
  1. Использовать модуль file вместо shell для операций с файлами.
  2. Использовать специализированные модули вместо команд.

Ключевые выводы:

  • Для простых команд используйте command, для сложных — shell, для систем без Python — raw .
  • Для файловых операций предпочитайте модули copy, fetch, file вместо shell .
  • Управляйте сервисами и пакетами через специализированные модули (service, yum, apt) для обеспечения идемпотентности.
  • Коллекция community.general открывает доступ к тысячам модулей для работы со специфическим ПО.
  • Используйте ansible-doc -l | grep <keyword> для поиска нужного модуля