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)