В первой части серии Ansible вы познакомились с Ansible и научились его устанавливать.
В этом руководстве вы узнаете, как управлять статическим инвентарем в Ansible. Вы также разберетесь с различными настройками конфигурации Ansible.
Кроме того, вы изучите несколько модулей Ansible и сможете запускать команды Ansible Ad-Hoc.
Создание пользователя Ansible
Несмотря на то, что вы можете использовать пользователя root в Ansible для запуска команд Ad-Hoc и playbooks, это определенно не рекомендуется и не считается лучшей практикой из-за рисков безопасности, которые могут возникнуть при разрешении доступа root пользователю ssh.
По этой причине рекомендуется создать выделенного пользователя Ansible с привилегиями sudo (для всех команд) на всех хостах (управляющих и управляемых хостах).
Помните, что Ansible использует SSH и Python для выполнения всей грязной работы за кулисами, поэтому вот четыре шага, которые вам нужно будет выполнить после установки Ansible :
- Создайте нового пользователя на всех хостах.
- Предоставьте привилегии sudo новому пользователю на всех узлах.
- Сгенерируйте ключи SSH для нового пользователя на контрольном узле.
- Скопируйте открытый ключ SSH на управляемые узлы.
Итак, без лишних слов, давайте начнем с создания нового пользователя с именем andreyex на всех хостах:
[root@control ~]# useradd -m andreyex [root@node1 ~]# useradd -m andreyex [root@node2 ~]# useradd -m andreyex [root@node3 ~]# useradd -m andreyex [root@node4 ~]# useradd -m andreyex
После установки пароля Эллиота на всех хостах вы можете перейти к шагу 2; вы можете предоставить andreyex привилегии sudo для всех команд без пароля, добавив следующую запись в файл /etc/sudoers:
[root@control ~]# echo "andreyex ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers [root@node1 ~]# echo "andreyex ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers [root@node2 ~]# echo "andreyex ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers [root@node3 ~]# echo "andreyex ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers [root@node4 ~]# echo "andreyex ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
Теперь войдите в систему как пользователь andreyex на своем управляющем узле и сгенерируйте пару ключей ssh:
[andreyex@control ~]$ 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 andreyex@control 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 следующим образом:
[andreyex@control ~]$ ssh-copy-id node1 [andreyex@control ~]$ ssh-copy-id node2 [andreyex@control ~]$ ssh-copy-id node3 [andreyex@control ~]$ 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, файлов инвентаря, ролей и т. д.), Которые вы будете создавать с этого момента:
[andreyex@control ~]$ mkdir /home/andreyex/plays
Обратите внимание, что все, что вы создадите с этого момента, будет в управляющем узле.
Создание файла инвентаризации
Перейдите в каталог /home/andreyex/plays и создайте файл инвентаризации с именем myhosts и добавьте имена хостов всех ваших управляемых узлов, чтобы он в конечном итоге выглядел так:
[andreyex@control plays]$ cat myhosts node1 node2 node3 node4
Параметр -i использовался для указания файла инвентаризации myhosts . Если вы опустите параметр -i , Ansible будет искать хосты в файле инвентаризации /etc/ansible/hosts.
Имейте в виду, что здесь я использую имена хостов и что все узлы (виртуальные машины), которые мы создали в Azure, находятся в одной подсети, и нам не нужно беспокоиться о DNS, поскольку он обрабатывается Azure.
Если у вас нет работающего DNS-сервера, вы можете добавить записи IP-адреса/имени хоста ваших узлов в /etc/hosts, пример ниже:
Создание групп и подгрупп узлов сети
Вы можете организовать свои управляемые хосты в группы и подгруппы. Например, вы можете отредактировать файл myhosts, чтобы создать две группы test и prod следующим образом:
[andreyex@control plays]$ cat myhosts [test] node1 node2 [prod] node3 node4
Вы можете перечислить хосты в группе prod, выполнив следующую команду:
[andreyex@control plays]$ ansible prod -i myhosts --list-hosts hosts (2): node3 node4
В Ansible есть две группы по умолчанию:
- all – содержит все хосты в инвентаре
- ungrouped – содержит все хосты, не входящие ни в одну группу (кроме всех).
Давайте добавим воображаемый node5 в файл инвентаризации myhosts, чтобы продемонстрировать разгруппированную группу:
[andreyex@control plays]$ cat myhosts node5 [test] node1 node2 [prod] node3 node4
Обратите внимание, что мы добавили node5 в самое начало (а не в конец) файла myhosts, иначе он будет считаться членом группы prod.
Теперь вы можете запустить следующую команду, чтобы вывести список всех разгруппированных хостов:
[andreyex@control plays]$ ansible ungrouped -i myhosts --list-hosts hosts (1): node5
Вы также можете создать группу (parent), которая содержит подгруппы (children). Взгляните на следующий пример:
[andreyex@control 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.
[andreyex@control plays]$ ansible development -i myhosts --list-hosts hosts (2): node1 node3 [andreyex@control 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 покажет вам, какой файл конфигурации вы используете в данный момент:
[andreyex@control 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 и разделы:
[andreyex@control plays]$ wc -l /etc/ansible/ansible.cfg 490 /etc/ansible/ansible.cfg
Два наиболее важных раздела, которые вам необходимо определить в файле конфигурации Ansible:
- [defaults]
- [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_ask_pass = false
Теперь запустите команду ansible –version еще раз; вы должны увидеть, что ваш новый файл конфигурации теперь действует:
[andreyex@control 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 – просто запустить их! Итак, продолжайте и выполните следующую специальную команду:
[andreyex@control 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:
[andreyex@control plays]$ ansible-doc -l | wc -l 3387
В настоящее время доступно 3387 модулей Ansible, и их количество увеличивается с каждым днем! Вы можете передать любой командный способ, который хотите запустить, в качестве опции командному модулю Ansible.
Если у вас нет пустой ключевой фразы-пароля ssh (как и у меня); тогда вам придется запустить ssh-agent, чтобы избежать ненужной головной боли, связанной с запросом парольной фразы каждый раз, когда Ansible пытается получить доступ к вашим управляемым узлам:
[andreyex@control plays]$ eval `ssh-agent` Agent pid 218750 [andreyex@control plays]$ ssh-add Enter passphrase for /home/andreyex/.ssh/id_rsa: Identity added: /home/andreyex/.ssh/id_rsa (andreyex@control)
Тестирование подключения
Вы можете проверить, может ли Ansible подключиться ко всем вашим управляемым узлам, прежде чем приступать к более серьезным задачам; для этого вы можете использовать модуль ping и указать все управляемые хосты следующим образом:
[andreyex@control 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 и способы его использования, запустив:
[andreyex@control plays]$ ansible-doc ping
Откроется страница документации модуля ping.
При чтении документации по модулям обратите особое внимание на то, не стоит ли перед какой-либо опцией знак равенства (=). В этом случае это обязательная опция, которую вы должны включить.
Кроме того, если вы прокрутите до конца, вы увидите несколько примеров того, как запускать специальные команды или сценарии Ansible (которые мы обсудим позже).
Команда против shell против модулей raw
Есть три модуля Ansible, которые люди часто путают друг с другом; Эти:
- command
- shell
- raw
Эти три модуля достигают одной и той же цели; они запускают команды на управляемых узлах. Но есть ключевые различия, которые разделяют три модуля.
Вы не можете использовать конвейер или перенаправление с модулем command. Например, следующая специальная команда приведет к ошибке:
[andreyex@control 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 :
[andreyex@control 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:
root@node4:/usr/bin# mkdir hide root@node4:/usr/bin# mv python* hide/
Теперь проверьте, что произойдет, если мы запустим Ansible ad-hoc с оболочкой или командным модулем, нацеленным на node4:
[andreyex@control 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.\r\n", "module_stdout": "/bin/sh: 1: /usr/bin/python: not found\r\n", }
[andreyex@control 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.\r\n", "module_stdout": "/bin/sh: 1: /usr/bin/python: not found\r\n", "msg": "The module failed to execute correctly, you probably need to set the interpreter.\nSee stdout/stderr for the exact error", "rc": 127 }
Мы получаем ошибки! Сейчас мы попробуем выполнить ту же задачу; но на этот раз мы будем использовать необработанный модуль:
[andreyex@control 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:
root@node4:/usr/bin/hide# mv * ..
Мы создали эту таблицу ниже, чтобы суммировать различные варианты использования трех модулей:
Описание | command | shell | raw |
---|---|---|---|
Запускайте простые команды | да | да | да |
Запускать команды с перенаправлением | Нет | да | да |
Запускать команды без Python | Нет | Нет | да |
Хорошо! Это подводит нас к концу второго руководства по Ansible.