Templates ansible';的模板包含上下文

Templates ansible';的模板包含上下文,templates,jinja2,ansible,Templates,Jinja2,Ansible,我现在在ansible上玩了将近两个星期,但我没有弄清楚如何将模板包含在上下文中 说: 默认情况下,包含的模板传递给当前上下文[…] 从这句话中,我尝试了以下几点: 在我在服务器上应用的角色中,我导出了一个事实,该事实描述了每个主机上要实例化的检查(我正在尝试创建一个智能nagios_服务器角色) 在nagios角色中,我呈现一个主模板,它将所有检查实例化到一个文件中。检查本身在包含的模板中定义 在roles/nagios_server/tasks/main.yml中: - name: c

我现在在ansible上玩了将近两个星期,但我没有弄清楚如何将模板包含在上下文中

说:

默认情况下,包含的模板传递给当前上下文[…] 从这句话中,我尝试了以下几点:

  • 在我在服务器上应用的角色中,我导出了一个事实,该事实描述了每个主机上要实例化的检查(我正在尝试创建一个智能nagios_服务器角色)

  • 在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 %}
define service {
    host_name             {{ host }}
    service_description   DNS lookup
    check_command         check_dns_lookup
    use                   generic-service
}
在roles/nagios_server/templates/checks/dns.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 %}
define service {
    host_name             {{ host }}
    service_description   DNS lookup
    check_command         check_dns_lookup
    use                   generic-service
}
当我运行playbook时,我得到以下错误:

fatal: [vagrant] => {'msg': "AnsibleUndefinedVariable: One or more undefined variables: 'host' is undefined", 'failed': True}

我错过什么了吗?我应该如何使它工作?

如果您使用的是Jinja 2.0,这是意料之中的。如报告中所述:

注: 在Jinja2.0中,传递给 模板未包含模板中定义的变量。 事实上,这是行不通的:

{% for box in boxes %}
   {% include "render_box.html" %}
{% endfor %}
包含的模板
render_box.html
无法访问Jinja>2.0中的框。从Jinja2.1开始,
render_box.html
就可以这样做


如果您需要更多信息,可以在找到完整的代码。我将github repo移动到,因此我可以自己使用github.com/billietl/servconfig