Поиск по сайту:
Первый шаг младенца есть первый шаг к его смерти (К. Прутков).

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

27.10.2020
Краткое руководство: Как установить и настроить ansible в Linux для автоматизации

В первой части серии 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 на всех хостах:

[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

 

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

Читать  Введение в файловую систему Btrfs

 

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

Перейдите в каталог /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, пример ниже:
Ansible. Выполнение специальных команд

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

Вы можете организовать свои управляемые хосты в группы и подгруппы. Например, вы можете отредактировать файл 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 есть две группы по умолчанию:

  1. all — содержит все хосты в инвентаре
  2. 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:

  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.
Читать  Как мне использовать sleep в сценарии Bash?

Имейте в виду, что вам не нужно сохранять какие-либо из этих настроек в памяти. Все они задокументированы в /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 с указанием имени модуля.

Читать  Команда wait в Bash

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

[andreyex@control plays]$ ansible-doc ping

 

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

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

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

 

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

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

  1. command
  2. shell
  3. 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 * ..

 

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

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

 

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

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (3 оценок, среднее: 5,00 из 5)
Загрузка...
Поделиться в соц. сетях:


0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

**ссылки nofollow

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

Это может быть вам интересно


Рекомендуемое
Любой, кто занимается криптовалютой достаточно долго, должен знать вопрос: какова…

Спасибо!

Теперь редакторы в курсе.