Рубрики
Uncategorized

Шаблоны Jinja в соли

Мы закончили вторую статью в этой серии о соли инструмента управления конфигурацией, с пробкой … Tagged с солью, SaltStack, Jinja, Devops.

Автоматизация вашей ИТ-окружающей среды солью (3 часть серии)

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

Чтобы сделать штаты действительно динамичными, мы не хотим, чтобы роли и упаковки в них и пакеты. Мы хотим, чтобы государственная логика была гибкой. Мы хотим настроить нашу среду в собственной клавишном магазине соли (зерна и столб). Для этого нам нужно глубже в шаблоне.

По умолчанию каждый файл соли состояния пропускается через рендерер перед обработкой солью. Рендер по умолчанию в соли — это двигатель шаблонов Python, называемый Jinja Отказ Выход процесса Jinja затем передается в процессор YAML, который анализирует данные в файлах в структуру данных, используемую по соли. Этот трубопровод рендеринга обычно представлен как Jinja | Ямл (Если вы знаете, Unix Tips, вы поймете почему).

Они представляют два типа рендереров в соли. Jinja — это текстовый рендер, который требуется в некоторых текстах и возвращает некоторые текст. YAML — это рендерер данных, который требуется в некоторых текстах и возвращает структуру данных.

Доступны другие текстовые рендереры, такие как Genshi и Mako, оба из них шаблоновки. Есть также другие визуализации данных, такие как JSON.

В этом посте мы будем придерживаться по умолчанию Jinja | Ямл И сосредоточиться на текстовом рендерере, а именно Jinja.

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

Например, скажем, мы хотели бы повернуть список Python в список разметки, у нас может быть такой шаблон:

Here is a markdown list for you:
{% for word in ['apple', 'grapple', 'wroom'] %}
* {{ word }}{% endfor %}

Это дало бы следующий вывод, когда мы проводим через него через Jinja Renderer:

Here is a markdown list for you:

* apple
* grapple
* wroom

Давайте немного сломаем этот пример. Как видите, язык шаблонов Jinja основан на курчавых скобках {} сопровождается другим знаком, обозначающим заявлениями, выражениями или даже комментариями.

Заявления

Заявления обернуты в фигурные скобки, сопровождаемые % Отказ Заявление о петле в приведенном выше примере написана как:

{% for word in ['apple', 'grapple', 'wroom'] %}

Это напоминает (и является) python способ определить цикл для цикла (исключая двоеточие, необходимое в Python). Если Заявление следует за тем же вьющимся процентным форматом, поэтому Если Заявление для проверки, если слово содержит букву A, будет записан как:

{% if 'a' in word %}

Python использует отступов, чтобы закрыть блоки для таких заявлений. Это будет поднять проблемы в шаблонах, потому что это не было бы понятно, когда вы хотите, чтобы шаблон выводил белое пространство или когда вы просто отступаете за оператором. Чтобы обойти эту проблему, Jinja закрывает блоки с операцией, специфичной Jinja.

Закрыть для Заявление о петле вы бы использовали {% EndFor%} При закрытии Если Заявление требует {% Endif%} Отказ Поэтому, когда вы найдете для Цикл в шаблоне Jinja вы увидите, где заканчивается блок, ища EndFor утверждение.

Закрытие, как это требуется только для блоков кода, таких как петли или условные условные. Есть заявления, которые не требуют этого, например Установить Заявление, которое присваивает значение для переменной. Если бы мы хотели назначить строку «Снег» для переменной под названием Погода Мы бы написали это как заявление:

{% set weather = 'snow' %}

Мы не закрываем заявление, подобное это с Заключиться Потому что это не код код. Это просто однострочное заявление.

Выражения

Выражения для распечатки чего-то вроде переменных выражены двойными вьющимися брекеты {{}} Отказ В примере мы хотим распечатать в каждой строке в нашем списке звездочка, а затем переменная слово Итак, мы пишем это как:

* {{ word }}

Вывод будет звездочкой, за которой следует белое пространство, потому что Jinja распечатает все символы неинджи, как есть. После этого он распечатал бы переменное слово (выражение Jinja). Если значение переменной слово Является ли Apple, что он выводил:

* apple

Удаление белого пространства

Jinja распечатывает все символы как есть. Это означает, что белое пространство становится немного проблематичным, потому что белые пробелы и линейные разрывы (невидимые \ N в наших шаблонах) все тоже напечатаны. Пример с Apple, Grapple, WROOM может быть трудно проанализировать, как оно есть. Если мы бы вместо этого написали как:

Here is a markdown list for you:

{% for word in ['apple', 'grapple', 'wroom'] %}
  * {{ word }}
{% endfor %}

Мы заканчиваем с выходом, содержащим гораздо более белое пространство:

Here is a markdown list for you:


  * apple

  * grapple

  * wroom

Jinja дает нам хороший способ удалить белое пространство. Если вместо того, чтобы открыть заявление с помощью {% Вы открываете его с {% - (То есть с добавленным знаком минус) вы удалите все белое пространство перед оператором. Если вы добавите минус знак на закрывающийся кронштейн %} чтобы получить -%} Вы удалите все белое пространство после утверждения.

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

Here is a markdown list for you:

{% for word in ['apple', 'grapple', 'wroom'] -%}
* {{ word }}
{% endfor %}

Это даст нам вывод, который мы хотим, но более читаемым образом.

Другие приятные особенности

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

Один фильтры. Фильтры — это функции, которые вы можете использовать для изменения переменных. Фильтры применяются с использованием трубы и могут быть прикованы (похожи на трубы Unix), то есть Переменная | Фильтр | Фильтр .

Если бы мы, например, хотели распечатать случайное слово из нашего списка, мы могли бы использовать встроенный Случайные фильтр:

{% set wordlist = ['apple', 'grapple', 'wroom'] -%}
Word of the day is: {{ wordlist|random }}

Это будет распечатать строку с одной из строк, выбранных случайно, например:

Word of the day is: apple

Я рекомендую пройти через Список встроенных фильтров в jinja И познакомитесь большинство фильтров.

Другая функция, которая приятна, — это тесты для переменных, в основном из-за синтаксического сахара, который облегчает чтение шаблонов. Тесты сделаны путем добавления это За переменной с последующей функцией. Например, мы можем комбинировать много того, что мы обсуждали в нашу собственную Jinja Fizzbuzz генератор:

{% for number in range(1, 22) -%}
    {% set modulo3 =  number is divisibleby(3) -%}
    {%- if modulo3 %}fizz{% endif %}

    {%- if number is divisibleby(5) %}buzz
    {%- elif not modulo3 %}{{ number }}{% endif %}
{% endfor -%}

Это выкроет счетчик Fizzbuzz на несколько номеров. В этом мы используем для петли, Если и Установить заявления. Мы распечатаем переменные, и мы используем встроенный тест под названием Divisiblebyby Это проверяет, будет ли переменная делится по предоставленным номеру. Есть несколько Встроенные тесты В Jinja это может облегчить чтение кода.

Но давайте вернемся к серии. Мы здесь, чтобы узнать о соли!

В нашем последнем посте мы определили какие пакеты для установки на основе ролей в нашем столпе. Однако мы все еще были жесткими кодированными этими пакетами в наших штатах. Мы должны стремиться к конфигурации в нашем столпе и государственной логике, а не в конфигурации, в наших штатах.

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

cow-e9e01577bbd8:
    ----------
    packages:
        ----------
        cowsay:
            A program with a cow
        fortune:
            A program for a fortune teller

Давайте создадим новый файл состояния и позвоните в него роли . Этот файл будет иметь логику, нам нужно установить пакеты на основе столба с помощью Jinja.

У нас все еще есть та же проблема, что и раньше, где Ubuntu устанавливается в другом месте, чем Alpine, поэтому мы должны создавать символические ссылки. Теперь вы, однако, вы понимаете логику немного лучше. Это был трюк, который мы сделали:

{% if grains['os'] == 'Ubuntu' %}
make cowsay available on ubuntu:
  file.symlink:
    - name: /usr/bin/cowsay
    - target: /usr/games/cowsay
{% endif %}

Мы использовали Jinja’s Если Заявление, чтобы проверить, определена ли операционная система в зернах, является Ubuntu. Если это так, то мы создаем это состояние. Если нет, то мы ничего не делаем.

Соль добавляет зерна и столб к глобальному контексту Jinja и делает их доступными в качестве переменных. Вот почему мы можем написать зерна [«ОС»] . Точно так же мы можем использовать глобальную переменную Jinja Столб Чтобы получить доступ к стойке.

Вернуться к роли . Мы поставим эту логику Jinja/YAML в файл:

{% if 'packages' in pillar %}
install role tools:
  pkg.installed:
    - pkgs: {% for package in pillar['packages'] %}
      - {{ package }}
      {% endfor %}

{% if grains['os'] == 'Ubuntu' %}
{% for package in pillar['packages'] %}
make {{ package }} available on ubuntu:
  file.symlink:
    - name: /usr/bin/{{ package }}
    - target: /usr/games/{{ package }}
{% endfor %}
{% endif %}

{% endif %}

Давайте пройдем через этот шаг за шагом. Сначала мы проверяем, есть ли пакеты столба для нас. Если мы определяем состояние, чтобы установить все инструменты для ролей. Это государство называет Установлен Функция в PKG Модуль, а затем поставляют список всех имен пакетов, зацикливаясь через пакеты, которые мы получаем от столба.

После этого мы создаем отдельное состояние с символической ссылкой для каждого пакета (снова доступа к пакетам столба, но только если мы находимся на машине Ubuntu). Теперь это предполагает, что все пакеты, которые мы устанавливаем, будут установлены в /usr/games на убунту. Это может быть не так, но я оставлю его как упражнение для вас, чтобы использовать значение столпа и некоторую логику в состоянии, чтобы сделать только это, если мы явно скажем соли для создания этой символической ссылки.

В следующем посте я покажу вам один способ добиться этого.

Развертывание нашей логики посылки

Теперь мы можем безопасно бросить остальные файлы SLS, которые мы создали для каждой из ролей. Идти вперед и удалить Cow.sls , Fortune.sls , а также локомотив .sls из государственного каталога.

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

Мы могли бы просто применить это во все солевые миньоны, потому что мы проверим, есть ли пакеты в колонне, прежде чем мы их применяем. Однако давайте просто ограничимся тем миньонами, которые имеют роль, определенную в зернах (поэтому мы можем использовать эту возможность, чтобы напомнить себе о том, как цель с зернами). Наше Top.sls Файл тогда выглядит так:

base:
  'roles:*':
    - match: grain
    - roles

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

docker-compose stop
docker-compose rm
docker-compose up -d
docker-compose exec salt bash

Как только мы прикрепим к солевому мастеру, мы принимаем ключи для соли для новых миньонов (нажмите Enter, чтобы принять их при появлении запроса):

salt-key -A

Тогда мы просто применяем состояние на все машины:

salt '*' state.apply

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

Итак, теперь мы находимся в месте, где, если мы хотим определить новые пакеты для новой роли, мы просто определяем его в колонне с некоторыми простыми конфигурациями, а остальное является автоматическим.

Теперь мы начинаем видеть истинный потенциал использования соли для управления ИТ-инфраструктурой.

Эта работа лицензирована под Creative Commons Attribution-Sharealike 4.0 Международная лицензия Отказ

Изображение покрытия мотококой: Awashima jinja Храм

Автоматизация вашей ИТ-окружающей среды солью (3 часть серии)

Оригинал: «https://dev.to/trickvi/jinja-templates-in-salt-457o»