【问题标题】:Ansible Jinja2 template for loopAnsible Jinja2 循环模板
【发布时间】:2020-01-21 11:50:23
【问题描述】:

我有两台 linux 服务器:

- server1: ip: 10.241.55.6, hostname: server1
- server2: ip: 10.242.55.7, hostname: server2

我创建了一个名为 servers 的 ansible 清单文件,其内容如下:

[IC]
10.241.55.6
10.241.55.7

现在我已经创建了这个 jinja2 库存模板文件:test.j2,内容如下:

[IC]
{% for hostip in groups['IC'] %}
{% if hostip == ansible_default_ipv4.address %}
{{ ansible_default_ipv4.address }} default_hostname={{ ansible_nodename }}
{{ ansible_default_ipv4.address }} default_hostname={{ ansible_nodename }}
{% endif %}
{% endfor %}

我正在运行这个 ansible playbook:

---
- name: Generate portal inventory file
  hosts: all
  tasks:

   - name: Generate inventory
     delegate_to: localhost
     template:
       src: inventory/test.j2
       dest: inventory/test

命令是:ansible-playbook -i inventory/servers generate-inventory.yml

最终目标是 ansible 从清单文件连接到每个服务器,然后基于 jinja2 清单模板,它创建一个具有以下格式的新清单文件:

[IC]
10.241.55.6 default_hostname=hostname_of_the_server_with_that_ip

等等……

for 循环的问题是所有条目都具有相同的服务器 ip(而我应该为每个具有各自主机名的服务器都有一个条目):

[IC]
10.241.55.6 default_hostname=server1
10.241.55.6 default_hostname=server2

我在这里缺少什么?另外,如果有任何其他更好的方法来实现这一点,请告诉我。

【问题讨论】:

    标签: ansible ansible-2.x ansible-inventory ansible-template


    【解决方案1】:

    您在模板中使用了两次相同的变量...

    {{ ansible_default_ipv4.address }} default_hostname={{ ansible_nodename }}
    {{ ansible_default_ipv4.address }} default_hostname={{ ansible_nodename }}
    

    ...所以你当然会得到两条相同的线。听起来您想访问此变量的每个主机值,这意味着您需要通过hostvars 访问它。

    可能是这样的:

    [IC]
    {% for host in groups['IC'] %}
    {{ hostvars[host].ansible_default_ipv4.address }} default_hostname={{ hostvars[host].ansible_nodename }}
    {% endfor %}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-26
      • 2016-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多