我现在正在使用ansible近两周,但我并没有弄清楚如何将中的模板包含在 中。
默认情况下,包含的模板将传递给当前上下文[...]
从这句话中,我尝试了以下内容:
在我在我的服务器上应用的角色中,我导出了一个事实,描述了每个主机上要检查的检查(我正在尝试创建一个智能 nagios_server角色)。 / p>
- name: tell nagios what to monitor
set_fact:
nagios_monitor="{{ nagios_monitor }} dns"
在nagios角色中,我渲染了一个主模板,它将在一个文件中实例化所有检查。支票本身在包含的模板中定义。
在roles / nagios_server / tasks / main.yml中:
- name: configure Nagios checks
template: src="{{ item }}.cfg.j2" dest="/etc/nagios3/conf.d/{{ item }}.cfg"
with_items:
- hosts
- commands
- checks
- defaults
notify:
- restart nagios
在roles / nagios_server / templates / checks.cfg.j2中:
{% for host in groups['all'] %}
{% set checks = hostvars[host]['nagios_monitor'].strip().split(" ") %}
# Checks for {{ host }}
{% for elmt in checks %}
{% if elmt != "" %}
{% include "checks/"+elmt+".cfg.j2" with context %}
{% endif %}
{% endfor %}
{% endfor %}
in roles / nagios_server / templates / checks / dns.cfg.j2:
define service {
host_name {{ host }}
service_description DNS lookup
check_command check_dns_lookup
use generic-service
}
当我运行剧本时,我收到以下错误:
fatal: [vagrant] => {'msg': "AnsibleUndefinedVariable: One or more undefined variables: 'host' is undefined", 'failed': True}
我错过了什么吗?我怎么能让它发挥作用?
答案 0 :(得分:0)
如果您正在使用Jinja 2.0,那么可以预料到。如documentation中所述:
注意:
在Jinja 2.0中,传递给包含的上下文 模板不包含模板中定义的变量。 事实上,这不起作用:
{% for box in boxes %} {% include "render_box.html" %} {% endfor %}
包含的模板
render_box.html
不能够访问Jinja中的框> 2.0。从Jinja 2.1开始,render_box.html
能够这样做。