Вступление
Системы управления конфигурациями предназначены для упрощения управления большим количеством серверов для администраторов и рабочих групп. Они позволяют вам автоматически управлять многими различными системами из одного центрального места.
Хотя существует много популярных систем управления конфигурацией, доступных для систем Linux, таких как Chef и Puppet, они часто являются более сложными, чем многие люди хотят или нуждаются. Ansible - отличная альтернатива этим параметрам, поскольку для начала требуется гораздо меньшие накладные расходы.
В этом руководстве мы обсудим, как установить Ansible на сервер Ubuntu 18.04, а также рассмотрим некоторые основы использования программного обеспечения.
Как работает Ansible?
Ansible работает путем настройки клиентских компьютеров с компьютера, на котором установлены и настроены компоненты Ansible.
Он связывается по обычным каналам SSH для получения информации с удаленных компьютеров, выдачи команд и копирования файлов. Из-за этого система Ansible не требует установки дополнительного программного обеспечения на клиентские компьютеры.
Это один из способов, которым Ansible упрощает администрирование серверов. Любой сервер с открытым SSH-портом может быть переведен под зонтик конфигурации Ansible, независимо от того, на какой стадии он находится в своем жизненном цикле. Это означает, что любой компьютер, которым вы можете управлять через SSH, вы также можете администрировать через Ansible.
Ansible использует модульный подход, облегчающий использование функциональных возможностей основной системы для работы с конкретными сценариями. Модули могут быть написаны на любом языке и общаться в стандартном формате JSON.
Файлы конфигурации в основном записаны в формате сериализации данных YAML из-за его выразительной природы и сходства с популярными языками разметки. Ansible может взаимодействовать с хостами с помощью инструментов командной строки или сценариев конфигурации, которые называются Playbooks.
Предпосылки
Чтобы следовать этому уроку, вам понадобится:
-
Два или более серверов Ubuntu 18.04. Один из них будет использоваться как вашAnsible server, а оставшийся - как вашAnsible hosts. У каждого должен быть пользователь, отличный отroot, с привилегиями
sudo
и настроенным базовым брандмауэром. Вы можете настроить это, следуя нашимInitial Server Setup Guide for Ubuntu 18.04. Обратите внимание, что в примерах, приведенных в этом руководстве, указаны три хоста Ansible, но показанные команды и конфигурации можно настроить для любого количества клиентов. -
Ключи SSH, сгенерированные для пользователя, отличного отroot, на вашем сервере Ansible. Для этого следуйте шагу 1 нашего руководства поHow to Set Up SSH Keys on Ubuntu 18.04. В рамках этого руководства вы можете сохранить пару ключей в папке по умолчанию (
~/.ssh/id_rsa
), и вам не нужно защищать ее паролем.
[[step-1 -—- install-ansible]] == Шаг 1. Установка Ansible
Чтобы начать использовать Ansible в качестве средства управления различными серверами, вам необходимо установить программное обеспечение Ansible хотя бы на одну машину.
Чтобы получить последнюю версию Ansible для Ubuntu, вы можете добавить PPA проекта (личный архив пакетов) в вашу систему. Однако перед этим вы должны сначала убедиться, что у вас установлен пакетsoftware-properties-common
. Это программное обеспечение облегчит управление этим и другими независимыми хранилищами программного обеспечения:
sudo apt update
sudo apt install software-properties-common
Затем добавьте Ansible PPA, введя следующую команду:
sudo apt-add-repository ppa:ansible/ansible
НажмитеENTER
, чтобы принять добавление PPA.
Затем обновите индекс пакетов вашей системы еще раз, чтобы он знал о пакетах, доступных в PPA:
sudo apt update
После этого обновления вы можете установить программное обеспечение Ansible:
sudo apt install ansible
Ваш Ansible сервер теперь имеет все программное обеспечение, необходимое для администрирования ваших хостов.
[[step-2 -—- configuring-ssh-access-to-the-ansible-hosts]] == Шаг 2. Настройка доступа SSH к Ansible Hosts
Как упоминалось ранее, Ansible в основном связывается с клиентскими компьютерами через SSH. Хотя он, безусловно, способен обрабатывать SSH-аутентификацию на основе паролей, использование SSH-ключей может упростить задачу.
На своем сервере Ansible используйте командуcat
, чтобы вывести содержимое файла открытого ключа SSH вашего пользователя без полномочий root на вывод терминала:
cat ~/.ssh/id_rsa.pub
Скопируйте полученный результат в буфер обмена, затем откройте новый терминал и подключитесь к одному из ваших хостов Ansible, используя SSH:
ssh sammy@ansible_host_ip
Переключитесь на пользователяroot клиентского компьютера:
su -
Как пользовательroot откройтеauthorized_keys
в каталоге~/.ssh
:
nano ~/.ssh/authorized_keys
Вставьте в файл SSH-ключ пользователя сервера Ansible, затем сохраните файл и закройте редактор (нажмитеCTRL + X
,Y
, затемENTER
). Затем выполните командуexit
, чтобы вернуться к пользователю хоста, отличному отroot:
exit
Наконец, поскольку Ansible использует интерпретатор Python, расположенный в/usr/bin/python
, для запуска своих модулей, вам необходимо установить Python 2 на хост, чтобы Ansible мог с ним взаимодействовать. Выполните следующие команды, чтобы обновить индекс пакета хоста и установить пакетpython
:
sudo apt update
sudo apt install python
После этого вы можете еще раз запустить командуexit
, чтобы закрыть соединение с клиентом:
exit
Повторите этот процесс для каждого сервера, который вы собираетесь контролировать с помощью вашего сервера Ansible. Затем мы настроим сервер Ansible для подключения к этим хостам с помощью файла Ansiblehosts
.
[[step-3 -—- setting-up-ansible-hosts]] == Шаг 3. Настройка Ansible Hosts
Ansible отслеживает все известные ему серверы через файлhosts
. Нам нужно настроить этот файл, прежде чем мы сможем начать общаться с другими нашими компьютерами.
Откройте файл с правамиsudo
, например:
sudo nano /etc/ansible/hosts
Внутри файла вы увидите несколько примеров конфигураций, которые были закомментированы (с#
перед каждой строкой). Эти примеры на самом деле не работают для нас, поскольку хосты, перечисленные в каждом из них, составлены. Однако мы будем хранить эти примеры в файле, чтобы помочь нам с настройкой, если мы хотим реализовать более сложные сценарии в будущем.
Файлhosts
довольно гибкий и может быть настроен несколькими способами. Синтаксис, который мы собираемся использовать, выглядит следующим образом:
[group_name]
alias ansible_host=your_server_ip
[.note] #Note: С выпуском Ansible версии 2.0 переменная конфигурацииansible_host
заменила исходную переменнуюansible_ssh_host
. Если вы используете старую версию Ansible, вам следует использовать более старую, более длинную переменную.
#
В этом примереgroup_name
- это тег организации, который позволяет вам ссылаться на любые перечисленные под ним серверы одним словом, аalias
- это просто имя для ссылки на один конкретный сервер.
Итак, в нашем сценарии мы представляем, что у нас есть три сервера, которыми мы будем управлять с помощью Ansible. На данный момент эти серверы доступны с сервера Ansible, набрав:
ssh root@ansible_host_ip
Вам не нужно запрашивать пароль, если вы правильно его настроили. В целях демонстрации предположим, что IP-адреса наших хостов:203.0.113.1
,203.0.113.2
и203.0.113.3
. Мы настроим это так, чтобы мы могли обращаться к ним по отдельности какhost1
,host2
иhost3
, или как к группе с именемservers
.
Это блок, который мы должны добавить в наш файлhosts
для этого:
/etc/ansible/hosts
[servers]
host1 ansible_host=203.0.113.1
host2 ansible_host=203.0.113.2
host3 ansible_host=203.0.113.3
Хосты могут быть в нескольких группах, и группы могут настраивать параметры для всех своих членов. Давайте попробуем это сейчас.
С нашими текущими настройками, если мы попытаемся подключиться к любому из этих хостов с помощью Ansible, команда потерпит неудачу (при условии, что вы не работаете как пользователь root). Это связано с тем, что ваш SSH-ключ встроен для пользователяroot в удаленных системах, и Ansible по умолчанию будет пытаться подключиться как ваш текущий пользователь. Попытка подключения получит эту ошибку:
Outputhost1 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh.",
"unreachable": true
}
На сервере Ansible мы используем пользователяsammy. Ansible попытается подключиться к каждому хосту сssh sammy@server
. Это не сработает, если пользовательsammy также не находится в удаленной системе.
Мы можем создать файл, который сообщает всем серверам в группе «серверы» подключиться как пользовательroot.
Для этого мы создадим каталог в структуре конфигурации Ansible с именемgroup_vars
. В этой папке мы можем создавать файлы в формате YAML для каждой группы, которую мы хотим настроить:
sudo mkdir /etc/ansible/group_vars
sudo nano /etc/ansible/group_vars/servers
Файлы YAML начинаются с «-», поэтому убедитесь, что вы не забыли эту часть.
/etc/ansible/group_vars/servers
---
ansible_user: root
[.note] #Note: Подобно переменнойansible_host
,ansible_user
заменил переменнуюansible_ssh_user
в версии 2.0. Если вы используете более старую версию Ansible, чем 2.0, обязательно используйте более старую, более длинную переменную.
#
Сохраните и закройте этот файл, когда вы закончите.
Если вы хотите указать детали конфигурации для каждого сервера, независимо от групповой ассоциации, вы можете поместить эти детали в файл по адресу/etc/ansible/group_vars/all
. Отдельные хосты можно настроить, создав файлы с именами по их псевдонимам в каталоге/etc/ansible/host_vars
.
[[step-4 -—- using-simple-ansible-commands]] == Шаг 4. Использование простых команд Ansible
Теперь, когда у нас настроены хосты и достаточно деталей конфигурации, чтобы мы могли успешно подключаться к нашим хостам, мы можем попробовать нашу самую первую команду.
Пропингуйте все серверы, которые вы настроили, набрав:
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 работает во многом подобно обычной утилитеping
в Linux, но вместо этого он проверяет возможность подключения Ansible.
Модуль ping на самом деле не принимает никаких аргументов, но мы можем попробовать другую команду, чтобы увидеть, как это работает. Мы передаем аргументы в сценарий, набирая-a
.
Модуль «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 и убедились, что он может взаимодействовать с каждым хостом. Мы также использовали командуansible
для удаленного выполнения простых задач.
Хотя это полезно, мы не рассмотрели самую мощную функцию Ansible в этой статье: Playbooks. Ansible Playbooks - это мощный и простой способ управления конфигурациями серверов и развертыванием на нескольких машинах. Для введения в Playbooks см.this guide. Кроме того, мы рекомендуем вам проверитьofficial Ansible documentation, чтобы узнать больше об этом инструменте.