• База знаний
  • /
  • Блог
  • /
  • Wiki
  • /
  • ONLINE CHAT
+380 (44) 364 05 71

Статья также доступна на украинском (перейти к просмотру).

Инструмент автоматизации Ansible

Оглавление

Задача автоматизации процессов управления конфигурациями удаленных серверов наиболее востребована среди DevOps-специалистов. Это связано с отсутствием единого подхода к их решению и сложностью обеспечения надежного и быстрого управления большим количеством различных типов серверов. Предлагаемый инструментарий может стать наиболее удачным решением для более чем 99 % случаев удаленного администрирования.

Существующие подходы к удаленному управлению конфигурациями серверов

Можно выделить два принципиально разных подхода, касающихся удаленного управления машинами. Первый из них заключается в использовании императивных методов управления, когда формируется набор обязательных для выполнения на клиентских машинах директив, задающих детальный алгоритм реализации задачи. Критерием успешности выполнения задачи является одинаковое состояние конфигурации каждой из машин группы серверов. Среди недостатков подхода можно отметить сложность программ, задающих конфигурацию клиентов, а также невозможность обеспечения достаточного уровня надежности выполнения из-за сложности соблюдения условий критерия успешности – обеспечения одинаковых состояний конфигураций. Среди наиболее известных реализаций указанного подхода – использование bash-скриптов для формирования директив, определяющих конфигурацию клиентов.

Второй подход опирается на декларативные методы управления конфигурациями, когда в управляющей программе описывается только результат выполнения задачи без алгоритма ее реализации, то есть фактически она является спецификацией будущей конфигурации. Реализация такой управляющей программы является задачей конкретных клиентских машин со своим программно-аппаратным наполнением. Это отражение известной в мире концепции IaC (Infrastructure as Code), рассматривающей разветвленную инфраструктуру серверов в виде кода, определяющего идемпотентные изменения в ее состоянии. Такой подход обеспечивает стопроцентную надежность выполнения задачи независимо от предыдущего состояния конфигурации системы любой из машин группы серверов. Сколько раз программа не запускалась бы, результат будет тот же. Это более перспективный подход и поэтому существует достаточно много его реализаций.

Сущность одной из реализаций декларативного подхода заключается в использовании предметно-ориентированного языка разметки для формирования управляющих программ – спецификаций задач – и их последующей передачи на клиентские машины для обработки заранее установленным и настроенным специальным программным обеспечением (ПО). Недостатком здесь сложность подготовки клиентского ПО, хотя надежность и качество достаточно высоки. Наиболее известными примерами являются Puppet и Chef.Сущность одной из реализаций декларативного подхода заключается в использовании предметно-ориентированного языка разметки для формирования управляющих программ – спецификаций задач – и их последующей передачи на клиентские машины для обработки заранее установленным и настроенным специальным программным обеспечением (ПО). Недостатком здесь сложность подготовки клиентского ПО, хотя надежность и качество достаточно высоки. Наиболее известными примерами являются Puppet и Chef.

В другой реализации декларативного подхода также используется декларативный язык разметки для описания конфигураций клиентов, однако здесь не требуется наличие дополнительного клиентского ПО для формирования заданной конфигурации. Ее формирование происходит за счет использования защищенного канала, образованного протоколом ssh и возможностями языка Python, установленного на всех клиентских машинах. То есть, управление запуском модулей с описанием конфигурации узлов происходит посредством push-сообщений канала ssh, а их выполнение осуществляется на языке Python. Поэтому метод получил название «push-based», то есть, базирующийся на push-сообщениях. Примером является SaltStack. Определенным недостатком здесь является большое количество дополнительных сервисов, усложняющих его использование.

Альтернативой SaltStack является использование более упрощенной программы Ansible, которая позволяет выполнять те же задачи, что и указанный сервис, однако более проста в использовании. Рассмотрим ее более подробно.

Общие сведения о Ansible

Как уже отмечалось, Ansible опирается на декларативный подход и использует push-сообщения для управления удаленными машинами. В качестве языка разметки используется YAML (Yet Another Markup Language), который ориентирован на описание типовых структур данных и является более простым в использовании по сравнению с XML (eXtensible Markup Language).

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

  • Управляющий узел;
  • Управляемые узлы или клиенты;
  • Список хостов или inventory в терминологии Ansible.

Управляющий узел может быть размещен как на локальном компьютере, так и на удаленном сервере. Для его функционирования достаточно установить соответствующее ПО. Все определения конфигураций клиентов хранятся здесь. Ansible может быть установлен на компьютере с операционной системой (ОС) на базе Linux. ОС Windows не поддерживается в качестве узла управления Ansible, однако возможно установить его на ОС Windows 10 на подсистему WSL (Windows Subsystem for Linux). При этом будут действовать некоторые ограничения по функциональности программы, поэтому лучше использовать ее только для обучения и ознакомления. Среди других требований требуется наличие Python 2 версии 2.7 или Python 3 3.5 или выше. Также необходимо наличие установленного протокола ssh.

Конфигурация программной среды узла может быть задана с помощью файла /etc/ansible/ansible.cfg. Другие файлы ansible.cfg могут быть размещены в текущем каталоге проекта или в домашней пользовательской директории. При этом самый высокий приоритет будет иметь файл текущей директории проекта.

Управляемые узлы могут включать в себя от одного до бесконечного количества машин (существуют только технические ограничения), на которых сконфигурирован сервер ssh и установлен Python соответствующей версии. Этого вполне достаточно для возможности управления клиентом из управляющего узла.

Список хостов является списком IP-адресов управляемых узлов с учетной информацией, обычно находится в файле /etc/ansible/hosts.

Практическое использование Ansible

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

Развертывание

Развертывать управляющий узел будем на сервере под управлением ОС Ubuntu 20.04. В соответствии с требованиями, необходимыми для ПО, проверим существующую версию языка Python. Для этого наберем в терминале:

$ python3 --version

Проверка версии python

Установленная версия Python 3.8 полностью отвечает установленным требованиям.

После этого включим PPA (Personal Package Archive) в список источников нашей системы с помощью следующей команды:

$ sudo apt-add-repository ppa:ansible/ansible

Добавление репозитория PPA

После подтверждения согласия процесс подключения продолжится:

Процесс подключения репозитория PPA

Теперь обновим индекс пакетов системы, чтобы стали доступны новые пакеты. Для этого введем в терминале:

$ sudo apt update

Обновление пакетов системы

Начнем процесс установки программы с помощью следующей команды:

$ sudo apt install ansible

Установка Ansible

Требуемый дополнительный объем дискового пространства для программы составляет 324 MB. После подтверждения нашего согласия на его выделение процесс установки продолжится.

Процесс установки Ansible.

Конечный экран вывода программы установки выглядит следующим образом:

Завершение установки Ansible

Убедимся, что программа установлена ??и выясним названия и местонахождение ее основных компонентов. Для этого введем в терминале:

$ ansible –version

Проверка версии Ansible

Как можно убедиться, программа Ansible успешно установлена ??и определены локации ее основных модулей.

Формирование списка управляемых узлов

Список удаленных клиентов формируется в файле /etc/ansible/hosts с вводом необходимой учетной информации для автоматического подключения к узлам по ssh. Этот путь к файлу hosts со списком хостов устанавливается по умолчанию программой. Однако местонахождение файла может быть и другим в зависимости от потребностей проекта. Это следует учитывать при запуске команд Ansible, о чем будет сказано ниже. Откроем файл в редакторе:

$ sudo nano /etc/ansible/hosts

Запуск редактора nano

Редактирование файла hosts через редактор nano

В открывшемся файле создадим группу webservers, в которой пропишем имена хостов, IP-адреса и учетные данные для каждого из хостов. В нашем случае, подключение к хосту server1 будет происходить по паролю, а к хосту server2 – с использованием ключей ssh. Здесь мы указали путь доступа к местонахождению файла секретного ключа для server2. Это необходимо в случае если удаленный хост потребует подтверждения наличия указанного ключа на управляющем узле. Открытый или публичный ключ в это время должен находиться на server2 в специальном файле аккаунта пользователя, который мы используем для входа. Адрес этого файла: ~/.ssh/authorized_keys.

В разделе all:vars мы указали общие для всех групп хостов параметры – логин пользователя для входа (alexandr75001) и указание использования Python3.

Сохраним введенную в файл информацию (Ctrl+O) и выйдем из редактора (Ctrl+X).

Теперь выведем список доступных для Ansible управляемых узлов и одновременно убедимся, что программа правильно идентифицировала введенную нами информацию по клиентским узлам. Для этого введем следующую команду:

$ ansible-inventory --list -y

список управляемых узлов дл Ansible

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

Настройка конфигурации системы

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

$ nano /etc/ansible/ansible.cfg

Запуск редактора nano

Редактирования файла ansible.cfg в редакторе nano

В открывшемся файле в комментариях можно посмотреть примеры его заполнения. Добавим в него информацию по трем разделам – defaults, ssh_connection и diff. Установленные параметры позволяют регулировать автоматический процесс соединения по протоколу ssh и изменять значения стандартных настроек, например, касающихся местоположения файла логов программы, выдачи системных сообщений и многих других. Сохраним изменения и выйдем из редактора (Ctrl+O, Ctrl+X).

Тестирование

Сущность тестирования заключается в выяснении ситуации относительно доступности управляемых узлов, достоверности их учетных данных для соединения по протоколу ssh и возможность запуска на узлах модулей Ansible с помощью установленного на них Python. Для этого Ansible имеет модуль ping, который может быть запущен на управляющем узле с разным набором параметров. В частности, там можно указать логин пользователя узлов, если он не указан в файле hosts. Например, протестируем управляемые узлы нашего проекта, запустив соответствующий модуль Ansible:

$ ansible all –m ping

Запуск модуля ping

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

server | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

Именно этот ответ говорил бы о полной готовности всей разветвленной инфраструктуры узлов к работе.

Работа с командами Ansible

После проверки работоспособности всей инфраструктуры можно управлять узлами с помощью команд Ansible. Все эти команды начинаются с ключевого слова ansible и могут иметь значительный набор параметров. Например, можно управлять таким образом как всей группой клиентов, так и выбранными машинами даже одной.

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

$ ansible all -a "df -h"

Та же команда, но только для узлов нашей группы webservers будет выглядеть следующим образом:

$ ansible webservers -a "df -h"

Для одного узла той же группы:

$ ansible server1 -a "df -h"

Также можно перечислять нужные узлы прямо в команде:

$ ansible server1:server2 -a "df -h"

Вместо команды «df –h» может быть использована любая другая, но принцип управления узлами остается прежним.

Как отмечалось выше, при запуске команд Ansible необходимо учитывать местонахождение файла hosts со списком управляемых узлов. Для этого следует использовать параметр –i. Например, укажем в команде местоположение файла hosts в другом месте:

$ ansible webservers -a "df -h" –i /etc/mmm/hosts

Работа с Playbook

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

Код в playbook является четко структурированным. Он разбит на несколько разделов, в каждом из которых описываются определенные области данных. Приведем названия этих разделов и их назначение:

hosts – указываются названия узлов, прописанных в общем списке.

become – прописывается уровень пользовательской привилегии, от имени которого запускается playbook.

vars – определение пользовательских переменных.

tasks – список команд для исполнения.

Для примера, приведем код реального playbook, который содержит информацию из нашего файла hosts:

hosts: webservers
  become: 'yes'
  vars:
    user:
      - name: "alexandr75001"
        password: "aGRJt3gaOb"
        ssh_key: "ssh-rsa ..."
    packages:
      - htop
      - wget
      - curl
  tasks:  [...]

Вышеприведенный код после запуска приведет к установке указанных в коде пакетов htop, wget и curl на всех узлах нашей группы webservers. Значение yes в разделе become говорит о том, что playbook будет запущен от имени пользователя с правами sudo. В разделе tasks могут быть и другие задачи, которые были бы выполнены. Ниже приведена структура указанного раздела:

tasks:
      - name: Task name
          user: [...]
     loop: [...]

В подразделе name прописывается сокращенное описание нашей задачи для самодокументирования playbook.

Модуль user запускается для выполнения и настраивается этой задачей. Он является объектом, инкапсулирующим требуемое состояние конфигурации. Такие модули могут управлять системными ресурсами и любыми службами.

Модуль loop представляет собой цикл по переменным. Он дает возможность организовать автоматическое повторение выполнения задачи любое количество раз с разными входными данными. Для этого достаточно запустить playbook только раз.
Дата-центр FREEhost.UA предлагает услуги аренды выделенных и виртуальных серверов по самым выгодным ценам в Украине. Гарантия доступности оборудования 99,99%, круглосуточная техподдержка, резервное электропитание. Приглашаем Вас воспользоваться нашими услугами.

Подписывайтесь на наш телеграмм-канал https://t.me/freehostua, чтобы быть в курсе новых полезных материалов.

Смотрите наш канал Youtube на https://www.youtube.com/freehostua.

Мы в чем-то ошиблись, или что-то пропустили?

Напишите Об этом в комментариях, мы с удовольствием ответим и обсуждаем Ваши замечания и предложения.

Дата: 10.01.2023
Автор: Евгений
Голосование

Авторам статьи важно Ваше мнение. Будем рады его обсудить с Вами:

comments powered by Disqus
navigate
go
exit
Спасибо, что выбираете FREEhost.UA