Ansible. Выполнение специальных команд

В первой части серии Ansible вы познакомились с Ansible и научились его устанавливать.

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

Кроме того, вы изучите несколько модулей Ansible и сможете запускать команды Ansible Ad-Hoc.

 

Создание пользователя Ansible

Несмотря на то, что вы можете использовать пользователя root в Ansible для запуска команд Ad-Hoc и playbooks, это определенно не рекомендуется и не считается лучшей практикой из-за рисков безопасности, которые могут возникнуть при разрешении доступа root пользователю ssh.

По этой причине рекомендуется создать выделенного пользователя Ansible с привилегиями sudo (для всех команд) на всех хостах (управляющих и управляемых хостах).

Помните, что Ansible использует SSH и Python для выполнения всей грязной работы за кулисами, поэтому вот четыре шага, которые вам нужно будет выполнить после установки Ansible :

  1. Создайте нового пользователя на всех хостах.
  2. Предоставьте привилегии sudo новому пользователю на всех узлах.
  3. Сгенерируйте ключи SSH для нового пользователя на контрольном узле.
  4. Скопируйте открытый ключ SSH на управляемые узлы.

Итак, без лишних слов, давайте начнем с создания нового пользователя с именем andreyex на всех хостах:

[[email protected] ~]# useradd -m andreyex
[[email protected] ~]# useradd -m andreyex
[[email protected] ~]# useradd -m andreyex
[[email protected] ~]# useradd -m andreyex
[[email protected] ~]# useradd -m andreyex

 

После установки пароля Эллиота на всех хостах вы можете перейти к шагу 2; вы можете предоставить andreyex sudo привилегии для всех команд без пароля, добавив следующую запись в файл /etc/sudoers:

[[email protected] ~]# echo "andreyex  ALL=(ALL)  NOPASSWD: ALL" >> /etc/sudoers
[[email protected] ~]# echo "andreyex  ALL=(ALL)  NOPASSWD: ALL" >> /etc/sudoers
[[email protected] ~]# echo "andreyex  ALL=(ALL)  NOPASSWD: ALL" >> /etc/sudoers
[[email protected] ~]# echo "andreyex  ALL=(ALL)  NOPASSWD: ALL" >> /etc/sudoers
[[email protected] ~]# echo "andreyex  ALL=(ALL)  NOPASSWD: ALL" >> /etc/sudoers

 

Теперь войдите в систему как пользователь andreyex на своем управляющем узле и сгенерируйте пару ключей ssh:

[[email protected] ~]$ ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (/home/andreyex/.ssh/id_rsa):       
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/andreyex/.ssh/id_rsa.
Your public key has been saved in /home/andreyex/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:Xf5bKx0kkBCsCQ/7rc6Kv6CxCRTH2XJajbNvpzel+Ik [email protected]
The key's randomart image is:
+---[RSA 3072]----+
|        .oo .    |
|  . ooo  . o     |
| . = *=.o   o    |
|  o =.o+ . o . . |
| . . .. S . . o  |
|.     .. . . . . |
|.. .   oo.o   o o|
|. = o oo++.  . +.|
| + ..++Eoo.   o. |
+----[SHA256]-----+

 

Наконец, вы можете скопировать открытый ssh-ключ Эллиота на все управляемые хосты с помощью команды ssh-copy-id следующим образом:

[[email protected] ~]$ ssh-copy-id node1
[[email protected] ~]$ ssh-copy-id node2
[[email protected] ~]$ ssh-copy-id node3
[[email protected] ~]$ ssh-copy-id node4

 

Теперь у вас должна быть возможность подключаться по ssh ко всем управляемым узлам без запроса пароля; вам будет предложено ввести только парольную фразу ssh (если вы не оставили ее пустой, ха-ха).

 

Создание вашего инвентаря Ansible

Файл инвентаризации Ansible – это в основном файл, который содержит список серверов, группу серверов или IP-адреса, которые ссылаются на хосты, которыми вы хотите управлять с помощью Ansible (управляемые узлы).

В /etc/ansible/hosts файлы инвентаризация по умолчанию. Теперь я покажу вам, как создавать собственные файлы инвентаря в Ansible.

 

Создание каталога проекта

Вы не хотите связываться с каталогом /etc/ansible; вы должны сохранить все в /etc/ansible в неизменном виде и в основном просто использовать его в качестве справочного материала при создании файлов инвентаризации, редактировании файлов конфигурации проекта Ansible и т. д.

Теперь давайте создадим новый каталог проекта Ansible с именем в /home/andreyex с именем plays, который вы будете использовать для хранения всех ваших связанных с Ansible вещей (playbooks, файлов инвентаря, ролей и т. д.), Которые вы будете создавать с этого момента:

[[email protected] ~]$ mkdir /home/andreyex/plays

 

Обратите внимание, что все, что вы создадите с этого момента, будет в управляющем узле.

 

Создание файла инвентаризации

Перейдите в каталог /home/andreyex/plays и создайте файл инвентаризации с именем myhosts и добавьте имена хостов всех ваших управляемых узлов, чтобы он в конечном итоге выглядел так:

[[email protected] plays]$ cat myhosts 
node1
node2
node3
node4

 

Параметр -i использовался для указания файла инвентаризации myhosts . Если вы опустите параметр -i , Ansible будет искать хосты в файле инвентаризации / etc / ansible / hosts .

Имейте в виду, что здесь я использую имена хостов и что все узлы (виртуальные машины), которые я создал в Azure, находятся в одной подсети, и мне не нужно беспокоиться о DNS, поскольку он обрабатывается Azure.

Если у вас нет работающего DNS-сервера, вы можете добавить записи IP-адреса / имени хоста ваших узлов в / etc / hosts , пример ниже:

Создание групп и подгрупп узлов сети

Вы можете организовать свои управляемые хосты в группы и подгруппы. Например, вы можете отредактировать файл myhosts, чтобы создать две группы test и prod следующим образом:

[[email protected] plays]$ cat myhosts 
[test]
node1
node2

[prod]
node3
node4

 

Вы можете перечислить хосты в группе prod , выполнив следующую команду:

[[email protected] plays]$ ansible prod -i myhosts --list-hosts
  hosts (2):
    node3
    node4

 

В Ansible есть две группы по умолчанию:

  1. all – содержит все хосты в инвентаре
  2. ungrouped – содержит все хосты, не входящие ни в одну группу (кроме всех).

Давайте добавим воображаемый node5  в файл инвентаризации myhosts, чтобы продемонстрировать разгруппированную группу:

[[email protected] plays]$ cat myhosts 
node5

[test]
node1
node2

[prod]
node3
node4

 

Обратите внимание, что я добавил node5 в самое начало (а не в конец) файла myhosts, иначе он будет считаться членом группы prod.

Теперь вы можете запустить следующую команду, чтобы вывести список всех разгруппированных хостов:

[[email protected] plays]$ ansible ungrouped -i myhosts --list-hosts
  hosts (1):
    node5

 

Вы также можете создать группу (parent), которая содержит подгруппы (children). Взгляните на следующий пример:

[[email protected] plays]$ cat myhosts 
[web_dev]
node1

[web_prod]
node2

[db_dev]
node3

[db_prod]
node4

[development:children]
web_dev
db_dev

[production:children]
web_prod
db_prod

 

Группа разработки содержит все хосты, которые находятся в web_dev, плюс все члены, которые находятся в db_dev . Точно так же производственная группа содержит все хосты, которые находятся в web_prod, плюс все члены, которые находятся в db_prod.

[[email protected] plays]$ ansible development -i myhosts --list-hosts
  hosts (2):
    node1
    node3

[[email protected] plays]$ ansible production -i myhosts --list-hosts
  hosts (2):
    node2
    node4

 

Настройка Ansible

В этом разделе вы узнаете о наиболее важных настройках конфигурации Ansible. На протяжении всей серии вы будете обсуждать другие параметры конфигурации, когда в этом возникнет необходимость.

/etc/ansible/ansible.cfg – файл конфигурации по умолчанию. Однако также рекомендуется не связываться с /etc/ansible/ansible.cfg и просто использовать его в качестве ссылки. Вы должны создать свой собственный файл конфигурации Ansible в каталоге проекта Ansible.

Команда ansible –version покажет вам, какой файл конфигурации вы используете в данный момент:

[[email protected] plays]$ ansible --version
ansible 2.9.14
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/home/andreyex/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3.6/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 3.6.8 (default, Dec  5 2019, 15:45:45) [GCC 8.3.1 20191121 (Red Hat 8.3.1-5)]

 

Как видно из вывода, /etc/ansible/ansible.cfg в настоящее время используется, поскольку вы еще не создали свой собственный файл ansible.cfg в каталоге проекта.

/etc/ansible/ansible.cfg содержит целый различных параметров конфигурации Ansible и разделы:

[[email protected] plays]$ wc -l /etc/ansible/ansible.cfg 
490 /etc/ansible/ansible.cfg

 

Два наиболее важных раздела, которые вам необходимо определить в файле конфигурации Ansible:

  1. [defaults]
  2. [privilege_escalation]

 

В разделе [defaults] приведены наиболее важные настройки, о которых вам нужно знать:

  • inventory – указывает путь к вашему файлу инвентаря.
  • remote_user – указывает пользователя, который будет подключаться к управляемым хостам и запускать playbooks.
  • forks – указывает количество хостов, которыми Ansible может управлять / обрабатывать параллельно; по умолчанию 5.
  • host_key_checking – указывает, хотите ли вы включить / выключить проверку хоста ключа SSH; по умолчанию True.

В разделе [privilege_escalation] вы можете настроить следующие параметры:

  • become – указать, где разрешить/запретить повышение привилегий; по умолчанию – false.
  • become_method – указать способ повышения привилегий; по умолчанию – sudo.
  • become_user – укажите пользователя, которым вы стали в результате повышения привилегий; по умолчанию – root.
  • become_ask_pass – указать, запрашивать или не запрашивать пароль повышения привилегий; по умолчанию – false.

Имейте в виду, что вам не нужно сохранять какие-либо из этих настроек в памяти. Все они задокументированы в /etc/ansible/ansible.cfg .

Теперь создайте свой собственный файл конфигурации ansible.cfg в каталоге проекта Ansible/home/andreyex/plays и установите следующие параметры:

[defaults]

inventory = myhosts

remote_user = elliot

host_key_checking = false

 

[privilege_escalation]

become = true

become_metod = sudo

become_user = root

become_ack_pass = false

 

Теперь запустите команду ansible –version еще раз; вы должны увидеть, что ваш новый файл конфигурации теперь действует:

[[email protected] plays]$ ansible --version
ansible 2.9.14
  config file = /home/andreyex/plays/ansible.cfg
  configured module search path = ['/home/andreyex/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3.6/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 3.6.8 (default, Dec  5 2019, 15:45:45) [GCC 8.3.1 20191121 (Red Hat 8.3.1-5)]

 

Выполнение специальных команд в Ansible

До этого момента вы действительно просто устанавливали, настраивали среду и настраивали Ansible. Теперь начинается самое интересное!

Специальные команды Ansible – отличный инструмент, который можно использовать для запуска одной задачи на одном или нескольких управляемых узлах. Типичная специальная команда Ansible следует общему синтаксису:

ansible host_pattern -m module_name -a "module_options"

 

Самый простой способ понять, как работают специальные команды Ansible – просто запустить их! Итак, продолжайте и выполните следующую специальную команду:

[[email protected] plays]$ ansible node1 -m command -a "uptime"
Enter passphrase for key '/home/andreyex/.ssh/id_rsa':
node1 | CHANGED | rc=0 >>
18:53:01 up 5 days, 18:03,  1 user,  load average: 0.00, 0.01, 0.00

 

Нам было предложено ввести мою ключевую фразу ssh, а затем было отображено время безотказной работы node1!

Вы, наверное, уже догадались об этом; Модули ansible – это многократно используемые автономные сценарии, которые могут использоваться Ansible API или программами ansible или ansible-playbook.

Командный модуль – один из многих модулей, которые может предложить Ansible. Вы можете запустить команду ansible-doc -l, чтобы вывести список всех доступных модулей Ansible:

[[email protected] plays]$ ansible-doc -l | wc -l
3387

 

В настоящее время доступно 3387 модулей Ansible, и их количество увеличивается с каждым днем! Вы можете передать любой командный способ, который хотите запустить, в качестве опции командному модулю Ansible.

Если у вас нет пустой ключевой фразы-пароля ssh (как и у меня); тогда вам придется запустить ssh-agent, чтобы избежать ненужной головной боли, связанной с запросом парольной фразы каждый раз, когда Ansible пытается получить доступ к вашим управляемым узлам:

[[email protected] plays]$ eval `ssh-agent`
Agent pid 218750
[[email protected] plays]$ ssh-add
Enter passphrase for /home/andreyex/.ssh/id_rsa: 
Identity added: /home/andreyex/.ssh/id_rsa ([email protected])

 

Тестирование подключения

Вы можете проверить, может ли Ansible подключиться ко всем вашим управляемым узлам, прежде чем приступать к более серьезным задачам; для этого вы можете использовать модуль ping и указать все управляемые хосты следующим образом:

[[email protected] plays]$ ansible all -m ping 
node4 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
node3 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}
node1 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}
node2 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}

 

Как вы можете видеть, SUCCESS  на выходе. Обратите внимание, что модулю Ansible ping не нужны никакие параметры. Некоторым модулям Ansible требуются параметры, а некоторым нет, как и в случае с командами Linux.

 

Документация по модулям Ansible

Если бы нас спросили, что вам больше всего нравится в Ansible; Мы бы сказали, что это документация. Ansible очень хорошо документирован, и все это можно сделать на вашем собственном терминале.

Если вы хотите узнать, как использовать определенный модуль Ansible, вы можете запустить ansible-doc с указанием имени модуля.

Например, вы можете просмотреть описание модуля ping и способы его использования, запустив:

[[email protected] plays]$ ansible-doc ping

 

Откроется страница документации модуля ping.

При чтении документации по модулям обратите особое внимание на то, не стоит ли перед какой-либо опцией знак равенства (smile

. В этом случае это обязательная опция, которую вы должны включить.

Кроме того, если вы прокрутите до конца, вы увидите несколько примеров того, как запускать специальные команды или сценарии Ansible (которые мы обсудим позже).

 

Команда против shell против модулей raw

Есть три модуля Ansible, которые люди часто путают друг с другом; Эти:

  1. command
  2. shell
  3. raw

 

Эти три модуля достигают одной и той же цели; они запускают команды на управляемых узлах. Но есть ключевые различия, которые разделяют три модуля.

Вы не можете использовать конвейер или перенаправление с модулем command. Например, следующая специальная команда приведет к ошибке:

[[email protected] plays]$ ansible node2 -m command -a "lscpu | head -n 5"
node2 | FAILED | rc=1 >>
lscpu: invalid option -- 'n'
Try 'lscpu --help' for more information.non-zero return code

 

Это потому, что модуль command не поддерживает каналы или перенаправление. Вместо этого вы можете использовать модуль shell, если хотите использовать каналы или перенаправление. Выполните ту же команду еще раз, но на этот раз используйте вместо нее модуль shell :

[[email protected] plays]$ ansible node2 -m shell -a "lscpu | head -n 5"
node2 | CHANGED | rc=0 >>
Architecture:        x86_64
CPU op-mode(s):      32-bit, 64-bit
Byte Order:          Little Endian
CPU(s):              1
On-line CPU(s) list: 0

 

Работает как шарм! Он успешно отобразил первые пять строк вывода команды lscpu на node2.

Ansible использует сценарии SSH и Python за кулисами, чтобы творить всю магию. Теперь необработанный модуль просто использует SSH и обходит подсистему модуля Ansible. Таким образом, этот необработанный модуль будет успешно работать на управляемом узле, даже если python не установлен (на управляемом узле).

Мы изменили свои двоичные файлы python на node4 (пожалуйста, не делайте этого самостоятельно), поэтому мы можем имитировать сценарий того, что произойдет, если вы запустите оболочку или командный модуль на узле, на котором не установлен python:

[email protected]:/usr/bin# mkdir hide
[email protected]:/usr/bin# mv python* hide/

 

Теперь проверьте, что произойдет, если я запущу Ansible ad-hoc с оболочкой или командным модулем, нацеленным на node4:

[[email protected] plays]$ ansible node4 -m shell -a "whoami"
node4 | FAILED! => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "module_stderr": "Shared connection to node4 closed.rn",
    "module_stdout": "/bin/sh: 1: /usr/bin/python: not foundrn",
}
[[email protected] plays]$ ansible node4 -m command -a "cat /etc/os-release"
node4 | FAILED! => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "module_stderr": "Shared connection to node4 closed.rn",
    "module_stdout": "/bin/sh: 1: /usr/bin/python: not foundrn",
    "msg": "The module failed to execute correctly, you probably need to set the interpreter.nSee stdout/stderr for the exact error",
    "rc": 127
}

 

Мы получаем ошибки! Сейчас мы попробуем выполнить ту же задачу; но на этот раз мы будем использовать необработанный модуль:

[[email protected] plays]$ ansible node4 -m raw -a "cat /etc/os-release"
node4 | CHANGED | rc=0 >>
NAME="Ubuntu"
VERSION="18.04.5 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.5 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic
Shared connection to node4 closed.

 

Как видите, необработанный модуль был единственным модулем из трех, успешно выполнившим задачу. Теперь мы вернемся и исправим беспорядок, который мы сделали на node4:

[email protected]:/usr/bin/hide# mv * ..

 

Мы создали эту таблицу ниже, чтобы суммировать различные варианты использования трех модулей:

Описание
command
shell
raw
Запускайте простые командыдадада
Запускать команды с перенаправлениемНетдада
Запускать команды без PythonНетНетда

 

Хорошо! Это подводит нас к концу второго руководства по Ansible.

Sidebar