Знакомство с Ansible. Часть 3: переменные
Nov 2, 2015 18:55 · 610 words · 3 minute read
В первой части знакомства с 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
мы разобрались, в следующей статье поговорим об использовании модулей при настройке удаленных хостов.