Системы управления конфигурациями предназначены для контроля настроек и операций большого количества серверов. Они позволяют централизованно управлять различными системами в автоматическом режиме.
Существует множество систем управления конфигурациями, предназначенных для Linux (например, Chef или Puppet), но они довольно сложные. Ansible – простое альтернативное решение, не требующее большого количества ресурсов.
Данный мануал поможет установить Ansible на Ubuntu 18.04 и разобраться в базовых понятиях.
Как работает Ansible?
Ansible настраивает клиентские машины с компьютера, на котором установлены все компоненты программы.
Ansible извлекает данные с удалённых машин, выполняет команды и копирует файлы по обычным каналам SSH. Потому для корректной работы системы Ansible не требуется дополнительного программного обеспечения на клиентах. Любой сервер с открытым SSH-портом можно добавить в систему Ansible.
Ansible применяет модульный подход, благодаря чему система легко расширяется и может использовать функциональные возможности основной системы для решения конкретных сценариев. Модули могут быть написаны на любом языке и взаимодействовать в формате JSON.
Конфигурационные файлы в основном записываются в формате YAML. Ansible может взаимодействовать с клиентами через инструменты командной строки или с помощью сценариев (которые также называются Playbooks).
Требования
- Сервер Ubuntu 18.04 (инструкции по начальной настройке можно найти здесь).
- SSH-ключи (настроить их вам поможет мануал Установка SSH-ключей в Ubuntu 18.04).
1: Установка Ansible
Установите пакет Ansible на машину, которая будет использоваться для централизованного управления.
Используйте для установки PPA-репозиторий. Сначала обновите индекс пакетов и установите software-properties-common, пакет, который упрощает управление независимыми программными репозиториями.
sudo apt update
sudo apt install software-properties-common
Теперь можно добавить репозиторий PPA Ansible:
sudo apt-add-repository ppa:ansible/ansible
Нажмите Enter, чтобы принять PPA.
Обновите индекс пакетов системы, чтобы получить доступ к добавленному архиву, а затем установите программу:
sudo apt update
sudo apt install ansible
2: Настройка SSH-доступа к хостам Ansible
Как говорилось выше, Ansible в основном взаимодействует со своими клиентами по SSH. Конечно, он умеет обрабатывать парольную аутентификацию SSH, но проще использовать для этой цели SSH-ключи.
На сервере Ansible используйте команду cat, чтобы отобразить открытые ключи SSH в терминале:
cat ~/.ssh/id_rsa.pub
Скопируйте результат в буфер обмена, затем откройте новый терминал и подключитесь в нем к клиенту Ansible по SSH:
ssh 8host@ansible_host_ip
Перейдите в сессию пользователя root:
su -
Откройте файл authorized_keys:
nano ~/.ssh/authorized_keys
Вставьте в файл SSH-ключи, скопированные с сервера, а затем сохраните и закройте файл (CTRL + X, Y, Enter). Затем введите exit, чтобы вернуться в сессию обычного пользователя.
exit
Поскольку для запуска модулей Ansible использует интерпретатор python, который находится в /usr/bin/python, вам нужно установить на хост Python 2 (иначе Ansible не сможет взаимодействовать с ним). Запустите следующие команды:
sudo apt update
sudo apt install python
Закройте подключение к клиенту:
exit
Повторите этот процесс для каждого клиента Ansible.
3: Настройка хостов Ansible
Ansible отслеживает все серверы, указанные в файле hosts. Чтобы система Ansible могла взаимодействовать с остальными машинами, нужно отредактировать этот файл.
sudo nano /etc/ansible/hosts
В файле хранится множество настроек и примеров конфигурации. В данном случае все они не подходят. Закомментируйте их, добавив символ # в начало.
Не стоит удалять из файла примеры конфигураций, поскольку они могут пригодиться в дальнейшей работе.
Закомментировав все настройки, добавьте в файл свои хосты.
Файл hosts довольно гибкий. В данном случае используйте такой синтаксис:
[group_name]
alias ansible_ssh_host=your_server_ip
Тег group_name позволяет ссылаться сразу на несколько серверов; alias задаёт имя сервера.
Предположим, в данной настройке есть три сервера, которые нужно добавить в Ansible. Чтобы получить доступ к этим серверам с сервера Ansible, введите:
ssh root@your_server_ip
При этом система не должна запрашивать паролей. Предположим, серверы называются host1, host2 и host3 и имеют следующие IP-адреса: 203.0.113.1, 203.0.113.2 и 203.0.113.3 соответственно. Группа будет называться servers.
Чтобы настроить управление этими серверами, нужно добавить в файл такие строки:
[servers]
host1 ansible_ssh_host=203.0.113.1
host2 ansible_ssh_host=203.0.113.2
host3 ansible_ssh_host=203.0.113.3
Хосты можно делить на несколько групп, каждая из которых будет использовать разные параметры настроек.
Если на данный момент попробовать подключиться к одному из хостов при помощи Ansible, команда вернёт ошибку (если только вы не работаете в сессии root). Это происходит потому, что SSH-ключи настроены для пользователя root, а система Ansible, как правило, подключается как текущий пользователь системы. Потому при подключении появится ошибка:
host1 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh.",
"unreachable": true
}
На компьютере Ansible в данном случае используется пользователь 8host. Потому Ansible попытается подключиться к серверам как ssh 8host@server. Это не сработает, если пользователя 8host не существует в удалённой системе.
Чтобы исправить это, можно создать отдельный файл, благодаря которому все серверы в группе servers будут подключаться как пользователь root.
Создайте каталог в структуре настроек Ansible под названием group_vars. В этой папке создайте файлы в формате YAML для каждой группы.
sudo mkdir /etc/ansible/group_vars
sudo nano /etc/ansible/group_vars/servers
Сюда можно поместить настройки.
Примечание: Файлы YAML начинаются с —.
---
ansible_ssh_user: root
Сохраните и закройте файл.
В файле /etc/ansible/group_vars/all можно указать конфигурации для каждого сервера независимо от группы. Индивидуальные настройки хостов можно поместить в каталог /etc/ansible/host_vars.
4: Простые команды Ansible
Теперь хосты настроены и готовы к работе. Попробуйте запустить первую команду, например, ping.
ansible -m ping all
host1 | SUCCESS => {
"changed": false,
"ping": "pong"
}
host3 | SUCCESS => {
"changed": false,
"ping": "pong"
}
host2 | SUCCESS => {
"changed": false,
"ping": "pong"
}
Этот базовый тест позволяет убедиться в том, что Ansible взаимодействует со всеми хостами. Параметр all значит «все хосты». Вместо него можно задать группу:
ansible -m ping servers
Или отдельный хост:
ansible -m ping host1
Чтобы указать несколько хостов, разделите их с помощью двоеточий
ansible -m ping host1:host2
Параметры команды -m ping указывают, что система Ansible должна использовать модуль ping. Эти команды можно запускать на удалённых хостах. Модуль ping в большинстве случаев работает как обычная утилита Linux, но в системе Ansible он проверяет взаимодействие между серверами.
Модуль ping не требует никаких аргументов. Попробуйте запустить другую команду с аргументом –а.
Модуль shell позволяет отправлять команды на удалённый хост и получать вывод. К примеру, чтобы узнать уровень использования памяти на машине host1, нужно ввести:
ansible -m shell -a 'free -m' host1
host1 | SUCCESS | rc=0 >>
total used free shared buffers cached
Mem: 3954 227 3726 0 14 93
-/+ buffers/cache: 119 3834
Swap: 0 0 0
Заключение
Теперь сервер Ansible взаимодействует с другими серверами и может управлять ими с помощью простых команд.
К сожалению, данный мануал не охватывает одной важной функции Ansible – использования сценариев-плейбуков.
Читайте также: