ansible的模板包含上下文

时间:2015-08-06 09:23:06

标签: templates jinja2 ansible

我现在正在使用ansible近两周,但我并没有弄清楚如何将中的模板包含在 中。

Jinja's documentation说:

默认情况下,包含的模板将传递给当前上下文[...]

从这句话中,我尝试了以下内容:

  • 在我在我的服务器上应用的角色中,我导出了一个事实,描述了每个主机上要检查的检查(我正在尝试创建一个智能 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}

我错过了什么吗?我怎么能让它发挥作用?

1 个答案:

答案 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 能够这样做。