Первый Ansible playbook
Давайте создадим Ansible playbook.yml файл. Создайте его в той же папке, что и ваш Vagrantfile, и поместите в него следующий код:
---
- hosts: all
sudo: yes
tasks:
- name: Ensure NTP (for time synchronization) is installed.
yum: name=ntp state=present
- name: Ensure NTP is running.
service: name=ntpd state=started enabled=yes
Давайте рассмотрим, какие действия выполнит этот playbook на нашей VM.
Убедитесь, что вы находитесь в том же каталоге, что и Vagrantfile и playbook.yml, и выполните в терминале:
vagrant provision
На выходе вы должны увидеть следующее:
Ansible только что исполнил playbook, проанализировал синтаксис YAML и запустил несколько команд с помощью SSH, чтобы настроить сервер в соответствии с заданными инструкциями. Давайте пройдемся по playbook, шаг за шагом:
---
: Первая строка является маркером, показывающим, что остальная часть документа будет отформатирована в YAML (прочитайте руководство по началу работы на YAML).- hosts: all
: В этой строке указываются хосты, к которым применяется этот playbook. Здесь все работает, поскольку Vagrant использует свой собственный инвентарный файл Ansible (вместо того, который был создан ранее в /etc/ansible/hosts), который определяет Vagrant VM.sudo: yes
: Поскольку нам необходим привилегированный доступ для установки NFS и изменения конфигурации системы, в этой строке говорится, что Ansible будет использовать sudo для всех задач в этом playbook.tasks:
: Задачи после этой строки будут выполняться на всех хостах (или, в нашем случае, на одной виртуальной машине).- name: Ensure NTP daemon (for time synchronization) is installed.
yum: name=ntp state=present
: Эта команда эквивалентна запуску программыyum install ntp
, но является гораздо более умной; Ansible проверит, установлен ли NTP, и, если нет, установит его. Вот как бы выглядел этот код в shell script:if ! rpm -qa | grep -qw ntp; then yum install ntp fi
- name: Ensure NTP is running.
service: name=ntpd state=started enabled=yes
: Эта конечная задача проверяет и гарантирует, что служба ntpd запущена, и устанавливает ее для запуска при загрузке системы. Сценарий shell script будет следующий:# Start ntpd if it's not already running. if ps aux | grep -v grep | grep "[n]tpd" > /dev/null then echo "ntpd is running." > /dev/null else /sbin/service ntpd restart > /dev/null echo "Started ntpd." fi # Make sure ntpd is enabled on system startup. chkconfig ntpd on
Вы видите, как усложняются сценарии shell! И этот сценарий все еще не настолько надежен, как то, что вы получите с Ansible. Чтобы сохранить идемпотентность и обрабатывать условия ошибок, необходимо выполнить гораздо больше работы с базовыми сценариями, чем с Ansible.
Мы могли бы быть еще более лаконичными и не использовать модуль name для того, чтобы придать каждой команде понятные имена, что привело бы к следующему виду playbook:
---
- hosts: all
sudo: yes
tasks:
- yum: name=ntp state=present
- service: name=ntpd state=started enabled=yes