Поиск по сайту:

Как создавать шаблоны в Ansible для создания конфигураций на управляемых узлах — часть 7


В этой Части 7 серии Ansible вы узнаете, как создавать и использовать шаблоны в Ansible для создания настраиваемых конфигураций на управляемых узлах. Создание шаблонов в Ansible — это простой и удобный способ передачи пользовательских конфигураций на управляемые узлы, работающие на разных системах, с минимальным редактированием файлов playbook.

Что такое шаблонизация в Ansible?

Чтобы лучше понять, что такое шаблон, давайте представим, что ИТ-менеджер составляет электронное письмо, чтобы пригласить свой отдел на коктейльную вечеринку. Электронное письмо отправляется каждому из участников, а также им предлагается присоединиться к своим супругам.

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

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

Jinja2 использует двойные фигурные скобки {{ ... }} для заключения определенной переменной. Для комментариев используйте {{# #, а для условных операторов — {% … %.

Предположим, что у вас есть модель данных VLAN в вашей сети с хост-системами, которую вы хотите передать в соответствующие VLAN, как показано.

vlans:
  - id: 10
    name: LB
  - id: 20
    name: WB_01
  - id: 30
    name: WB_02
  - id: 40
    name: DB

Для визуализации этой конфигурации соответствующий шаблон jinja2 под названием vlans.j2 будет выглядеть так, как показано. Как видите, переменные vlan.id и vlan.name заключены в фигурные скобки.

vlan {{ vlan.id }}
  name {{ vlan.name }}

Если объединить все это в сборник сценариев, в котором размещаются разные хост-машины, это будет выглядеть так:

    - hosts
  tasks:
    - name: Rendering VLAN configuration
      template:
         src: vlans.j2
         dest: "vlan_configs/{{ inventory_hostname }}.conf"

Пример 1. Настройка веб-серверов в разных дистрибутивах

В этом примере мы создадим файлы index.html, которые будут отображать информацию о имени хоста и ОС двух веб-серверов, на которых работают CentOS и Ubuntu. .

Настраивать

Ubuntu 18 - IP address: 173.82.202.239
CentOS 7 -  IP address: 173.82.115.165

Веб-сервер Apache уже установлен на обоих серверах.

Для ЦентОС 7

Для Убунту 18.04

Итак, давайте создадим сборник сценариев test_server.yml, как показано:

---

 - hosts: all
   become: yes

   tasks:

    - name: Install index.html
      template:
        src: index.html.j2
        dest: /var/www/html/index.html
        mode: 0777

Наш шаблон файла Jinjaindex.html.j2, который будет помещен в файл index.html на каждом веб-сервере. Всегда не забывайте добавлять в конце расширение .j2, чтобы указать, что это файл jinja2.

Давайте теперь создадим файл шаблона index.html.j2.

<html>
<center>
   <h1> The hostname of this webserver is {{ ansible_hostname }}</h1>
   <h3> It is running on {{ ansible_os_family}}system </h3>
</center>
</html>

Этот шаблон представляет собой базовый HTML-файл, в котором ansible_hostname и ansible_os_family являются встроенными переменными, которые будут заменены соответствующими именами хостов и операционными системами отдельных веб-серверов в браузере.

Теперь давайте запустим пьесу.

ansible-playbook test_server.yml

Теперь давайте перезагрузим веб-страницы для веб-серверов CentOS 7 и Ubuntu.

Для ЦентОС 7

Для Убунту 18.04

Как видите, на каждом сервере отображается разная информация об имени хоста и семействе ОС. Вот насколько круты шаблоны Jinja2!

ФИЛЬТРЫ:

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

Пример 1. Сделайте так, чтобы строки отображались в верхнем/строчном регистре

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

{{ ansible_hostname | upper }} => CENTOS 7
{{ ansible_os_family | upper }} => REDHAT

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

{{ ansible_hostname | lower }}  => centos 7
{{ ansible_os_family | lower }} => redhat

Пример 2. Замена строки другой

Кроме того, вы можете заменить строку другой.

Например:

Название фильма: {{ Movie_name }} => Название фильма: Ring.

Чтобы заменить вывод другой строкой, используйте аргумент replace, как показано:

Название фильма: {{ имя_фильма | replace («Кольцо», «Ограбление») }} => Название фильма: Ограбление.

Пример 3: списки и наборы фильтров

Чтобы получить наименьшее значение в массиве, используйте фильтр min.

{{ [ 2, 3, 4, 5, 6, 7 ] | min }}	=>	2

Аналогичным образом, чтобы получить наибольшее число, используйте фильтр max.

{{ [ 2, 3, 4, 5, 6, 7 ] | max }}	=>	7

Чтобы отобразить уникальные значения, используйте фильтр уникальный.

{{ [ 2, 3, 3, 2, 6, 7 ] | unique }} =>	2, 3

Используйте фильтр random, чтобы получить случайное число от 0 до значения.

{{ 50 | random }} =>  Some random number

ПЕТЛИ:

Как и в языках программирования, в Ansible есть циклы Jinja2.

Например, чтобы создать файл, содержащий список чисел, используйте цикл for, как показано в примере ниже:

Пример 1:

{% for number in [0, 1, 2, 3, 4, 5, 6, 7]  %}
{{ number }}
{% end for %}

Вы также можете комбинировать цикл for с операторами if-else для фильтрации и получения определенных значений.

Пример 2:

{% for number in [0, 1, 2, 3, 4, 5, 6, 7]  %}
{% if number == 5 %}
         {{ number }}
{% endif%}
{% endfor %}

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