Ansible сравнить два файла

Обновлено: 07.07.2024

Инструкция представляет из себя шпаргалку по работе с Ansible. У автора не стоит задачи подробного пояснения всех операций — только описание задачи и пример того, как ее можно решить с помощью ansible. Для более подробного описания я постараюсь указать ссылки на официальную документацию. Также в данную шпаргалку не войдут все возможные действия, которые можно выполнить с помощью данной системы — только популярные и те, с которыми приходилось сталкиваться самому автору. По мере возможности, их список будет пополняться.

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

Получение информации

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

1. Показать информацию об удаленной системе, на которой запускается ansible.

Выполняется с помощью модуля debug, который должен показать содержимое ansible_facts:

- name: Print all available facts
ansible.builtin.debug:
var: ansible_facts

* ansible_facts содержит массив данных с информацией о системе. Однако, функция сборки информации может быть отключена (так как на ее работу тратится, относительно, много времени) в настройках плейбука с помощью опции gather_facts: false — в этом случае, значение нужно изменить на true.

Также мы можем обратиться к конкретному элементу массива ansible_facts, получив информацию о конкретной настройке или опции:

* например, имя компьютера.

2. Отображение на экран переменной.

Выше мы уже использовали debug для отображения переменной — принцип тот же:

* при выполнении задачи на экране мы увидим значение переменной variable. Обратите внимание, что запись ansible.builtin.debug и debug — это одно и то же, то есть, ansible.builtin можно не писать.

3. Сохранение результата в переменную.

Выполняется с помощью register:

- name: Run a shell command and register its output as a variable
shell: command
register: command_result

* в данном примере мы запишем в переменную command_result все то, что мы получили с помощью команды command.

Вывести на экран содержимое можно с помощью debug:

- name: Show Value of Variable
debug:
var: command_result.stdout

* обратите внимание, что мы выводим не все содержимое, а только stdout, то есть то, что должна была вывести в консоль команда.

4. Получить список сервисов.

Для этого существует service_facts:

- name: Populate service facts
ansible.builtin.service_facts:

- name: Print all available facts
ansible.builtin.debug:
var: ansible_facts.services

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

Проверки и условия

В данную группу войдут действия, которые помогут нам ограничить выполнение задач.

1. Проверка на пустую папку.

Задачи сводится к двум операциям:

  • получении списка файлов в целевом каталоге (например, с помощью команды ls) и регистрации полученного значения в переменную с помощью register.
  • проверка содержимого переменной, которую мы получили на шаге 1 с помощью when.

Пример будет таким:

- name: Register Contents of PGDATA Folder
shell: ls /var/lib/postgresql/11/main
register: pg_contents

- name: Init PostgreSQL DB
shell: /opt/pgpro/std-11/bin/pg-setup initdb
environment:
PGDATA: "/var/lib/postgresql/11/main"
when: pg_contents["stdout_lines"] | length == 0

2. Проверить, определена ли переменная.

Для этого используется опция is defined (определена) или is not defined (не определена):

when: pgpro is defined

when: pgpro is not defined

* в данном примере мы проверим наличие переменной pgpro. На практике такая проверка имеет значение, так как если мы попробуем выполнить действия с несуществующей переменной, Ansible нам вернет ошибку.

В официальной документации про это сказано в статье о when (ссылка выше).

3. Выполнение команды, если сервис в рабочем состоянии.

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

- name: Populate service facts
ansible.builtin.service_facts:

- name: Stop Service If Running One
shell: systemctl stop apache2
when: ansible_facts.services["apache2.service"] is defined and ansible_facts.services["apache2.service"].state == "running"

* в данном примере мы проверим, есть ли служба apache2 и запущена ли она. Если это так, то мы ее останавливаем.

Подробнее о service_facts можно прочитать в документации (ссылка выше в разделе 4. Получить список сервисов).

Установки пакетов, модулей и расширений

В данном разделе мы коснемся всего, что приводит к установке чего бы то ни было. А именно:

  • Установки пакетов в систему.
  • Загрузки исходников.
  • Установке дополнительных модулей.
  • Распаковке архивов.

Рассмотрим это подробнее.

1. Установка модуля в nodejs.

Установка модулей в nodejs выполняется с помощью npm. Для него в ansible есть отдельная функция:

- name: Install nodejs modules.
npm:
name: newman
global: yes

* в данном примере будет выполнена установка newman, которая будет доступна всем проектам (опция global).

2. Загрузка из GIT.

Выполняется с помощью модуля git:

* в данном примере мы сделаем клон репозитория в каталог /tmp/docker-compose.

3. Распаковка архива.

Выполняется с помощью unarchive:

* в данном примере мы распакуем исходник для nginx в каталог /tmp. Обратите внимание на две вещи:

  • Мы используем переменную nginx_ver. Данная переменная должна быть определена при запуске плейбука, или в инвентарном файле, или в var, или в default.
  • Опция creates позволит не выполнять операцию, если существует файл /tmp/nginx->.tar.gz.

Настройка системы

В данном разделе мы рассмотрим процессы, которые больше подходят для категории настройки системы.

1. Добавить задание в cron.

Выполняется с помощью модуля cron:

* в данном примере мы создадим задание для запуска команды /scripts/command.sh каждый день, каждые 6 часов.

2. Добавить публичный ключ хоста в known_hosts.

Делается с помощью known_hosts. Пример из официальной документации:

3. Создание новых SSH-ключей для сервера.

Создание ключей реализуется с помощью модуля openssh_keypair:

* в данном примере мы создадим 4 ключа разных типов: dsa, ecdsa, ed25519, rsa. Так как у каждого из них свои требования к размеру, перечень представлен в виде двумерного массива. Ключи будут созданы в каталоге /etc/ssh/.

4. Создание системной учетной записи.

Для этого есть модуль user. У него много опций, но для создания системной учетной записи нам достаточно:

- name: Create User Consul
user:
name: consul
system: yes
comment: "Consul Agent"

* в данном примере будет создана учетная запись consul.

5. Работа с systemd.

Для данной настройки есть одноименный модуль systemd. Рассмотрим варианты его использования.

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

- name: systemd reload
systemd:
daemon_reload: yes

б) разрешить сервис (автозапуск):

- name: mysql enable
systemd:
name: mysql
enabled: yes

* для сервиса mysql.

в) перезапустить сервис:

- name: mysql reload
systemd:
name: mysql
state: restarted

* для сервиса mysql.

6. Настройка брандмауэра.

Выполняется разными модулями в зависимости от используемой системы управления netfilter:

Рассмотрим небольшие примеры.

- name: Block specific IP
iptables:
chain: INPUT
source: 8.8.8.8
jump: DROP

Добавить 80 порт:

Добавить порты с циклом:

Работа с папками и файлами

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

1. Создание каталогов и файлов.

Создание файлов и каталогов выполняется с помощью модуля file.

а) для каталога в качестве state указываем directory:

б) для создания файла указываем убираем опцию state (или даем ей значение file):

- name: Create File
file:
path: "/var/www/site1/index.php"
owner: www-data
group: www-data
mode: 0644

* в данном примере мы созданим файл index.php в каталоге /var/www/site1.

2. Копирование файлов из каталога.

Для копирования данных мы используем модуль copy:

- name: Copy Cert File If Different
copy:
src: ">"
dest: /etc/ssl/dmosk
remote_src: no
mode: 0644
owner: root
group: root
with_fileglob:
- files/*

* в данном примере мы прочитаем все содержимое каталога files на компьютере с ansible, и скопируем его в каталог /etc/ssl/dmosk на целевом компьютере.

3. Используем шаблон.

Копирование из шаблона отличается от копирования из файла тем, что в шаблоне могут использоваться переменные, которые будет заменяться их значениями в момент копирования. Для самого процесса копирования из шаблона используется модуль template:

- name: Create Config for Consul Agent
template:
src: templates/consul/config.json.j2
dest: /etc/consul.d/config.json

* в данном примере мы возьмом шаблон templates/consul/config.json.j2 на компьютере ansible и разместим его в по пути /etc/consul.d/config.json на целевом компьютере.

4. Удалить последние 30 файлов.

Задача решается в два этапа:

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

Поиск выполняем с помощью модуля find, удаление — file:

- name: "Get list of backup files"
find:
paths: "/backup"
file_type: file
register: founds

* в данном примере мы ищем файлы в каталоге /backup, после чего сортируем найденное и удаляем по списку все файлы, которые идут после 30-го.

Для этого используется модуль uri. Простой пример:

* в данном примере мы скачаем файл с ресурса, где требуется аутентификация по токену, который передается в заголовке. Заголовки мы передаем с помощью параметра headers. Также мы задаем права на загруженный файл и делаем в качестве владельца пользователя и группу dmosk.

Виртуализация VMware

Работа с виртуальными машинами на платформе VMware выполняется с помощью модуля vmware_guest.

Мы рассмотрим несколько примеров.

1. Базовое подключение.

Для выполнения действий над виртуальными машинами мы должны подключиться к хосту VMware. Для этого используем данные строки:

* параметр validate_certs, выставленный в no, позволит избежать ошибки, если у нас на хосте используется самоподписанный сертификат (как правило, так и есть).

2. Переименовать виртуальную машину.

Для выполнения действия нам нужно знать идентификатор виртуальной машины:

* где uuid — идентификатор виртуальной машины; name — новое имя виртуальной машины.

3. Конвертировать виртуальную машину в шаблон.

Для этого нужно просто задать признак is_template:

Разное

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

1. Шифрование строки.

С помощью ansible-vault мы можем шифровать файлы и папки. Это позволит нам хранить секреты не в открытом виде. Данные расшифровываются в момент выполнения задач.

Данной командой мы получаем шифрованную строку:

Система запросит ввести дважды пароль и предложит ввести строку, которую нужно зашифровать. После мы должны нажать 2 раза Ctrl + D — мы получим строку, которая начинается с !Vault и различные символы.

Для того, чтобы в момент выполнения задачи ansible расшифровал данные, при запуске плейбука мы должны указать ключ --ask-vault-pass:

2. Игнорировать ошибки.

Если ansible столкнется с ошибкой при выполнении задачи, работа плейбука будет завершена. Иногда, нужно пропустить ошибку при выполнении определенной задачи, чтобы выполнение было продолжено. Для этого существует опция ignore.

а) чтобы пропустить ошибки выполнения, в настройка задачи используем:

- name: Bad Task
.
ignore_errors: yes

б чтобы игнорировать ошибки при подключении к хосту:

- name: Bad Task
.
ignore_unreachable: yes

3. Начинать выполнение с определенной задачи.

При выполнении отладки, полезно запустить плейбук, но начать выполнение с определенной задачи. Остальные пропустить.

Это можно сделать с помощью опции --start-at-task:

ansible-playbook . --start-at-task="Start Job"

* в данном примере плейбук начнет выполнять задания с задачи Start Job.

4. Завершить выполнение плейбука после определенной задачи.

С помощью данной конструкции:

5. Зависимые роли.

С помощью файла meta/main.yml в роли мы можем определить пред-роль, от которой зависит выполнение текущей роли. Для этого настраивается опция dependencies:

dependencies:
- role: pred

6. Вставка роли и ее задач.

Позволяет в процессе выполнения задачи подключить роль. Делается при помощи include_role:

- name: "Include Other Role"
include_role:
name: other_role

А это пример, как подключить роль и сделать так, чтобы все ее задачи выполнились на определенном хосте:

7. Замены в строке.

Замены выполняются с помощью модуля replace:

* в данном примере мы добавляем комментарий к строке server.address=127.0.0.1.

8. Повторы при выполнении задачи.

Мы можем управлять цикличностью выполнения задач с помощью retries (количиство повторов), delay (задержка в секундах).

Рассмотрим пример повтора выполнения задачи при возникновении ошибки:

- name: Run anything command
command: /foo/bar/cmd
register: result
retries: 3
delay: 60
until: result is not failed

* в данном примере мы будем выполнять команду /foo/bar/cmd пока ее выполнение не закончится без ошибок. Количество повторов будет равен 3 с интервалом в 60 секунд.

Есть ли способ сравнить файл на двух удаленных серверах с помощью ansible.

Я хотел бы проверить, являются ли эти два файла одним и тем же содержимым.

1 ответ

Мне интересно, как лучше всего редактировать файлы на удаленном сервере linux. Я использовал Emacs вместо ssh, что сработало очень хорошо. Однако мне также нравится идея копирования файлов на мой локальный компьютер, а затем редактирования их в графическом приложении Emacs. Есть ли преимущества.

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

Похожие вопросы:

У меня есть веб-сервис, который находится на serverA. Веб-сервис будет отвечать за поиск файлов определенного типа в виртуальном каталоге на serverB, а затем возвращать полный URL в файлы. У меня.

Вот такая ситуация. У меня есть основной веб-сервер, который должен иметь доступ к файлам на удаленном веб-сервере с PHP. У меня также есть удаленный сервер. Файлы на удаленном сервере являются.

Я планирую выполнить сценарий shell на удаленном сервере, используя Ansible playbook. пустой файл test.sh: touch test.sh План: --- - name: Transfer and execute a script. hosts: server user.

Мне интересно, как лучше всего редактировать файлы на удаленном сервере linux. Я использовал Emacs вместо ssh, что сработало очень хорошо. Однако мне также нравится идея копирования файлов на мой.

Во-первых, огромное спасибо за помощь. Я новичок в Ansible и в настоящее время работаю над требованием, согласно которому JAVA API, развернутый на Windows / Linux, должен взаимодействовать /.

Я пытаюсь открыть веб-страницу на удаленном сервере с помощью ansible. Я написал код python и пытаюсь использовать его для открытия веб-сайта на удаленных серверах. Однако я не могу этого сделать.

Я использую ansible для установки и настройки приложения на сервере linux. Я не могу скопировать пустую папку на удаленный сервер. Например. У меня есть папка тест что содержится: 123.conf бревно.

Я должен выполнить команду top на удаленном сервере с Ansible Playbook. Но когда я запускаю playbook, передача не увенчалась успехом План: --- - name: CPU load hosts: all become: yes gather_facts.

Ansible

Программирование и разработка

Если вы пытаетесь сравнить Ansible и Puppet, вы попали в нужное место.

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

К счастью, здесь, в Career Karma, мы уже провели для вас исследование. В этом информативном руководстве вы узнаете всё, что вам нужно знать, чтобы принять решение. От изучения того, что такое Ansible и Puppet, до их плюсов и минусов, а также их сходства и различий, у нас есть вся информация, необходимая для выбора между ними.

Что такое Ansible?

Ansible

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

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

Наряду с оригинальным программным обеспечением Ansible существует также Ansible Tower, веб-расширение, созданное для того, чтобы сделать Ansible ещё проще для ИТ-специалистов, и Ansible Galaxy, расширение веб-сайта Ansible, предназначенное для использования сообществом.

Что такое Puppet?

Puppet

Puppet — ещё один инструмент управления конфигурацией с открытым исходным кодом. Используя Puppet DSL, ИТ-специалисты и системные администраторы могут выполнять стандартную ИТ-автоматизацию. Puppet — это простой программный инструмент, который может обрабатывать более сложные задачи и инфраструктуры. Хотя это программное обеспечение чаще всего используется для Linux и Windows, его можно использовать практически с любой операционной системой.

Существует расширение Puppet под названием Puppet Agent — приложение, созданное для управления конфигурациями на используемых узлах. Это приложение должно использоваться с первичным сервером Puppet и в основном используется для получения каталогов конфигурации для пользователей Puppet.

Ansible или Puppet: самые важные различия и сходства

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

Разница: Стоимость

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

Первый и самый базовый вариант самоподдержки будет стоить 5000 долларов в год для 100 узлов. Второй уровень, известный как стандартная поддержка или поддержка 8 × 5, стоит 10 000 долларов в год для 100 узлов. Третий уровень считается премиальным и предлагает круглосуточную поддержку и до 100 узлов за 14 000 долларов в год или 17 500 долларов в год для тех, кто интересуется Ansible Engine.

С другой стороны, Puppet Enterprise предлагает пользователям возможность протестировать до 10 узлов бесплатно. После этого вы можете заплатить за стандартный план, который стоит около 100 долларов за узел в год, или за премиальный план, который стоит около 199 долларов за узел в год. Если вы используете только пару узлов, Puppet более экономичен, чем Ansible, но когда вам нужно около 100 узлов, Ansible — лучший вариант с точки зрения затрат.

Разница: управление и планирование

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

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

Разница: модули

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

В Puppet вы можете получить доступ к библиотеке Puppet Forge, содержащей более 6000 модулей. В отличие от Ansible, Puppet Forge использует систему, в которой вы можете легко увидеть, какие модули доказали свою работоспособность, а какие нет. Это помогает пользователям определить, какие модули были одобрены Puppet, что упрощает решение, какие из них использовать.

Сходство: Доступность

И в Ansible, и в Puppet есть резервные копии на случай выхода из строя основного узла или мастера. У Ansible есть резервный узел, который будет действовать в случае основного отказа, в то время как Puppet использует систему из нескольких мастеров для одного и того же сценария.

Сходство: масштабирование

Хотя в Ansible масштабирование считается немного проще, и Ansible, и Puppet легко масштабируются. Оба программных инструмента могут легко обрабатывать большие инфраструктуры и большие узлы.

Сходство: простота использования

Хотя есть несколько незначительных отличий в общей настройке и простоте использования, и Ansible, и Puppet относительно просты в настройке и использовании. Ansible считается более простым в использовании, но с точки зрения использования предполагаемыми пользователями Puppet также работает легко и плавно.

Ansible или Puppet: за и против

Ansible или Puppet за и против

Выбор между Ansible и Puppet может быть трудным, не зная плюсов и минусов.

У Ansible и Puppet есть свои плюсы и минусы. В зависимости от того, кто вы и для чего собираетесь использовать один из программных инструментов, плюсы могут перевешивать минусы или наоборот. В любом случае, прежде чем принять решение, вам понадобятся все факты.

Плюсы Ansible

  • Более лёгкая установка и настройка. По сравнению с Puppet, Ansible намного проще изначально установить и настроить. Поскольку этот программный инструмент в целом проще в использовании, непрограммистам легче приступить к работе.
  • Более низкая стоимость. Хотя существуют более дорогие версии Ansible, базовая стандартная версия намного дешевле Puppet. Чтобы Puppet использовал 100 узлов, это будет стоить 10000 долларов в год в базовой версии, что вдвое больше, чем у Ansible.
  • Более простая масштабируемость. Хотя оба инструмента легко масштабируются, по общему мнению, Ansible немного легче масштабировать. Ansible может справляться с более крупными инфраструктурами и колебаниями узлов с большей лёгкостью, чем Puppet.

Недостатки Ansible

  • Не справляется со сложными задачами. Хотя Ansible бесконечно хвалят за его простоту, в результате он не может справляться с более сложными задачами и функциями. Этот простой инструмент отлично подходит для простоты использования, но не так хорош для задач более высокого уровня.
  • Меньшее сообщество поддержки. Поскольку Ansible — это более новый и молодой программный инструмент, имеет смысл только иметь меньшее количество последователей. Это затрудняет поиск поддержки сообщества для решения проблем, поскольку существует меньшее сообщество, которое может оказать помощь.
  • Плохой графический интерфейс. Графический пользовательский интерфейс (GUI) Ansible недостаточно развит, что в конце концов приводит к его более низкому качеству, чем у других инструментов управления конфигурацией. Графический интерфейс для Ansible часто полностью не синхронизируется с командной строкой, что затрудняет использование.

Плюсы Puppet

Минусы Puppet

  • Сложно использовать. Puppet, как известно, сложен в использовании даже для опытных программистов. У вас должен быть опыт программирования и способность легко выучить Puppet DSL.
  • Более высокая стоимость. У Puppet всего две версии, и обе стоят дороже, чем стандартная версия Ansible. В первую очередь это касается тех, кто ограничен в средствах.
  • Трудно настроить. Хотя Puppet может обрабатывать более сложные функции и задачи, это затрудняет первоначальную настройку. Puppet был разработан для системных администраторов, поэтому при проектировании установки не учитывались обычные пользователи.

Что лучше: Ansible или Puppet?

Что лучше Ansible или Puppet

Не торопитесь в дебатах между Ansible и Puppet, чтобы убедиться, что вы сделали правильный выбор.

Для тех, кто какое-то время спорил между Ansible и Puppet, список различий и сходств в сочетании с нашим списком плюсов и минусов для обоих программных инструментов определённо должен помочь вам принять решение. Однако у нас есть несколько заключительных замечаний о преимуществах выбора каждого программного инструмента, которые помогут принять окончательное решение.

Преимущества выбора Ansible

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

Преимущества выбора Puppet

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

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

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

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

Чтобы упростить процессы настройки и конфигурирования серверов, можно также писать shell-скрипты. Но и этот способ вряд ли можно назвать совершенным. Скрипты нужно постоянно изменять, подстраивая их под каждую новую задачу. При их написании необходимо учитывать различие операционных систем и версий. Не будем забывать и о том, что отладка скриптов отнимает много усилий и забирает немало времени.

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

Со всеми сложностями, о которых идет речь выше, мы хорошо знакомы на собственном опыте: у нас имеется 10 точек присутствия с NS-серверами, расположенные в разных точках планеты. На них необходимо регулярно вносить различные изменения: обновлять операционную систему, устанавливать и обновлять различное ПО, изменять конфигурцию и т.п. Мы решили все эти операции автоматизировать и внедрить систему удаленного управления конфигурациями. Изучив имеющиеся решения, мы остановили свой выбор на Ansible.

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

Что такое Ansible?

Ansible берет на себя всю работу по приведению удаленных серверов в необходимое состояние. Администратору необходимо лишь описать, как достичь этого состояния с помощью так называемых сценариев (playbooks; это аналог рецептов в Chef). Такая технология позволяет очень быстро осуществлять переконфигурирование системы: достаточно всего лишь добавить несколько новых строк в сценарий.

Почему Ansible?

Преимущества Ansible по сравнению с другими аналогичными решениями (здесь в первую очередь следует назвать такие продукты, как Puppet, Chef и Salt) заключаются в следующем:

Push или pull?

“Из коробки” все сценарии и команды выполняются методом push: когда возникает необходимость, мы запускаем сценарий, и он последовательно выполняется на удалённых серверах. Однако разработчики также предусмотрели метод pull и даже написали специальное приложение для установки необходимой для этого части ansible на удалённые хосты.

Установка

Требования для установки Ansible минимальны. На машине с которой производится управление должен быть установлен Python 2.6 или выше. На управляемых узлах должен быть установлен только Python версии не ниже 2.4, но он, как правило, по умолчанию включен в состав большинства дистрибутивов linux-систем. MS Windows не поддерживается.

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

В Ubuntu установка самого Ansible и зависимостей осуществляется добавлением репозитория и установкой пакета:

О процедуре установки в других ОС можно прочитать в официальной документации .

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

Список групп серверов, которыми нужно управлять, Ansible может получать двумя основными способами:

  • из специального текстового файла (далее этот вариант будет рассмотрен более подробно);
  • с помощью внешнего скрипта, возвращающего нужный нам список серверов, например из MongoDB . В официальном github-репозитории есть готовые скрипты для получения списка из Cobbler , Digital Ocean , EC2 , Linode , OpenStack Nova , Openshift , Spacewalk , Vagrant , Zabbix .

Файл hosts

Более подробно о файле hosts и правилах его написания можно почитать в официальной документации .

Информация об узлах (Facts)

Перед внесением изменений Ansible подключается к управляемым узлам и собирает информацию о них: о сетевых интерфейсах и их состоянии, об установленной операционной системе и т.п. Он может делать это как с помощью собственного модуля, так и с помощью инструментов ohai и facter, если они установлены (такая возможность специально предусмотрена для пользователей, уже имеющих опыт работы с системами удаленного управления конфигурациями: ohai и facter являются библиотеками фактов для Chef и Puppet).

Переменные

Во время деплоя, как правило, требуется не только установить какое-либо приложение, но и настроить его в соответствии с определенными параметрами на основании принадлежности к группе серверов или индивидуально (например, ip-адрес BGP-соседа и номер его AS или параметры для базы данных). Как уже было сказано, загромождать файл hosts будет не очень красиво, поэтому разработчики Ansible пошли следующим путём:

  • файлы с переменными групп хранятся в директории “group_vars/имя_группы”;
  • файлы с переменными хостов в директории “hosts_vars/имя_хоста”;
  • файлы с переменными роли (о них речь пойдет ниже) в директории “имя_роли/vars/имя_задачи.yml”;

Помимо пользовательских переменных можно (и даже нужно) использовать факты, собранные ansible перед выполнением сценариев и отдельных задач.

Модули Ansible

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

  • облачные ресурсы и виртуализация (Openstack, libvirt);
  • базы данных (MySQL, Postgresql, Redis, Riak);
  • файлы (шаблонизация, регулярные выражения, права доступа);
  • мониторинг (Nagios, monit);
  • оповещения о ходе выполнения сценария (Jabber, Irc, почта, MQTT, Hipchat);
  • сеть и сетевая инфраструктура (Openstack, Arista);
  • управление пакетами (apt, yum, rhn-channel, npm, pacman, pip, gem);
  • система (LVM, Selinux, ZFS, cron, файловые системы, сервисы, модули ядра);
  • работа с различными утилитами (git, hg).

О том, с чем умеет работать Ansible “из коробки”, можно прочитать в официальной документации . Список действительно впечатляет.

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

Следующий пример соберёт информацию о хостах и выведёт её на консоль в формате JSON:

$ ansible dnsservers -m setup

А вот так можно создать логический том (или, в зависимости от текущего состояния, изменить его размер) с именем examplevolume в группе examplegroup:

Ansible позволяет не только выполнять единичные задачи, но и писать сценарии, которые необходимо выполнить на управляемых узлах. Рассмотрим структуру и правила написания таких сценариев более подробно.

Cценарии (playbooks)

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

Основными параметрами/группами простого сценария являются:

Также в сценарии перед непосредственным описанием задач могут быть указаны следующие параметры или группы параметров:

Рассмотрим все эти разделы более подробно.

В разделе hosts указывается группа управляемых узлов, к которой будут применены описываемые в сценарии изменения.

Так, строка формата:

означает, что изменения будут применены к узлам из группы webservers.

Сценарии могут выполняться не только от имени пользователя, под именем которого установлено соедиение, но и любого другого. В следующем примере авторизация на хосте будет произведена с именем yourname, но задачи будут выполняться от имени пользователя root (если, конечно, этому пользователю это разрешено):

Если добавить параметр “user: postgres”, то все действия будут выполняться с привилегиями пользователя postgres.

В разделе vars указываются переменные, которые будут использованы в сценарии, и их значения:

Список изменений, которые необходимо произвести на управляемом узле, приводится в разделе tasks. Каждой задаче (task) присваивается имя (name). Далее указываются модули Ansible, которые будут задействованы при ее выполнении:

Для каждой задачи можно указывать пользователя, от имени которого она будет выполнена:

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

В Ansbile используется шаблонизатор Jinja2 . Приведём пример шаблона (часть конфига powerdns ):

В приведённом примере мы подставляем в шаблон следующие значения:

Обработку шаблонов и, в данном случае, генерацию конфигурационного файла выполняет модуль template ; он же может задать необходимые права доступа и изменить владельца/группу:

Обратим внимание на то, что файл шаблона и файл с паролем пользователя базы данных находятся на машине управления, а результатом будет файл на удалённом узле.

Обработчики событий (Handlers)

Ansible не просто выполняет задачи в указанном порядке, но и проверяет их состояние на наличие изменений. Если при выполнении сценария требовалось, например, добавить строку в конфигурационный файл, и в результате выполнения он изменился (необходимой строки действительно не было), то Ansible может выполнить специальную задачу, описанную как обработчик события (handler). Если при выполнении строка уже была в конфигурационном файле, то обработчик выполнен не будет. Обработчики событий описываются в конце сценария; в описании задачи они указываются через параметр notify. Приведём пример:

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

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

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

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

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

Структура проекта

Пример сценария

Чтобы понять, как это все работает, рассмотрим практический пример: простой сценарий развёртывания новой версии PostgreSQL 9.3 на debian-based ОС. Роли в этом примере не используются.

Ansible AWX

Заключение

Читайте также: