Глава 4: Ansible playbooks
Как и многие другие решения по управлению конфигурацией, Ansible использует метафору для описания своих файлов конфигурации. Они называются ‘playbooks’, и они описываются набором задач ("plays" в жаргоне Ansible), которые будут выполняться на определенном сервере или наборе серверов.
Playbooks написаны в YAML, простой понятный для человека синтаксис, популярный для определения конфигураций. Playbooks могут подключаться в другие playbooks, а некоторые метаданные и параметры посвящены разным сценариям на разных серверах.
Рассмотрим следующий сценарий, устанавливающий Apache на a RHEL/CentOS server:
Shell Script:
# Install Apache.
yum install --quiet -y httpd httpd-devel
# Copy configuration files.
cp /path/to/config/httpd.conf /etc/httpd/conf/httpd.conf
cp /path/to/config/httpd-vhosts.conf /etc/httpd/conf/httpd-vhosts.conf
# Start Apache and configure it to run at boot.
service httpd start
chkconfig httpd on
Чтобы запустить shell script (в данном случае файл с именем shell-script.sh), можно вызвать его непосредственно из командной строки:
./shell-script.sh
Ansible Playbook:
---
- hosts: all
tasks:
- name: Install Apache.
command: yum install --quiet -y httpd httpd-devel
- name: Copy configuration files.
command: >
cp /path/to/config/httpd.conf /etc/httpd/conf/httpd.conf
- command: >
cp /path/to/config/httpd-vhosts.conf /etc/httpd/conf/httpd-vhosts.conf
- name: Start Apache and configure it to run at boot.
command: service httpd start
- command: chkconfig httpd on
Чтобы запустить Playbook (в данном случае, файл с названием playbook.yml), его нужно вызвать с помощью команды из каталога в котором находится playbook:
ansible-playbook playbook.yml
В вышеуказанном Playbook мы используем модуль command для запуска стандартных команд терминала. Мы также именуем каждую инструкцию ‘name’, так что, когда playbook будет выполняться, инструкции будут иметь человекопонятный вид.
Вышеуказанная схема будет работать точно так же, как и shell сценарий, но вы можете значительно улучшить ее, используя некоторые встроенные модули Ansible для обработки тяжелых задач:
---
- hosts: all
sudo: yes
tasks:
- name: Install Apache.
yum: name={{ item }} state=present
with_items:
- httpd
- httpd-devel
- name: Copy configuration files.
copy:
src: "{{ item.src }}"
dest: "{{ item.dest }}"
owner: root
group: root
mode: 0644
with_items:
- {
src: "/path/to/config/httpd.conf",
dest: "/etc/httpd/conf/httpd.conf"
}
- {
src: "/path/to/config/httpd-vhosts.conf",
dest: "/etc/httpd/conf/httpd-vhosts.conf"
}
- name: Make sure Apache is started and configure it to run at boot.
service: name=httpd state=started enabled=yes
Давайте резберем этот playbook:
- Первой строкой
---
мы декларируем, что дальше будет выполняться код YAML. - hosts: all
: сообщает Ansible, что нужно запустить этот playbook на всех хостахsudo: yes
: Ansible будет выполнять все команды через sudotasks:
: сообщает Ansible, что ниже приводится список инструкций, выполняемых в этом playbook- Первая задача начинается с
name: Install Apache.
name
является заголовком инструкции, необходимым для лучшего понимания человеком, того что будет происходить в инструкции. - Мы используем модуль yum для установки Apache. Вместо команды
yum -y install httpd httpd-devel
. Ansible будет принимать список внутри with_items, поочередно в переменную`. Для того чтобы установить пакет мы сообщаем **yum**
state=present.Чтобы установить последнюю версию пакета нужно использовать
state=latest. Для удаления пакета или файлов и каталогов используется
state=absent`
- Мы используем модуль yum для установки Apache. Вместо команды
Вторая задача:
- Модуль copy используется для копирования файлов из источника (на локальной машине) в место назначения (сервер). Также можно передавать дополнительные переменные, как метаданные файла, включая владельца и доступы.
- Мы используем массив с несколькими элементами; для определения каждого элемента используется синтаксис
{var1: value, var2: value}
. Для доступа к конкретным переменным в инструкции следует использовать следующий синтаксис `` - в этом случае мы обратились к первой переменной в списке. В нашем примере элемент item.src обращается к src в каждом элементе.
- Третья задача:
- Мы используем модуль service для описания действия для службы httpd - Apache’s http daemon. Мы хотим, чтобы служба была запущена, так что мы установили
state=started
, и мы хотим, чтобы она стартовала при запуске системы, так что мы указываемenabled=yes
(аналогchkconfig httpd on
).
- Мы используем модуль service для описания действия для службы httpd - Apache’s http daemon. Мы хотим, чтобы служба была запущена, так что мы установили
Одна из наиболее важных особенностей Ansible заключается в том, что при первом запуске playbook все программы и службы будут установлены на сервер. Если же запустить playbook еще раз, то ничего критичного не произойдет, т.к. установленные программы и запущенные службы не изменят своего состояния.