【问题标题】:ansible's template include with contextansible 的模板包含上下文
【发布时间】:2015-08-06 09:23:05
【问题描述】:

我已经用 ansible 玩了将近两个星期了,但我没有弄清楚模板包含与上下文的真正是如何工作的。

Jinja's documentation 说:

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

从这个声明中,我尝试了以下方法:

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

    - name: tell nagios what to monitor
      set_fact:
        nagios_monitor="{{ nagios_monitor }} dns"
    
  • 在 nagios 角色中,我渲染了一个主模板,它将在一个文件中实例化所有检查。检查本身在包含的模板中定义。

在角色/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

在角色/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 %}

在角色/nagios_server/templates/checks/dns.cfg.j2 中:

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}

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

【问题讨论】:

标签: templates jinja2 ansible


【解决方案1】:

如果您使用的是 Jinja 2.0,这是可以预料的。如documentation 中所述:

注意:

在 Jinja 2.0 中,传递给包含的上下文 模板不包含模板中定义的变量。 事实上,这不起作用:

{% for box in boxes %}
   {% include "render_box.html" %}
{% endfor %}

包含的模板render_box.html 无法在 Jinja > 2.0 中访问 box。从 Jinja 2.1 开始,render_box.html 能够这样做。

【讨论】:

    猜你喜欢
    • 2011-01-07
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-23
    • 2010-09-07
    • 2012-11-06
    • 1970-01-01
    相关资源
    最近更新 更多