Как установить и настроить Ansible на Ubuntu

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

Ansible не требует установки специального программного обеспечения на узлах сервера и может управлять ими по SSH.

В этом руководстве мы узнаем, как установить и настроить Ansible на сервере Ubuntu 20.04.

Установите Ansible

Официальный репозиторий Ansible не поддерживает Ubuntu 20.04 из-за ошибки в библиотеке python Ubuntu на момент написания этого руководства.

К счастью, Ubuntu поставляется с Ansible 2.9, которую мы и будем устанавливать. Выполните следующую команду для установки Ansible.

sudo apt install ansible -y

Протестируйте свою установку, выполнив следующую команду.

ansible --version
ansible 2.9.6
config file = /etc/ansible/ansible.cfg
configured module search path = ['/home/username/.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.8.5 (default, Jan 27 2021, 15:41:15) [GCC 9.3.0]

Настройка файла инвентаризации

Чтобы иметь возможность подключаться к нескольким узлам, вам нужен файл, в котором будут записаны сведения об узлах. Этот файл называется Inventory file.

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

Ansible поставляется с файлом Inventory по умолчанию, доступным по адресу /etc/ansible/hosts. Откройте его с помощью редактора Nano.

sudo nano /etc/ansible/hosts

Вставьте следующий код в нижней части файла.

[servers]
server1 ansible_host=203.0.113.111
server2 ansible_host=203.0.113.112
server3 ansible_host=203.0.113.113
[all:vars]
ansible_python_interpreter=/usr/bin/python3

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

Группа all:vars устанавливает параметр ansible_python_interpreter на всех узлах в инвентаре. Это гарантирует, что Ansible использует исполняемый файл Python 3 вместо Python 2, который был удален из последних версий Ubuntu.

Когда вы закончите, сохраните и закройте файл, нажав ctrl + x, затем Y и ENTER для подтверждения изменений.

Примечание: Вы также можете создать свой собственный файл инвентаризации в любом месте по вашему выбору, который вы можете передать с помощью параметра -i при выполнении команд Ansible.

Вы можете проверить список инвентаризации с помощью следующей команды.

ansible-inventory --list -y
all:
children:
servers:
hosts:
server1:
 ansible_host: 203.0.113.111
 ansible_python_interpreter: /usr/bin/python3
server2:
 ansible_host: 203.0.113.112
 ansible_python_interpreter: /usr/bin/python3
server3:
 ansible_host: 203.0.113.113
 ansible_python_interpreter: /usr/bin/python3
ungrouped: {}

Организация серверов в группы и подгруппы

Это полезный совет, если у вас много серверов, некоторые из которых выполняют определенные функции. Например, вы можете использовать этот метод для раздельной группировки веб-серверов и серверов баз данных. Можно даже сделать хост частью нескольких групп. Можно даже сделать хост частью нескольких групп. Для этого файл инвентаризации должен выглядеть следующим образом.

[webservers]
203.0.113.111
203.0.113.112
[dbservers]
203.0.113.113
server_hostname
[development]
203.0.113.111
203.0.113.113
[production]
203.0.113.112
server_hostname

Настройка ключей SSH

Чтобы Ansible мог подключаться к серверам, необходимо настроить ключи SSH между вашим сервером Ansible и хостами, указанными в файле инвентаризации. Это будет работать, только если у клиентов Ansible не включен открытый ключ и включена учетная запись root с паролем.

Для создания и настройки SSH-ключа для Ansible и его узлов выполните следующие шаги.

Создайте ключ для Ansible.

ssh-keygen -t rsa -b 4096 -C "Ansible key"

Копируйте открытый ключ в свои учетные записи на удаленных серверах. Для этого мы будем использовать команду ssh-copy-id.

ssh-copy-id -i $HOME/.ssh/id_rsa.pub [email protected]
ssh-copy-id -i $HOME/.ssh/id_rsa.pub [email protected]
ssh-copy-id -i $HOME/.ssh/id_rsa.pub [email protected]

Вот и все. Теперь Ansible должен иметь возможность общаться с вашими серверами.

Настройка SSH-ключей на узлах с существующим открытым ключом

Если у клиентов уже включены открытые ключи, то вам придется выполнить некоторые дополнительные шаги. Для этого необходимо создать нового пользователя, доступного только Ansible, на каждом узле сервера. Этот пользователь будет иметь привилегии sudo, доступные без пароля, и может быть доступен только с вашего сервера ansible.

Чтобы создать пользователя ansible, выполните следующую команду.

sudo adduser ansible

Выберите надежный пароль и оставьте все остальные поля пустыми.

Теперь настройте беспарольный доступ sudo для этого пользователя с помощью следующей команды.

echo "ansible ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/ansible

Теперь, когда новый пользователь добавлен и настроен, вы можете скопировать SSH-ключ с вашего сервера ansible на сервер узла с помощью следующей команды.

ssh-copy-id [email protected]

Вам будет предложено ввести пароль для пользователя ansible. Введите его, и SSH-ключ будет скопирован.

Далее отключите вход в систему на основе пароля для пользователя ansible на узловом сервере.

sudo usermod -L ansible

Теперь ваш узловой сервер доступен только с сервера Ansible, поскольку только этот сервер имеет открытый ключ для него, и вы не можете использовать его с привилегиями sudo непосредственно на узловом сервере, поскольку вход по паролю отключен.

Вам придется повторить эти шаги для каждого узлового сервера. Также замените пользователя root на пользователя ansible в этом руководстве.

Проверка соединения

После настройки файла инвентаризации и ключей SSH, мы должны проверить, может ли Ansible подключиться к серверам.

Введите следующую команду для проверки соединения. Эта команда проверит соединение со всеми серверами из инвентарного файла.

ansible all -m ping -u root

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

server1 | SUCCESS => {
"changed": false, 
"ping": "pong"
}
server2 | SUCCESS => {
"changed": false, 
"ping": "pong"
}
server3 | SUCCESS => {
"changed": false, 
"ping": "pong"
}

Если вы впервые используете Ansible, вам будет предложено подтвердить подлинность всех серверов. Когда появится запрос, введите yes и нажмите ENTER</kbd для подтверждения.

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

Давайте выполним несколько основных команд на серверах с помощью Ansible. Для запуска любой команды на сервере используется следующий формат.

ansible all -a "command" -u <username>

Пример: проверка загрузки дисковой подсистемы

Сначала давайте проверим использование диска на всех наших серверах.

ansible all -a "df -h" -u root
server1 | CHANGED | rc=0 >>
Filesystem      Size  Used Avail Use% Mounted on
udev            3.9G     0  3.9G   0% /dev
tmpfs           798M  624K  798M   1% /run
/dev/vda1       155G  2.3G  153G   2% /
tmpfs           3.9G     0  3.9G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           3.9G     0  3.9G   0% /sys/fs/cgroup
/dev/vda15      105M  3.6M  101M   4% /boot/efi
tmpfs           798M     0  798M   0% /run/user/0
server2 | CHANGED | rc=0 >>
Filesystem      Size  Used Avail Use% Mounted on
udev            2.0G     0  2.0G   0% /dev
tmpfs           395M  608K  394M   1% /run
/dev/vda1        78G  2.2G   76G   3% /
tmpfs           2.0G     0  2.0G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup
/dev/vda15      105M  3.6M  101M   4% /boot/efi
tmpfs           395M     0  395M   0% /run/user/0

Target Individual Hosts and Groups

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

ansible server1 -a "uptime" -u root
server1 | CHANGED | rc=0 >>
21:38:26 up 11 min,  2 users,  load average: 0.00, 0.20, 0.19

Приведенная выше команда проверяет время работы на server1 из группы инвентаризации.

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

ansible server1:server2 -m ping -u root

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

ansible groupname -m ping -u <username>

Обновление всех серверов

Для этого руководства мы предполагаем, что все удаленные серверы работают под управлением Debian или Ubuntu OS.

Выполните следующую команду для обновления программного обеспечения на всех ваших серверах.

ansible all -m apt -a "update_cache=yes upgrade=yes" -u root

Параметр -m определяет модуль для запуска Ansible.

-a относится к аргументам или командам для связанного модуля. Здесь мы используем модуль apt Ansible для обновления серверов точно так же, как мы использовали модуль ping в нашем последнем примере.

update_cache обновляет кэш APT на сервере, а upgrade=yes указывает Ansible выполнить команду apt upgrade.

Для обновления серверов CentOS можно использовать ту же команду, заменив apt на yum, а для серверов Fedora можно заменить apt на dnf.

Если вы используете пользователя ansible, как описано выше, вам нужно изменить команду ansible для запуска с повышенными привилегиями sudo.

ansible server2 -m apt -a "update_cache=yes upgrade=yes" -K -b -u ansible

Здесь -K запрашивает пароль повышения привилегий. -b запускает операцию ansible с переменной become, которая позволяет вам быть другим пользователем. Обе переменные вместе позволяют запускать ansible с повышенными привилегиями sudo. Вам нужно будет использовать это для всех команд, требующих привилегий sudo.

Иногда некоторые из этих команд обновления могут потребовать перезагрузки, поэтому выполните следующую команду для перезагрузки всех ваших серверов.

ansible all -a "reboot" -u root

Это лишь некоторые из основных команд, которые можно выполнять с помощью Ansible.

Похожие статьи

Комментарии (0)