Thank you for reading this post, don't forget to subscribe!
В системе управления конфигурациями Ansible
переменные хранят значения, которые могут использоваться в наборах инструкций (playbook). Информация об удаленных хостах из файла inventory также может быть использована в качестве переменных
Примечание. Дело в том, что пакет Apache имеет разное название в различных дистрибутивах — httpd
для RedHat и apache2
для Debian.
Создадим файл /etc/ansible/playbooks/install_apache.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
--- - 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" |
Дополнительные задачи Debug и Debug1 позволяют увидеть, что на удаленном хосте установлена ОС Debian, и в переменную package_name
записано значение apache2
.
Благодаря успешному использованию переменной package_name
данный набор инструкций правильно установит web-сервер apache
и на RedHat, и на Debian.
В Ansible
переменные можно задавать в отдельном (глобальном) файле, а потом включать этот файл в playbook с помощью ключевого слова vars_files:
. Например, у нас есть файл с переменными /etc/ansible/vars/test_var.yml
с таким содержанием:
1 2 3 |
--- package_name: "apache2" |
В наборе инструкций включение этого файла с переменными будет выглядеть следующим образом:
1 2 3 4 5 6 7 8 |
--- - hosts: test vars_files: - /etc/ansible/vars/test_var.yml tasks: ... |
Также есть возможность устанавливать переменные непосредственно в playbook с помощью ключевого слова vars:
, выглядит это так:
1 2 3 4 5 6 |
--- - hosts: test vars: - package_name: "apache2" tasks: ... |
в качестве переменных можно использовать данные, полученные при выполнении задачи GATHERING FACTS
.
Посмотреть переменные и их значения можно командой:
1 2 3 |
<span style="font-size: 14pt;"><strong><code class="language-bash hljs">ansible -m setup <span class="hljs-built_in">test </span></code></strong></span> |
Использование групп в инвентарном файле позволяет группировать удаленные хосты по регионам размещения или по ролям серверов — это чрезвычайно удобно при работе с сотнями и тысячами серверов.
Также в 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) файлом.
Стоит помнить об иерархии переменных: переменные из глобального файла переопределяют хост-переменные, групповые переменные и переменные в инвентарном файле. Групповые переменные переопределяют переменные из инвентарного файла, а хост-переменные переопределяют групповые переменные