Просмотр имени хоста (модуль 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 команд необходимо:
- Создать инвентарный файл (по умолчанию
/etc/ansible/hostsили указать через-i):
[webservers]
web1.example.com
web2.example.com
[databases]
db1.example.com
db2.example.com
- Настроить подключение по 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"
Как сделать идемпотентным выполнение команд:
# Выполнить команду, только если файла нет (идемпотентно)
ansible all -m command -a "touch /etc/.configured creates=/etc/.configured"
- Использовать модуль
fileвместоshellдля операций с файлами. - Использовать специализированные модули вместо команд.
Ключевые выводы:
- Для простых команд используйте
command, для сложных —shell, для систем без Python —raw. - Для файловых операций предпочитайте модули
copy,fetch,fileвместоshell. - Управляйте сервисами и пакетами через специализированные модули (
service,yum,apt) для обеспечения идемпотентности. - Коллекция
community.generalоткрывает доступ к тысячам модулей для работы со специфическим ПО. - Используйте
ansible-doc -l | grep <keyword>для поиска нужного модуля