Как создать шаблоны Ansible для экономии времени на настройке

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

В этом руководстве вы узнаете, что такое шаблоны Ansible, как они работают, и как вы можете использовать модуль шаблонов Ansible, чтобы сэкономить массу времени.

Предварительные требования

Эта публикация будет пошаговым руководством. Если вы хотите следовать за мной, убедитесь, что у вас есть хост контроллера Ansible. В этом уроке будет использоваться Ansible v2.9.18

Что такое шаблон Ansible?

Иногда вам нужно передавать текстовые файлы на удаленные хосты. Эти текстовые файлы обычно являются некими файлами конфигурации. Если вы работаете с одним сервером, например, вам может потребоваться создать файл конфигурации под названием app.conf, который использует некоторый сервис.

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

Но что, если у вас есть несколько веб-серверов, каждому из которых нужен тот же файл конфигурации, но с их собственными уникальными значениями? Вы не можете просто скопировать файл конфигурации на все машины; он предназначен только для одного сервера с определенным именем хоста, IP-адресом и т. д. Здесь на помощь приходит шаблон Ansible.

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

Как выглядит шаблон Ansible?

Шаблон Ansible – это текстовый файл, построенный с использованием языка шаблонов Jinja2 с расширением файла j2. Шаблон Jinja2 выглядит точно так же, как текстовый файл, который вы хотели бы разместить на удаленном хосте. Единственное отличие в том, что вместо статических значений файл содержит переменные.

Например, вам может потребоваться получить файл конфигурации под названием app.conf на всех ваших веб-серверах, который содержит ссылки на IP-адрес каждого соответствующего сервера, хост Ansible и пользователя Ansible. Файл app.conf одного сервера может выглядеть примерно как в приведенном ниже примере.

my_ip    = "192.168.0.1"
my_host  = "ANSBILECONTROL"
my_user  = "ansible_user"

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

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

Ниже приведен пример файла шаблона app.conf.j2. Теперь вы видите, что каждое статическое значение заменено переменной, отмеченной двойными фигурными скобками с обеих сторон. В этом случае эти переменные берутся из фактов Ansible.

Файлы шаблонов всегда имеют расширение файла J2 и обычно имеют то же имя, что и файл, который они создают на целевом хосте.

my_ip    = "{{ansible_default_ipv4["address"]}}"
my_host  = "{{ansible_host}}"
my_user  = "{{ansible_user}}"

Как создаются шаблонизированные файлы на удаленных хостах?

После того как вы создали шаблон, вам нужно передать этот файл шаблона на удаленный хост и “конвертировать” его в фактический текстовый файл того, как он должен выглядеть. Для этого вам нужно ссылаться на файл шаблона в плейбуке.

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

Ниже вы можете увидеть простой пример ссылки из плейбука, который копирует файл app.conf в каталог /opt на всех целевых хостах плейбука.

- name: copy file from local host to remote host
  copy:                               # Declaring Copy Module 
    src: "app.conf"                   # Source Location 
    dest: "/opt/app.conf"             # Destination Location on remote host

Теперь предположим, что вы “сделали шаблоном” файл конфигурации app.conf, чтобы он стал файлом шаблона app.conf.j2, описанным в предыдущем разделе на вашем контроллере Ansible. Теперь вам нужно убедиться, что app.conf все еще попадает в каталог /opt, но с заменой переменных реальными значениями.

Чтобы указать плейбуку создать файл app.conf в каталоге /opt, просто замените ссылку copy на template, как показано ниже. При этом Ansible вызывает модуль template, чтобы как передать шаблон, так и заменить переменные на статические значения.

- name: template file to remote host
  template:                 # Ansible template module
    src: "app.conf.j2"      # This is template src i.e source location 
    dest: "/opt/app.conf"   # Destination of Remote host

После выполнения вышеуказанной задачи в плейбуке Ansible скопирует файл app.conf.j2 в каталог /opt на удаленном хосте, заменит все переменные статическими значениями и переименует файл в app.conf.

Когда вы указываете шаблон src с путем к каталогу, Ansible ищет шаблоны в каталоге /<ansible_installation_directory>/files/. Если вы просто указываете имя файла, Ansible будет искать шаблон в каталоге /<ansible_installation_directory>/templates/.

Отображение файла конфигурации: пример шаблона

Давайте теперь перейдем к демонстрации, чтобы увидеть, как настроить шаблон Ansible и использовать модуль шаблона Ansible для динамической генерации файла конфигурации. В этом примере вы создаете файл с именем app.conf в каталоге /etc на сервере с именем SRV1.

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

1. Подключитесь к контроллеру Ansible, используя любого пользователя, которого обычно используете для управления Ansible.

2. Создайте папку в вашем домашнем каталоге для хранения файлов демонстрации этого учебника и измените рабочий каталог на нее.

mkdir ~/ansible_template_demo
cd ~/ansible_template_demo

3. Создайте файл шаблона с именем app.conf.j2 в каталоге, который выглядит как ниже.

my_ip = {{ansible_default_ipv4["address"]}}
my_host  = {{ansible_host}}
my_user  = {{ansible_user}}

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

4. Создайте простой плейбук в том же каталоге с именем my_playbook.yml. Этот плейбук создает файл app.conf в каталоге /etc.


name: Ansible template example 
hosts: myserver 
remote_user: ubuntu   # Using Remote host as ubuntu 
tasks: 
 - name: Create the app.conf configuration file
   template:
     src: "~/ansible_template_demo/app.conf.j2"
     dest: "/etc/app.conf"
   become: true 

5. Вызовите плейбук Ansible, нацеливаясь на удаленный хост SRV1.

ansible-playbook my_playbook.yml --inventory SRV1
You should then see Ansible execute the playbook.

6. Теперь подтвердите, что файл конфигурации /etc/app.conf существует и имеет ожидаемые значения.

confirm the /etc/app.conf configuration file

Обновление прав доступа к файлу с помощью модуля шаблонов

Теперь, когда вы увидели основы использования модуля шаблонов, давайте перейдем к более продвинутому уровню. На этот раз вы собираетесь создать тот же файл app.conf, что и ранее. Но на этот раз вы установите владельца файла и разрешения на этот файл.

Чтобы изменить права доступа к файлу, созданному модулем шаблонов, вам необходимо использовать три параметра внутри файла сценария:

  • владелец – Владелец файла
  • группа – Группа, к которой должен принадлежать файл
  • режим – Разрешения. Эта строка может быть выражена либо в символах, либо в восьмеричных числах

В символьном режиме u обозначает “пользователь”, g обозначает “группа”, а o обозначает “другие”.

Предполагая, что у вас все еще есть папка ~/ansible_template_demo, созданная в предыдущем разделе, откройте playbook my_playbook.yml и замените его содержимое на следующее. В этом примере Ansible устанавливает владельца и группу для пользователя Ansible, используя переменные подключения. Затем устанавливает разрешения файла на 0644, что означает:

  • Владелец имеет права на чтение/запись
  • Пользователи в группе и все остальные имеют право на чтение
---
- name: Ansible file permission example
  remote_user: ubuntu
  tasks:
    - name: Create the app.conf configuration file and assign permissions
      template:
          src: "~/ansible_template_demo/app.conf.j2"
          dest: "/etc/app.conf"
	  owner: "{{ ansible_user }}"
          group: "{{ ansible_user }}"
          mode:  0644 ## OR  mode: u=rw, g=w,o=r       
      become: true

Вы можете найти все доступные параметры модуля шаблона в документации по модулю шаблона Ansible.

Теперь выполните playbook еще раз, как показано ниже.

ansible-playbook my_playbook.yml --inventory SRV1

Теперь вы можете видеть, что у файла app.conf установлены ожидаемые разрешения файла.

app.conf

Использование циклов для создания нескольких файлов из шаблона

Иногда одного файла недостаточно; вам нужно добавить несколько файлов на удаленный хост. В таком случае вы можете использовать циклы с модулем шаблона. Определение цикла с помощью параметра loop позволяет добавлять много текстовых файлов, хранящихся в каталоге.

Предполагая, что у вас все еще есть папка ~/ansible_template_demo, созданная в предыдущем разделе, у вас уже должен быть файл app.conf.j2 там.

1. Создайте второй файл шаблона с именем app2.conf.j2 в папке ~/ansible_template_demo, как показано ниже.

 template_host = "{{ template_host }}"
 template_uid = "{{ template_uid }}"
 template_path = "{{ template_path }}"
 template_fullpath = "{{ template_fullpath }}"
 template_run_date = "{{ template_run_date }}"

2. Откройте файл my_playbook.yml и замените все содержимое на нижеприведенный YAML. В этом playbook используется переменная {{item}} для представления каждого обрабатываемого файла шаблона в цикле. Затем параметр loop определяет каждый из файлов шаблона для обработки в цикле.

---
- name: Ansible file permission example 
  remote_user: ubuntu 
  tasks: 
   - name: Create the app.conf configuration file and assign permissions 
     template:   
        src: "~/ansible_template_demo/{{item}}.j2"    # Итерируется по 2 шаблонам   
        dest: "/etc/{{item}}"
        owner: "{{ ansible_user }}"   
        group: "{{ ansible_user }}"   
        mode:  0644 ## ИЛИ  mode: u=rw, g=w,o=r        
     become: true     
     loop: # Скажите модулю шаблона найти каждый из этих шаблонов и обработать                                              
      - app1.conf 
      - app2.conf 

3. Теперь выполните playbook еще раз. ansible-playbook my_playbook.yml --inventory SRV1

ansible-playbook my_playbook.yml --inventory SRV1
Notice now that Ansible sees each template file and processes them accordingly.

Заключение

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

Source:
https://adamtheautomator.com/ansible-template/