#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. Спасибо, мне удалось заставить его работать с помощью предложенного вами подхода.