Как создавать 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, с тем, как получить стандартный вывод при выполнении плейбука для анализа, как использовать условные выражения в плейбуке и как управлять ошибками, которые могут возникнуть при запуске. задания. Наконец, мы повторили конфигурацию плейбуков и то, как вы можете использовать дополнительные параметры, чтобы решить, какие задачи запускать, если вы не собираетесь запускать всю плейбук.