ProCloud Yandex
11.09.2023
читать 5 минут

Система управления конфигурацией Ansible

/upload/iblock/6f3/bv0a4zd8nqhj80ped5h7srz9q5grgrkc/sales_stats_%281%29.jpg

Сегодня мы рассмотрим Ansible, софт для удаленного управления конфигурацией сервера. Также обсудим его сильные стороны и ответим на вопрос: Стоит ли его использовать?

Что такое Ansible?

Ansible представляет собой ПО с открытым исходным кодом, которое предназначено для управления конфигурацией. Данный софт был создан в 2012 году Майклом Де Хааном. Фактически Ansible принимает на себя все задачи по приведению удаленных машин в желаемое состояние. Таким образом пользователю потребуется лишь указать, способ работы. Для этого используются сценарии. На практике упомянутое ПО позволяет просто и быстро переконфигурировать систему.

Почему Ansible?

Существует очень много аналогов Ansible, например, Chef, Salt и Puppet. Однако он выделяется на их фоне следующими преимуществами:

  • Функционирует сразу в двух режимах (push и pull), а не в одном;
  • Понятный язык написания сценариев;
  • Не требует установки дополнительного софта на контролируемые узлы, так как все задачи выполняются с помощью SSH;
  • Освоить ПО и начать работу с Ansible можно за очень короткое время;
  • Позволяет последовательно обновлять состояния узлов;
  • Имеет подробную и актуальную документацию;
  • Реализована на базе Python, что упрощает написание дополнительных модулей.

Установка

Для установки Ansible потребуется Python версии 2.6 или же выше. Когда речь касается требований к узлам, то на них должен стоять Python 2.4. Также в список рекомендованных модулей для Python входит jinja2, paramiko и PyYAML. Чтобы установить Ansible на Ubuntu нужно использовать добавить репозиторий и установить пакет. Это выглядит следующим образом:

sudo add-apt-repository -y ppa:rquillo/ansible
sudo apt-get update
sudo apt-get install ansible -y

Группы серверов

Чтобы передать Ansible список групп серверов для управления потребуется использовать один из двух методов:

  • Текстовый файл, который мы опишем ниже;
  • Сторонним скриптом, который возвращает необходимую для нас группу серверов. Готовые скрипты есть для многих известных облачных провайдеров и приложений можно найти в интернете.

Файл hosts

По умолчанию файл hosts расположен тут – /etc/ansible/hosts. Однако его расположение можно поменять с помощью параметра окружения $ANSIBLE_HOSTS. Документ может иметь такой вид:

[group_name1]
one.node.com
two.node.com
three.node.com

[group_name2]
rs1.node.com ansible_ssh_port=5555 ansible_ssh_host=192.168.1.24
rs2.node.com
ns[01:24].node.com

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

Переменные

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

  • для ролей: “role_name/vars/task_name.yml”;
  • для групп: “group_vars/group_name”;
  • для хостов: “hosts_vars/host_name

Модули Ansible

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

  • Взаимодействие с утилитами;
  • Контроль пакетов;
  • Сетевая инфраструктура;
  • Виртуализация и облачный софт;
  • Файлы;
  • Базы данных;
  • Система;
  • Мониторинг.

Примеры простых задач

Благодаря Ansible открывается возможность одновременного выполнения одного процесса на сразу нескольких хостах одновременно. В качестве примера мы отправим запрос ping на группу серверов:

$ ansible dnsservers -m ping
dns1.node.com | success >> {
    "changed": false,
    "ping": "pong"
}

dns2.node.com | success >> {
    "changed": false,
    "ping": "pong"
}

А теперь создадим логический том под названием “volume” в группе “group”:

$ ansible dnsservers -m lvol -a "vg=group lv=volume size=1024 state=present"
dns1.node.com | success >> {
    "changed": true,
    "msg": ""
}

dns2.node.com | success >> {
    "changed": false,
    "msg": ""
}

Cценарии (playbooks)

Для создания собственного сценария в данной утилите вам понадобятся знания YAML. Он выделяется простотой в сравнении с JSON и XML. В открытом доступе можно найти сценарии практически под любые задачи.

Для запуска сценария используйте команду ansible-playbook по следующему правилу:

ansible-playbook <file_name.yml> ... [дополнительные аргументы]

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

---
- hosts: webservers

Основные элементы базового сценария включают:

  • hosts — определяет узлы или группы узлов, к которым применяются задачи;
  • tasks — описывает желаемое состояние узла. Вместо узлов можно использовать роли.

Шаблонизация

За шаблонизацию в Ansbile отвечает Jinja2. Ниже примеры легких шаблонов:

# IPv4-адрес для просмотра powerdns
local-address={{ ansible_default_ipv4.address }}

# IPv6-адрес для просмотра powerdns
local-ipv6={{ ansible_default_ipv6.address }}

Контроль выполнения

Достаточно важный элемент. Давайте представим, что при работе со сценарием вам потребовалось мониторить переменные или состояния и относительно результата выполнять или пропускать действия. В таком случае нам потребуется оператор “when”:

tasks:
      # сохраняем файл шаблона и результат задачи в переменную last_result
    - template: src=/templates/foo.j2 dest=/etc/foo.conf
      register: last_result
      # проверяем переменную last_result.changed, true - выполняем, иначе - пропускаем
    - command: echo 'the file has changed'
      when: last_result.changed

Делегирование задачи другому хосту

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

- name: disable nagios alerts for this host webserver service
  nagios: action=disable_alerts host={{inventory_hostname}} services=dnsserver
  delegate_to: mon_host.node.com

В результате сообщения для dnsserver будут отключены.

Роли

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

Ansible AWX

Если вам нужна панель управления Ansible, то просто установите Ansibleworks AWX с официального сайта. Она удобна и проста в использовании. Но полное управление Ansible возможно и через командную строку, как это и было сделано в нашем обзоре.

Заключение

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

Новости
27 декабря 202327.12.2023
Продуктовый дайджест 2023
20 декабря 202320.12.2023
читать 2 минутычитать 2 мин
Новые тарифы и возможности