Знакомство с Ansible. Часть 3: переменные

Nov 2, 2015 18:55 · 610 words · 3 minute read ansible

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

В этой части давайте разберемся с использованием переменных в Ansible.

В системе управления конфигурациями Ansible переменные хранят значения, которые могут использоваться в наборах инструкций (playbook). Информация об удаленных хостах из файла inventory также может быть использована в качестве переменных.

Лучше всего важность и полезность использования переменных может показать очень простой пример — установка web-сервера apache.

Примечание. Дело в том, что пакет Apache имеет разное название в различных дистрибутивах — httpd для RedHat и apache2 для Debian.

Создадим файл /etc/ansible/playbooks/install_apache.yml:

touch /etc/ansible/playbooks/install_apache.yml

Содержимое файла следующее:

---
- hosts: test
  tasks:
 
  - name: Debug
    debug: msg={{ ansible_os_family }}
 
  - set_fact: package_name=httpd
    when: ansible_os_family == "Redhat"
 
  - set_fact: package_name=apache2
    when: ansible_os_family == "Debian"
 
  - name: Install httpd package
    yum: name={{ package_name }} state=latest
    sudo: yes
    when: ansible_os_family == "Redhat"
   
  - name: Debug1
    debug: msg={{ package_name }}
 
  - name: Install apache2 package
    apt: name={{ package_name }} state=latest
    sudo: yes
    when: ansible_os_family == "Debian"

Таким будет результат выполнения данного набора инструкций:

ansible-playbook install_apache.yml 

PLAY [test] ******************************************************************* 

GATHERING FACTS *************************************************************** 
ok: [test-1]

TASK: [Debug] ***************************************************************** 
ok: [test-1] => {
    "msg": "Debian"
}

TASK: [set_fact package_name=httpd] ******************************************* 
skipping: [test-1]

TASK: [set_fact package_name=apache2] ***************************************** 
ok: [test-1]

TASK: [Install httpd package] ************************************************* 
skipping: [test-1]

TASK: [Debug1] **************************************************************** 
ok: [test-1] => {
    "msg": "apache2"
}

TASK: [Install apache2 package] *********************************************** 
changed: [test-1]

PLAY RECAP ******************************************************************** 
test-1                 : ok=5    changed=1    unreachable=0    failed=0   

Примечание. Дополнительные задачи Debug и Debug1 позволяют увидеть, что на удаленном хосте установлена ОС Debian, и в переменную package_name записано значение apache2.

Благодаря успешному использованию переменной package_name данный набор инструкций правильно установит web-сервер apache и на RedHat, и на Debian.

В Ansible переменные можно задавать в отдельном (глобальном) файле, а потом включать этот файл в playbook с помощью ключевого слова vars_files:. Например, у нас есть файл с переменными /etc/ansible/vars/test_var.yml с таким содержанием:

---
package_name: "apache2"

В наборе инструкций включение этого файла с переменными будет выглядеть следующим образом:

---
- hosts: test
  vars_files:
    - /etc/ansible/vars/test_var.yml
  tasks:
    ...

Также есть возможность устанавливать переменные непосредственно в playbook с помощью ключевого слова vars:, выглядит это так:

---
- hosts: test
  vars:
    - package_name: "apache2"
  tasks:
    ...

Как уже упоминалось во второй части знакомства с Ansible, в качестве переменных можно использовать данные, полученные при выполнении задачи GATHERING FACTS.

Посмотреть переменные и их значения можно командой:

ansible -m setup test

В первой части мы создали инвентарный (inventory) файл /etc/ansible/hosts, в котором описали группу test и два хоста (test-1 и test-2), входящие в эту группу. Использование групп в инвентарном файле позволяет группировать удаленные хосты по регионам размещения или по ролям серверов — это чрезвычайно удобно при работе с сотнями и тысячами серверов.

Также в inventory файле можно использовать регулярные выражения, например запись:

[test]
test-[01:99]

будет соответствовать группе хостов test, в которую входят хосты test-01, test-02, test-03, … test-99.

Для конкретного хоста или группы хостов из инвентарного файла можно установить специфические переменные при необходимости. Например, хосту test-1 можно назначить ssh порт таким образом:

[test]
test-1 ssh_port=5555
test-2

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

[test]
test-1
test-2
[test:vars]
ssh_port=5555

Примечание. Конечно же, можно создавать отдельные файлы переменных для хостов и для групп — в директории host_vars и в директории group_vars соответственно. Единственное условие — каталоги с этими файлами переменных должны находиться в одной директории с инвентарным (inventory) файлом.

Стоит помнить об иерархии переменных: переменные из глобального файла переопределяют хост-переменные, групповые переменные и переменные в инвентарном файле. Групповые переменные переопределяют переменные из инвентарного файла, а хост-переменные переопределяют групповые переменные.

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

tweet Share