Используйте ансибельный факт в шаблоне if conditional — Jinja

#python #linux #ansible #jinja2 #ansible-template

Вопрос:

На данный момент у меня есть что-то вроде следующего в моем шаблоне Ansible Jinja

 {% for key in filebeat.values() %}
{% for x in key.servers %}
{% if x in {{ ansible_hostname }} %}
text-goes-here
{% endif %}
{% endfor %}
{% endfor %}
 

При выполнении сборника игр ansible отображается следующая ошибка:

AnsibleError: ошибка шаблона при создании шаблона строки: ожидаемый токен ‘:’, получил ‘}

Похоже, что с Jinja я не могу использовать {{ ansiblee_hostname }} внутри оператора if.

Есть ли какой-то способ, которым я все еще могу получить значение ansible_hostname внутри оператора if, чтобы обойти эту проблему? Я пробовал использовать поиск и другие комбинации, но пока безуспешно.

Заранее спасибо

Ответ №1:

Вы никогда не вставляете {{...}} маркеры шаблонов Jinja. Если вы уже находитесь в контексте шаблона, вы можете просто ссылаться на переменные по имени…

 {% if x in ansible_hostname %}
text-goes-here
{% endif %}
 

Вы уже используете точно правильный синтаксис в своих {% for ... %} циклах. Ты написал:

 {% for key in filebeat.values() %}
 

Вместо:

 {% for key in {{ filebeat.values() }} %}
 

Это {% if ... %} утверждение ничем не отличается.

Комментарии:

1. Этот подход, похоже, работает, если я определяю ansible_hostname со статическим значением в своем файле vars.yaml. Моя идея состояла в том, чтобы получить динамическое значение ansible_hostname, которое предоставляется с помощью Ansible фактов. Когда я пытаюсь использовать {% if x в ansible_hostname %} без определения ansible_hostname в vars.yaml, это не работает.

2. Спасибо, мне удалось заставить его работать с помощью предложенного вами подхода.