用于循环的 Ansible Jinja2 模板

Ansible Jinja2 template for loop

我有两个 linux 服务器:

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

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

[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 %}

我是 运行 这个可靠的剧本:

---
- 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_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 %}