Назад | Перейти на главную страницу

Puppet - ERB шаблон - Вопрос об определенных классах

Файлы шаблонов марионетки - это файлы направляющих erb.

Мне нужна строка:

Include modsecurity.d/*.conf

Будет включен в окончательный файл, если включен класс mod_security.

Из марионеточных документов: http://docs.puppetlabs.com/guides/templating.html -

И этот фрагмент напечатает весь определенный класс в каталоге:

<% classes.each do |klass| -%>
The class <%= klass %> is defined
<% end -%>

Условный:

<% if broadcast != "NONE" %>        broadcast <%= broadcast %> <% end %>

Я новичок в синтаксисе. Определено означает то же, что и включено? Для условного выражения, как мне проверить конкретный класс, т.е. если isdefined (mod_security) ...?

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

Два способа обойти это:

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

  2. еще лучше, создайте собственный факт, который проверяет наличие mod_security, и используйте это имя факта в качестве условной переменной.

    Facter.add ("mod_security_version") do setcode do version =% {rpm -qa | grep mod_security} если version.empty? версия = 0 конец версия конец конец

Затем в вашем шаблоне:

<% if ! mod_security_version.eql?("0") %>
Include modsecurity.d/*.conf
<% end %>

Обратите внимание, что это должно быть сравнение строк (не mod_security_version != 0), потому что все фактические данные являются строками, как только они попадают в ERB.

Определенные классы действительно означают, что класс включен. Чтобы было ясно, <% if broadcast ... bit - это не способ проверить включение широковещательного класса, а скорее синтаксис условного выражения с использованием значения широковещательной переменной, массив классов содержит имена всех определенных классов.

Вот как вы могли бы проверить, например, класс mod_security:

<% if classes.include?("mod_security") %>
conditional text
<% end %>

Редактировать:

Упс ... метод называется include? не включает ?. Исправлено выше.