用于循环的 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 %}
我有两个 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 %}