Ansible

Теория: Переменные

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

- hosts: webservers
  tasks:
    - name: update nginx config
      ansible.builtin.template:
        src: templates/nginx.conf.j2
        dest: /var/tmp/www/nginx.conf

    - name: update index.html
      ansible.builtin.copy:
        src: files/index.html
        dest: /var/tmp/www/index.html

В данном примере есть две задачи, где в путях для dest используется одна и та же директория /var/tmp/www/. Мы можем избежать дублирования и описать ключ vars, внутри которого перечислить названия переменных и их значения:

- hosts: webservers
  vars:
    root_dir: /var/tmp/www
  tasks:
    - name: update nginix config
      ansible.builtin.template:
        src: templates/nginx.conf.j2

        dest: "{{root_dir}}/nginx.conf"

    - name: update index.html
      ansible.builtin.copy:
        src: files/index.html
        dest: "{{root_dir}}/index.html"

Ansible использует популярный питоновский шаблонизатор Jinja 2. Подстановка переменных в нем работает следующим образом. Перед тем, как разбирать YAML-файл, он прогоняет его через шаблонизатор, который заменяет конструкции {{название переменной}} значениями этих переменных. Для переменной необходимо использовать кавычки, чтобы YAML распознавался корректно. Использование переменной без кавычек приведет к ошибке ERROR! Syntax Error while loading YAML.:

- hosts: webservers
  vars:
    root_dir: /var/tmp/www
  tasks:
    - name: update nginix config
      ansible.builtin.template:
        src: templates/nginx.conf.j2

        dest: {{root_dir}}/nginx.conf

Теперь разберем отличия между template и copy. Одна задача копирует nginx.conf, а вторая index.html. Но в случае с nginx.conf это не простое копирование. Это именно темплэйтинг. Он позволяет прогонять через Jinja 2 пользовательские файлы (не плэйбуки) и выполнять в них подстановки. Это значит, что переменные можно использовать не только в самом плэйбуке. Так удобно работать с конфигурационными файлами (но не только). Например, переменная root_dir в файле nginx.conf.j2:

server {
    location / {
        root {{root_dir}};
    }
}

будет заменена значением из секции vars из плейбука:

server {
    location / {
        root /var/tmp/www;
    }
}

Результат работы такого плейбука не изменится, но внутри произойдет подстановка нужного значения.

Из полезного: если мы случайно ошибемся в названии переменной, то Ansible нам подскажет, что была использована неопределенная переменная.

Рекомендуемые программы