You are here

Ansible: ad-Hoc команды. Lesson 2

Linux: 

Изучаем Ansible: ad-Hoc команды. Урок 2.

В данной статье поговорим о ad-Hoc командах в Ansible. Это самый простой и быстрый способ начать использовать Ansible. Чуть позже мы поговорим о Playbook (в новых статьях), которые будут содержать ad-Hoc команды.

* Файл hosts очистил до одного сервера, для удобства отражения данных. У вас может быть много серверов.

-m setup
Очень полезная команда, если знать, что из неё можно получить. Вы получаете всю информацию о нужном нам сервере, серверах. Как её применить разберем позже.

  1. # все сервера all, модуль -m используем setup
  2. ansible all -m setup
  3. debi | SUCCESS => {
  4. "ansible_facts": {
  5. "ansible_all_ipv4_addresses": [
  6. ...
  7. ],
  8. "ansible_apparmor": {
  9. "status": "enabled"
  10. },
  11. "ansible_architecture": "x86_64",
  12. "ansible_bios_date": "03/07/2012",
  13. "ansible_bios_version": "4.6.5",
  14. "ansible_br_e1a77a7a7911": {
  15. "active": false,
  16. "device": "br-e1a77a7a7911",
  17. "id": "8000.02425dba1704",
  18. "interfaces": [],
  19. "ipv4": {
  20. "address":
  21. "broadcast":
  22. "netmask": "255.255.0.0",
  23. "network":
  24. },
  25. "macaddress": "02:...
  26. "mtu": 1500,
  27. "promisc": false,
  28. "stp": false,
  29. "type": "bridge"
  30. },
  31. "ansible_cmdline": {
  32. "BOOT_IMAGE": "/boot/vmlinuz-4.19.0-6-amd64",
  33. "quiet": true,
  34. "ro": true,
  35. "root": "/dev/mapper/deb-debi--root"
  36. },
  37. "ansible_date_time": {
  38. "date": "2019-10-11",
  39. "day": "11",
  40. "epoch": "1570776279",
  41. "hour": "11",
  42. "iso8601": "2019-10-11T06:44:39Z",
  43. "iso8601_basic": "20191011T114439448663",
  44. "iso8601_basic_short": "20191011T114439",
  45. "iso8601_micro": "2019-10-11T06:44:39.448966Z",
  46. "minute": "44",
  47. "month": "10",
  48. "second": "39",
  49. "time": "11:44:39",
  50. "tz": "+05",
  51. "tz_offset": "+0500",
  52. "weekday": "Пятница",
  53. "weekday_number": "5",
  54. "weeknumber": "40",
  55. "year": "2019"
  56. }
  57. ...
  58. # Тут обрезал вывод информации, так как её очень много!

Переходим к следующей команде.

-m shell -a "command"
Если вы хотите выпольнить стандартную команду в оболочке shell на удаленном сервере, то применяем следующую команду:

  1. # all - все сервера файла hosts, -m модуль shell, -a аргумент "ls -la", в "" скобка пишем стандартные команды shell
  2. debuser@debsv:/etc/ansible$ ansible all -m shell -a "ls -la"
  3. debi | CHANGED | rc=0 >>
  4. итого 108
  5. drwxr-xr-x 16 debiuser debiuser 4096 сен 15 14:06 .
  6. drwxr-xr-x 4 root root 4096 сен 6 23:06 ..
  7. drwx------ 3 debiuser debiuser 4096 сен 15 14:06 .ansible
  8. -rw------- 1 debiuser debiuser 3792 окт 11 11:43 .bash_history
  9. -rw-r--r-- 1 debiuser debiuser 220 сен 6 23:06 .bash_logout
  10. ...

Есть аналог команды выше: -m command -a "command", но в ней есть ограничения. Применение команды выше еще при одном запросе: вы хотите узнать в каком каталоге, на удаленном сервере, происходит запуск вашей команды. В нашем случае мы попали в директорию того пользователя, на которого настроено ssh соединение на удаленном сервере:

  1. ansible all -m shell -a "pwd"
  2. debi | CHANGED | rc=0 >>
  3. /home/debiuser

-m copy -a "src=files dest=files mode= " -b
Рассмотрим модуль копирования файла на удаленные сервера (пояснения в коде):

  1. # создадим файл через команду echo
  2. sudo echo new_cod > new_files.txt
  3. # проверим текущий каталог
  4. pwd
  5. /home/debuser/Документы
  6. # -m модуль copy, -a аргумент "src=откуда копируем dest=куда копируем mode=права на файл" -b с правами root
  7. ansible all -m copy -a "src=new_files.txt dest=/home/debiuser/Документы/ mode=777" -b
  8. debi | CHANGED => {
  9. "changed": true,
  10. "checksum": "7fdd6ab4274302319685052d25615ed373c25cef",
  11. "dest": "/home/debiuser/Документы/new_files.txt",
  12. "gid": 0,
  13. "group": "root",
  14. "md5sum": "d54a90ed932cad940c053bd67e027e43",
  15. "mode": "0777",
  16. "owner": "root",
  17. "size": 8,
  18. "src": "/home/debiuser/.ansible/tmp/ansible-tmp-1570781533.4005113-61553193714072/source",
  19. "state": "file",
  20. "uid": 0
  21. }

Файл скопирован, но как это проверить? Используем уже изученные выше команды, с фильтром grep:

  1. ansible all -m shell -a "ls -la /home/debiuser/Документы/ | grep new_files"
  2. debi | CHANGED | rc=0 >>
  3. -rwxrwxrwx 1 root root 8 окт 11 13:12 new_files.txt

* В примерах выше: мы копировали в каталоги конкретного пользователя, но вы можете копировать в каталог /home или иной. Количество серверов зависит только от вашей ситуации.

-m file -a "path=file state=absent"
Теперь удалим этот файл, чтобы не мусорить на сервере. Используем модуль file:

  1. # укажем не все сервера all, а конкретную группу [debi_servers] (там 1 сервер)
  2. # модуль file, path=путь до файла на сервере, state=удалить
  3. ansible debi_servers -m file -a "path=/home/debiuser/Документы/new_files.txt state=absent" -b
  4. debi | CHANGED => {
  5. "changed": true,
  6. "path": "/home/debiuser/Документы/new_files.txt",
  7. "state": "absent"
  8. }
  9. # проверим файл, как и выше
  10. ansible all -m shell -a "ls -la /home/debiuser/Документы/ | grep new_files"
  11. debi | FAILED | rc=1 >>
  12. non-zero return code
  13. # файла нет, поступил отказ

-m get_url -a "url=link_sytes dest=directory"
Чтобы скачать какой то файл с сайта на все сервера, используем get_url

  1. ansible all -m get_url -a "url=https://linuxsql.ru/download/lin/64 dest=/home" -b

-m apt -a "name=nameprog state=latest
Попробуем установить программу на удаленном сервере, а потом удалим

  1. # модуль apt (или yum) для Debian, name=mc название программы, state=[installed или latest]
  2. ansible all -m apt -a "name=mc state=latest" -b
  3. debi | CHANGED => {
  4. "cache_update_time": 1569699437,
  5. ...
  6. "(Reading database ... 100%",
  7. ...
  8. "Processing triggers for desktop-file-utils (0.23-4) ..."
  9. ]
  10. }

На удаленном сервере появился установленный MC. Кто не знает файловый менеджер, читаем в сети)

Чтобы его удалить, меняем state на removed:

  1. ansible all -m apt -a "name=mc state=removed" -b
  2. debi | CHANGED => {
  3. "changed": true,
  4. "stderr": "",
  5. ...
  6. "(Reading database ... 95%",
  7. "(Reading database ... 100%",
  8. "(Reading database ... 132025 files and directories currently installed.)",
  9. "Removing mc (3:4.8.22-1) ...",
  10. "Processing triggers for mime-support (3.62) ...",
  11. "Processing triggers for desktop-file-utils (0.23-4) ..."
  12. ]
  13. }

Теперь попробуем поставить "Apache" на удаленный сервер:

  1. # Пример установки Apache на CentOS. "Apache" он же "httpd".
  2. ansible all -m yam "name=httpd state=latest" -b

-m service -a "name=name_prog state=started enabled=yes"
Ранее мы поставили две программы MC и Apache. MC удалили. А вот Apache надо еще и запустить, и настроить запуск при старте системы. Поэтому в его случае, еще выполним следующее:

  1. # Модуль service, state= стартовать, enabled=yes стартовать при перезагрузке
  2. ansible all -m service -a "name=httpd state=started enabled=yes" -b

-m uri -a "url=link_sytes return_content=yes"
Попробуем с сервера просмотреть сайт(узнаем есть ли доступ к сайту с серверов) и получить его содержимое.

  1. # Получим полный код страницы. Модуль uri. В url указываем ссылку на сайт, return_content отразит весь контент
  2. ansible all -m uri -a "url=http://www.linuxsql.ru return_content=yes"
  3. debi | SUCCESS => {
  4. "cache_control": "no-cache, must-revalidate",
  5. "changed": false,
  6. "connection": "close",
  7. "content": "<!DOCTYPE html PUBLIC
  8. ...
  9. "server": "nginx/1.12.1",
  10. "status": 200,
  11. "transfer_encoding": "chunked",
  12. "url": "http://www.linuxsql.ru",
  13. "x_content_type_options": "nosniff",
  14. "x_frame_options": "SAMEORIGIN",
  15. "x_generator": "Drupal 7 (https://www.drupal.org)",
  16. "x_powered_by": "PHP/5.6.40"
  17. }

Строчка "status": 200 говорит о том, что сайт доступен!

modul "parametr" -vvvvv
Чтобы получить больше информации по выполнению наших команд, можно использовать "v" дебагинг. Используем знакомый модуль shell с параметром -vv:

  1. ansible all -m shell -a "ls -la" -vv
  2. # начало полученной информации от -vv
  3. ansible 2.7.7
  4. config file = /etc/ansible/ansible.cfg
  5. configured module search path = ['/home/debuser/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  6. ansible python module location = /usr/lib/python3/dist-packages/ansible
  7. executable location = /usr/bin/ansible
  8. python version = 3.7.3 (default, Apr 3 2019, 05:39:12) [GCC 8.3.0]
  9. Using /etc/ansible/ansible.cfg as config file
  10. /etc/ansible/hosts did not meet host_list requirements, check plugin documentation if this is unexpected
  11. /etc/ansible/hosts did not meet script requirements, check plugin documentation if this is unexpected
  12. META: ran handlers
  13. # конец полученной информации от -vv
  14. debi | CHANGED | rc=0 >>
  15. итого 108
  16. drwxr-xr-x 16 debiuser debiuser 4096 окт 11 13:08 .
  17. drwxr-xr-x 4 root root 4096 сен 6 23:06 ..
  18. drwx------ 3 debiuser debiuser 4096 сен 15 14:06 .ansible
  19. ...

ansible-doc -l
Чтобы просмотреть все команды доступные в Ansible, вводим:

  1. # команду ввели с фильтром, так как будет очень большой вывод
  2. ansible-doc -l | grep win
  3. ec2_win_password gets the default administrator password for ec2 windows instances
  4. pagerduty Create PagerDuty maintenance windows
  5. statusio_maintenance Create maintenance windows for your status.io dashboard
  6. win_acl Set file/directory/registry permissions for a system user or group
  7. win_acl_inheritance Change ACL inheritance
  8. win_audit_policy_system Used to make changes to the system wide Audit Policy
  9. win_audit_rule Adds an audit rule to files, folders, or registry keys
  10. win_certificate_store Manages the certificate store
  11. win_chocolatey Manage packages using chocolatey
  12. ...
  13. # очень длинный результат, даже с фильтром. Проще искать на оф. сайте.

Всем спасибо за внимание!

Источник: http://linuxsql.ru