В данной статье поговорим о ad-Hoc командах в Ansible. Это самый простой и быстрый способ начать использовать Ansible. Чуть позже мы поговорим о Playbook (в новых статьях), которые будут содержать ad-Hoc команды.
* Файл hosts очистил до одного сервера, для удобства отражения данных. У вас может быть много серверов.
-m setup
Очень полезная команда, если знать, что из неё можно получить. Вы получаете всю информацию о нужном нам сервере, серверах. Как её применить разберем позже.
# все сервера all, модуль -m используем setup ansible all -m setup debi | SUCCESS => { "ansible_facts": { "ansible_all_ipv4_addresses": [ ... ], "ansible_apparmor": { "status": "enabled" }, "ansible_architecture": "x86_64", "ansible_bios_date": "03/07/2012", "ansible_bios_version": "4.6.5", "ansible_br_e1a77a7a7911": { "active": false, "device": "br-e1a77a7a7911", "id": "8000.02425dba1704", "interfaces": [], "ipv4": { "address": "broadcast": "netmask": "255.255.0.0", "network": }, "macaddress": "02:... "mtu": 1500, "promisc": false, "stp": false, "type": "bridge" }, "ansible_cmdline": { "BOOT_IMAGE": "/boot/vmlinuz-4.19.0-6-amd64", "quiet": true, "ro": true, "root": "/dev/mapper/deb-debi--root" }, "ansible_date_time": { "date": "2019-10-11", "day": "11", "epoch": "1570776279", "hour": "11", "iso8601": "2019-10-11T06:44:39Z", "iso8601_basic": "20191011T114439448663", "iso8601_basic_short": "20191011T114439", "iso8601_micro": "2019-10-11T06:44:39.448966Z", "minute": "44", "month": "10", "second": "39", "time": "11:44:39", "tz": "+05", "tz_offset": "+0500", "weekday": "Пятница", "weekday_number": "5", "weeknumber": "40", "year": "2019" } ... # Тут обрезал вывод информации, так как её очень много!
Переходим к следующей команде.
-m shell -a "command"
Если вы хотите выпольнить стандартную команду в оболочке shell на удаленном сервере, то применяем следующую команду:
# all - все сервера файла hosts, -m модуль shell, -a аргумент "ls -la", в "" скобка пишем стандартные команды shell debuser@debsv:/etc/ansible$ ansible all -m shell -a "ls -la" debi | CHANGED | rc=0 >> итого 108 drwxr-xr-x 16 debiuser debiuser 4096 сен 15 14:06 . drwxr-xr-x 4 root root 4096 сен 6 23:06 .. drwx------ 3 debiuser debiuser 4096 сен 15 14:06 .ansible -rw------- 1 debiuser debiuser 3792 окт 11 11:43 .bash_history -rw-r--r-- 1 debiuser debiuser 220 сен 6 23:06 .bash_logout ...
Есть аналог команды выше: -m command -a "command", но в ней есть ограничения. Применение команды выше еще при одном запросе: вы хотите узнать в каком каталоге, на удаленном сервере, происходит запуск вашей команды. В нашем случае мы попали в директорию того пользователя, на которого настроено ssh соединение на удаленном сервере:
ansible all -m shell -a "pwd" debi | CHANGED | rc=0 >> /home/debiuser
-m copy -a "src=files dest=files mode= " -b
Рассмотрим модуль копирования файла на удаленные сервера (пояснения в коде):
# создадим файл через команду echo sudo echo new_cod > new_files.txt # проверим текущий каталог pwd /home/debuser/Документы # -m модуль copy, -a аргумент "src=откуда копируем dest=куда копируем mode=права на файл" -b с правами root ansible all -m copy -a "src=new_files.txt dest=/home/debiuser/Документы/ mode=777" -b debi | CHANGED => { "changed": true, "checksum": "7fdd6ab4274302319685052d25615ed373c25cef", "dest": "/home/debiuser/Документы/new_files.txt", "gid": 0, "group": "root", "md5sum": "d54a90ed932cad940c053bd67e027e43", "mode": "0777", "owner": "root", "size": 8, "src": "/home/debiuser/.ansible/tmp/ansible-tmp-1570781533.4005113-61553193714072/source", "state": "file", "uid": 0 }
Файл скопирован, но как это проверить? Используем уже изученные выше команды, с фильтром grep:
ansible all -m shell -a "ls -la /home/debiuser/Документы/ | grep new_files" debi | CHANGED | rc=0 >> -rwxrwxrwx 1 root root 8 окт 11 13:12 new_files.txt
* В примерах выше: мы копировали в каталоги конкретного пользователя, но вы можете копировать в каталог /home или иной. Количество серверов зависит только от вашей ситуации.
-m file -a "path=file state=absent"
Теперь удалим этот файл, чтобы не мусорить на сервере. Используем модуль file:
# укажем не все сервера all, а конкретную группу [debi_servers] (там 1 сервер) # модуль file, path=путь до файла на сервере, state=удалить ansible debi_servers -m file -a "path=/home/debiuser/Документы/new_files.txt state=absent" -b debi | CHANGED => { "changed": true, "path": "/home/debiuser/Документы/new_files.txt", "state": "absent" } # проверим файл, как и выше ansible all -m shell -a "ls -la /home/debiuser/Документы/ | grep new_files" debi | FAILED | rc=1 >> non-zero return code # файла нет, поступил отказ
-m get_url -a "url=link_sytes dest=directory"
Чтобы скачать какой то файл с сайта на все сервера, используем get_url
ansible all -m get_url -a "url=https://linuxsql.ru/download/lin/64 dest=/home" -b
-m apt -a "name=nameprog state=latest
Попробуем установить программу на удаленном сервере, а потом удалим
# модуль apt (или yum) для Debian, name=mc название программы, state=[installed или latest] ansible all -m apt -a "name=mc state=latest" -b debi | CHANGED => { "cache_update_time": 1569699437, ... "(Reading database ... 100%", ... "Processing triggers for desktop-file-utils (0.23-4) ..." ] }
На удаленном сервере появился установленный MC. Кто не знает файловый менеджер, читаем в сети)
Чтобы его удалить, меняем state на removed:
ansible all -m apt -a "name=mc state=removed" -b debi | CHANGED => { "changed": true, "stderr": "", ... "(Reading database ... 95%", "(Reading database ... 100%", "(Reading database ... 132025 files and directories currently installed.)", "Removing mc (3:4.8.22-1) ...", "Processing triggers for mime-support (3.62) ...", "Processing triggers for desktop-file-utils (0.23-4) ..." ] }
Теперь попробуем поставить "Apache" на удаленный сервер:
# Пример установки Apache на CentOS. "Apache" он же "httpd". ansible all -m yam "name=httpd state=latest" -b
-m service -a "name=name_prog state=started enabled=yes"
Ранее мы поставили две программы MC и Apache. MC удалили. А вот Apache надо еще и запустить, и настроить запуск при старте системы. Поэтому в его случае, еще выполним следующее:
# Модуль service, state= стартовать, enabled=yes стартовать при перезагрузке ansible all -m service -a "name=httpd state=started enabled=yes" -b
-m uri -a "url=link_sytes return_content=yes"
Попробуем с сервера просмотреть сайт(узнаем есть ли доступ к сайту с серверов) и получить его содержимое.
# Получим полный код страницы. Модуль uri. В url указываем ссылку на сайт, return_content отразит весь контент ansible all -m uri -a "url=http://www.linuxsql.ru return_content=yes" debi | SUCCESS => { "cache_control": "no-cache, must-revalidate", "changed": false, "connection": "close", "content": "<!DOCTYPE html PUBLIC ... "server": "nginx/1.12.1", "status": 200, "transfer_encoding": "chunked", "url": "http://www.linuxsql.ru", "x_content_type_options": "nosniff", "x_frame_options": "SAMEORIGIN", "x_generator": "Drupal 7 (https://www.drupal.org)", "x_powered_by": "PHP/5.6.40" }
Строчка "status": 200 говорит о том, что сайт доступен!
modul "parametr" -vvvvv
Чтобы получить больше информации по выполнению наших команд, можно использовать "v" дебагинг. Используем знакомый модуль shell с параметром -vv:
ansible all -m shell -a "ls -la" -vv # начало полученной информации от -vv ansible 2.7.7 config file = /etc/ansible/ansible.cfg configured module search path = ['/home/debuser/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python3/dist-packages/ansible executable location = /usr/bin/ansible python version = 3.7.3 (default, Apr 3 2019, 05:39:12) [GCC 8.3.0] Using /etc/ansible/ansible.cfg as config file /etc/ansible/hosts did not meet host_list requirements, check plugin documentation if this is unexpected /etc/ansible/hosts did not meet script requirements, check plugin documentation if this is unexpected META: ran handlers # конец полученной информации от -vv debi | CHANGED | rc=0 >> итого 108 drwxr-xr-x 16 debiuser debiuser 4096 окт 11 13:08 . drwxr-xr-x 4 root root 4096 сен 6 23:06 .. drwx------ 3 debiuser debiuser 4096 сен 15 14:06 .ansible ...
ansible-doc -l
Чтобы просмотреть все команды доступные в Ansible, вводим:
# команду ввели с фильтром, так как будет очень большой вывод ansible-doc -l | grep win ec2_win_password gets the default administrator password for ec2 windows instances pagerduty Create PagerDuty maintenance windows statusio_maintenance Create maintenance windows for your status.io dashboard win_acl Set file/directory/registry permissions for a system user or group win_acl_inheritance Change ACL inheritance win_audit_policy_system Used to make changes to the system wide Audit Policy win_audit_rule Adds an audit rule to files, folders, or registry keys win_certificate_store Manages the certificate store win_chocolatey Manage packages using chocolatey ... # очень длинный результат, даже с фильтром. Проще искать на оф. сайте.
Всем спасибо за внимание!
Источник: http://linuxsql.ru