Поиск по сайту:

Как использовать Ansible Playbooks для автоматизации сложных задач на нескольких удаленных серверах. Часть 2


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

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

На протяжении всей этой статьи, как и в следующей, мы будем использовать следующую тестовую среду. Все хосты представляют собой системы CentOS 7:


Controller machine (where Ansible is installed): 192.168.0.19
Node1: 192.168.0.29
Node2: 192.168.0.30

Кроме того, обратите внимание, что оба узла были добавлены в раздел веб-серверов локального файла /etc/ansible/hosts:

Тем не менее, давайте начнем с рассматриваемой темы.

Представляем Ansible Playbooks

Как описано в предыдущем руководстве, вы можете использовать утилиту ansible для запуска команд на удаленных узлах следующим образом:


ansible -a "/bin/hostnamectl --static" webservers

В приведенном выше примере мы запустили hostnamectl --static на node1 и node2. Не требуется много времени, чтобы понять, что этот метод запуска задач на удаленных компьютерах отлично работает для коротких команд, но может быстро стать обременительным или запутанным для более сложных задач, которые требуют дополнительных хорошо структурированных параметров конфигурации или взаимодействия с другими службами.

Например, установка и настройка WordPress на нескольких хостах – о чем мы поговорим в следующей статье этой серии). Именно здесь на сцену выходят Пособия.

Проще говоря, Playbooks – это обычные текстовые файлы, написанные в формате YAML и содержащие список элементов с одной или несколькими парами ключ/значение (также известный как «хеш » или «словарь»).

Внутри каждого Playbook вы найдете одну или несколько групп хостов (каждая из этих групп также называется play), на которых должны выполняться желаемые задачи.

Пример из официальной документации поможет нам проиллюстрировать:

1. хосты: это список компьютеров (согласно /etc/ansible/hosts), на которых будут выполняться следующие задачи.

2. remote_user: удаленная учетная запись, которая будет использоваться для выполнения задач.

3. vars: переменные, используемые для изменения поведения удаленных систем.

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

Если вам нужно выполнить другой набор связанных задач для определенного хоста, создайте еще одну игру в текущей Playbook (другими словами, цель игры — правильно сопоставить конкретный набор хостов с -определенные задачи).

В этом случае начните новую игру, добавив директиву Hosts внизу и начав заново:


---
- hosts: webservers
  remote_user: root
  vars:
    variable1: value1
    variable2: value2
  remote_user: root
  tasks:
  - name: description for task1
    task1: parameter1=value_for_parameter1 parameter2=value_for_parameter2
  - name: description for task1
    task2: parameter1=value_for_parameter1 parameter2=value_for_parameter2
  handlers:
    - name: description for handler 1
      service: name=name_of_service state=service_status
- hosts: dbservers
  remote_user: root
  vars:
    variable1: value1
    variable2: value2
…

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


mkdir /etc/ansible/playbooks

И файл с именем apache.yml внутри него со следующим содержимым:


---
- hosts: webservers
  vars:
    http_port: 80
    max_clients: 200
  remote_user: root
  tasks:
  - name: ensure apache is at the latest version
    yum: pkg=httpd state=latest
  - name: replace default index.html file
    copy: src=/static_files/index.html dest=/var/www/html/ mode=0644
    notify:
    - restart apache
  - name: ensure apache is running (and enable it at boot)
    service: name=httpd state=started enabled=yes
  handlers:
    - name: restart apache
      service: name=httpd state=restarted

Во-вторых, создайте каталог /static_files:


mkdir /static_files

где вы будете хранить пользовательский файл index.html:


<!DOCTYPE html>
 <html lang="en">
 <head>
 <meta charset="utf-8"/>
 </script>
 </head>
 <body>
 <h1>Apache was started in this host via Ansible</h1><br>
<h2>Brought to you by linux-console.net</h2>
 </body>
 </html>

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


ansible-playbook /etc/ansible/playbooks/apache.yml

Теперь давайте посмотрим, что произойдет, когда мы откроем браузер и укажем на 192.168.0.29 и 192.168.0.30:

Давайте пойдем еще дальше и вручную остановим и отключим Apache на node1 и node2:


systemctl stop httpd
systemctl disable httpd
systemctl is-active httpd
systemctl is-enabled httpd

Затем снова бегите,


ansible-playbook /etc/ansible/playbooks/apache.yml

На этот раз задача сообщает, что веб-сервер Apache запущен и включен на каждом хосте:

Пожалуйста, рассмотрите приведенный выше пример как представление о возможностях Ansible. Хотя это относительно простые задачи при выполнении на небольшом количестве серверов, они могут стать очень утомительными и трудоемкими, если вам нужно сделать то же самое на нескольких (возможно, сотнях) машинах.

Краткое содержание

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

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