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

Как создавать Ansible Plays и Playbooks — Часть 5


В этой Части 5 серии Ansible мы объясним, как создавать Ansible Plays и Playbooks с помощью модулей Ansible.

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

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

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

Управление пакетами в Linux

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

Их относительно легко угадать. Существует модуль apt для управления пакетами APT для Debian, старый модуль yum для управления пакетами YUM и модуль dnf, связанный с новыми дистрибутивами RHEL. .

Ниже приведены несколько примеров использования модулей в сборнике:

Пример 1. Установка веб-сервера Apache на RHEL 8.

---
- name: install Apache webserver
  hosts: webservers

  tasks:
       - name: install httpd
         dnf:  
          name: httpd  
          State: latest

Пример 2. Установка веб-сервера Apache в Debian 10.

---
- name: install Apache webserver
  hosts: databases

  tasks:
       - name: install Apache webserver
         apt:  
          name: apache2  
          State: latest

Сервисный модуль

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

Пример 1: Запуск веб-сервера Apache

---
- name: Start service httpd, if not started
  service:
    name: httpd
    state: started

Пример 2. Остановка веб-сервера Apache

---
- name: Stop service httpd
  service:
    name: httpd
    state: stopped

Пример 3. Перезапуск сетевого интерфейса enp2s0.

---
- name: Restart network service for interface eth0
  service:
    name: network
    state: restarted
    args: enp2s0

Копировать модуль

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

Пример 1. Копирование файлов из локального в удаленный Linux

---
- name: Copy file with owner and permissions
  copy:
    src: /etc/files/tecmint.conf
    dest: /srv/tecmint.conf
    owner: tecmint
    group: tecmint
    mode: '0644'

Книга воспроизведения копирует файл конфигурации tecmint.conf из каталога /etc/files/ в каталог /srv/ как tecmint. > пользователь с разрешениями 0644.

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

Пример 2. Копирование файлов из локального в удаленный Linux

---
- name: Copy file with owner and permissions
  copy:
    src: /etc/files/tecmint.conf
    dest: /srv/tecmint.conf
    owner: tecmint
    group: tecmint
    mode: u=rw, g=r, o=r

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

Файловый модуль

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

Пример 1. Выполнение прав доступа к файлам Linux

---
- name: Change file ownership, group, and permissions
  file:
    path: /etc/tecmint.conf
    owner: tecmint
    group: tecmint
    mode: '0644'

Вышеупомянутая игра создает файл с именем tecmint.conf в каталоге /etc, устанавливая разрешения на 0644.

Пример 2. Удаление файла Linux

---
- name: Remove file (delete file)
  file:
    path: /etc/tecmint.conf
    state: absent

Это удалит файл tecmint.conf.

Пример 3: Создайте каталог

---
- name: create a directory if it doesn’t exist
  file:
    path: /etc/mydirectory
    State: directory
    mode: '0777'

При этом в каталоге /etc будет создан каталог с разрешениями 0777.

Пример 4. Рекурсивное удаление каталога

---
- name: Recursively deleting a  directory
  file:
    path: /etc/tecmint.conf
    state: absent

Вышеупомянутая игра рекурсивно удаляет каталог.

Модуль линейного файла

Модуль lineinfile полезен, когда вы хотите изменить одну строку в файле. Он может заменить существующую линию.

Пример 1: Управление файлами в Linux

---
 - name: Ensure SELinux is set to enforcing mode
  lineinfile:
    path: /etc/selinux/config
    regexp: '^SELINUX='
    line: SELINUX=disabled

В приведенном выше примере для значения SELINUX установлено значение отключено.

SELINUX=disabled

Пример 2: Изменение файлов в Linux

---
- name: Add a line to a file if the file does not exist, without         passing regexp
  lineinfile:
    path: /etc/hosts
    line: 10.200.50.51 linux-console.net
    create: yes

При этом запись 10.200.50.51 linux-console.net будет добавлена в файл /etc/hosts.

Архивный модуль

Модуль Архив используется для создания сжатого архива одного или нескольких файлов. Предполагается, что источник сжатия существует и присутствует в целевом месте назначения. После архивирования исходный файл позже можно удалить или удалить с помощью оператора remove=True.

Пример 1. Создание архивного файла

- name: Compress directory /path/to/tecmint_dir/ into /path/to/tecmint.tgz
  archive:
    path: /path/to/tecmint_dir
    dest: /path/to/tecmint.tgz

This compresses the /path/to/tecmint_dir  directory to /path/to/tecmint.tgz

Пример 2. Создайте архивный файл и удалите его.

- name: Compress regular file /path/to/tecmint into /path/to/foo.gz and remove it
  archive:
    path: /path/to/tecmint
    dest: /path/to/tecmint.tgz
    remove: yes

В приведенном выше примере исходный файл /path/to/tecmint удаляется после завершения архивирования.

Пример 3. Создание архивного файла

- name: Create a bz2 archive of /path/to/tecmint
  archive:
    path: /path/to/tecmint
    format: bz2

При этом из файла /path/to/tecmint создается сжатый файл в формате bz2.

Модуль Git

Модуль управляет git-проверками репозиториев программного обеспечения.

Пример 1. Проверка репозиториев Git

- git:
    repo: 'https://foosball.example.org/path/to/repo.git'
    dest: /srv/checkout
    version: release-0.22

Командный модуль

Один из наиболее часто используемых модулей, модуль command принимает имя команды, за которым следует список аргументов. Команда передается так же, как и в оболочке Linux.

Пример 1. Запуск команды

- name: Executing a command using the command module
  command: cat helloworld.txt

Пример 2. Проверка работоспособности удаленного Linux

---
 - name: Check the remote host uptime
    hosts: servers
    tasks:
      - name: Execute the Uptime command over Command module
        register: uptimeoutput
        command: "uptime"

- debug:
          var: uptimeoutput.stdout_lines

Командный модуль получает время безотказной работы удаленных серверов.

Переменные для получения результатов выполнения команд

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

Регистр ansible используется для захвата выходных данных задачи и сохранения их в переменной. После этого переменная будет содержать стандартный вывод задачи.

Например, предположим, что вы хотите проверить использование диска управляемыми узлами в соответствующих корневых каталогах с помощью команды df -Th /. Вы собираетесь использовать модуль 'command' для определения команды и 'register' для сохранения вывода std в переменной.

Чтобы отобразить команду, вы будете использовать модуль 'debug' вместе с возвращаемым значением стандартного вывода.

---

 - hosts: all
   become: yes

   tasks:
     - name: Execute /boot usage on Hosts
       command: 'df -Th /'
       register: df

     - debug: var=df.stdout

Теперь давайте запустим playbook. В данном случае мы назвали нашу книгу игр check_disk_space.yml.

ansible-playbook check_disk_space.yml

Как вы видели, все выходные данные перемешаны и затрудняют отслеживание.

Чтобы выровнять выходные данные и облегчить их чтение, замените возвращаемое значение stdout на stdout_lines.

---

 - hosts: all
   become: yes

   tasks:
     - name: Execute /boot usage on Hosts
       command: 'df -Th /'
       register: df

     - debug: var=df.stdout_lines

Используйте условные выражения для управления выполнением игры

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

Когда заявление

Иногда вам может потребоваться выполнить задачи на определенных узлах, а не на других. Условный оператор 'when' довольно легко использовать и реализовать в сборнике сценариев. При использовании предложения 'when' просто объявите условие, примыкающее к этому предложению, как показано:

when: condition

Когда условие выполнено, задача выполняется на удаленной системе.

Давайте рассмотрим несколько примеров:

Пример 1: Использование оператора When

---
- hosts: all

  tasks:
  - name: Install Nginx on Debian
     apt: name=nginx state=present
     when: ansible_os_family == “Debian”

В приведенном выше примере веб-сервер Nginx устанавливается на хосты, на которых работает семейство дистрибутивов Debian.

Вы также можете использовать операторы OR и AND вместе с условным оператором if.

Пример 2. Использование оператора AND с When

---
- hosts: all

  tasks:
  - name: Install Nginx on Debian
     apt: name=nginx state=present
     when: ansible_os_family == “Debian” and
           ansible_distribution_version == “18.04”

При использовании оператора AND для выполнения задачи должны быть выполнены оба оператора.

В приведенном выше примере Nginx устанавливается на узлы, на которых работает семейство ОС Debian версии 18.04. Очевидно, это будет Ubuntu 18.04.

Пример 3. Использование оператора OR с When

С оператором OR задача выполняется, если выполнено любое из условий.

---
- hosts: all

  tasks:
  - name: Install Nginx on Debian
     apt: name=nginx state=present
     when: ansible_os_family == “Debian” or
	      Ansible_os_family == “SUSE”

В приведенном выше примере веб-серверы Nginx устанавливаются либо на ОС семейства Debian, либо на SUSE, либо на обе из них.

ПРИМЕЧАНИЕ. Всегда используйте знак двойного равенства == при проверке условия.

Условные выражения в циклах

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

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

---
 - name: Install Software packages
    hosts: all
    vars:
	packages:
    • name: nginx
required: True
    • name: mysql
required: True
    • name: apache
required: False



   tasks:
    • name: Install “{{ item.name }}”on Debian
apt: 
 name: “{{ item.name }}”
 state: present 
When: item.required == True
loop: “{{ packages }}”  

Настройка обработки ошибок

Иногда задачи не выполняются при запуске плейбуков. Предположим, вы выполняете 5 задач на 3 серверах, как показано в инструкции ниже. Если возникает ошибка в задаче 3 (Запуск MySQL) на сервере 2, Ansible прекратит выполнение оставшихся задач на сервере 2 и попытается выполнить оставшиеся задачи на остальных серверах.

---
 - name: Install Software packages
   hosts: server1, server2, server3
   tasks:
- name: Install dependencies
<< some code >>

- name: Install MySQL database
<< some code >>

- name: Start MySQL
<< some code >>

- name: Install Nginx
<< some code >>

- name: Start Nginx
<< some code >>

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

---
 - name: Install Software packages
   hosts: server1, server2, server3
   any_errors_fatal:  true
   tasks:

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

Если вы хотите, чтобы плейбук игнорировал ошибки и продолжал выполнять оставшийся набор задач, используйте параметр ignore_errors: True.

---
 - name: Install Software packages
   hosts: server1, server2, server3
   tasks:
- name: Install dependencies
<< some code >>
     ignore_errors: True

Создавайте сборники сценариев для настройки систем до заданного состояния

В этом разделе мы рассмотрим некоторые дополнительные параметры, доступные при запуске playbook.

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

Например, чтобы выполнить пробный запуск плейбука под названием httpd.yml, который устанавливает и запускает веб-сервер Apache:

ansible-playbook httpd.yml --check

Другой вариант, на который нам нужно обратить внимание, — это параметр --start-at-task. Это используется при указании имени задачи, с которой должна начинаться книга воспроизведения.

Давайте рассмотрим пример: в приведенном ниже сборнике действий описаны 2 задачи: первая устанавливает веб-сервер Apache, а вторая устанавливает утилиту htop.

---
 - name: Install httpd

   hosts: all
   tasks:
    yum:	 
name: httpd
     state: Installed

- name: Install htop

      yum:  
      name: htop
      state: started

Если вы хотите пропустить установку веб-сервера Apache и вместо этого установить утилиту htop, запустите:

ansible-playbook playbook.yml --start-at-task “Install htop”

Наконец, вы можете пометить свои задачи или пьесы, добавив в свою книгу пьес параметр теги, как показано ниже. Это удобно, если у вас довольно большой сборник пьес и вы хотите запускать определенные задачи из всего сборника пьес.

---
 - name: Install httpd
   tags: Install and start
   hosts: all
   tasks:
    yum:	 
name: httpd
     state: Installed

   tags: Install

    • service: 
name: httpd
state: started
ansible-playbook playbook.yml -tags "Install"

Чтобы опустить теги, используйте параметры --skip-tags, как показано.

ansible-playbook playbook.yml --skip-tags "Install"
Заключение

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