Глава 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 будет выполнять все команды через sudo
  • tasks: : сообщает Ansible, что ниже приводится список инструкций, выполняемых в этом playbook
  • Первая задача начинается с name: Install Apache. name является заголовком инструкции, необходимым для лучшего понимания человеком, того что будет происходить в инструкции.
    • Мы используем модуль yum для установки Apache. Вместо команды yum -y install httpd httpd-devel . Ansible будет принимать список внутри with_items, поочередно в переменную `. Для того чтобы установить пакет мы сообщаем **yum**state=present.Чтобы установить последнюю версию пакета нужно использоватьstate=latest. Для удаления пакета или файлов и каталогов используетсяstate=absent`
  • Вторая задача:

    • Модуль copy используется для копирования файлов из источника (на локальной машине) в место назначения (сервер). Также можно передавать дополнительные переменные, как метаданные файла, включая владельца и доступы.
    • Мы используем массив с несколькими элементами; для определения каждого элемента используется синтаксис {var1: value, var2: value} . Для доступа к конкретным переменным в инструкции следует использовать следующий синтаксис `` - в этом случае мы обратились к первой переменной в списке. В нашем примере элемент item.src обращается к src в каждом элементе.
  • Третья задача:
    • Мы используем модуль service для описания действия для службы httpd - Apache’s http daemon. Мы хотим, чтобы служба была запущена, так что мы установили state=started, и мы хотим, чтобы она стартовала при запуске системы, так что мы указываем enabled=yes (аналог chkconfig httpd on).

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

results matching ""

    No results matching ""