我有四个系统,在这些系统中,我需要提取事实,然后将它们用作jinja 2模板上的变量。
在Ansible中,我有:
vars:
office1:
web01:
myip: 10.10.10.10 // or fact
peer: 10.10.10.20
web02
myip: 10.10.10.20 // or fact
peer: 10.10.10.10
office2:
web01:
myip: 10.20.20.30 // or fact
peer: 10.20.20.40
web02
myip: 10.20.20.40 // or fact
peer: 10.20.20.30
在Jinja 2模板上,我有:
# Config File:
host_name: {{ ansible_hostname }} // web01
host_ip: {{ ansible_eth0.ipv4.address }}
host_peer: {{ office1."{{ ansible_hostname }}".peer }}
但是我得到一个错误,指出Ansible变量:office1.ansible_hostname.peer没有定义。
任何帮助,将不胜感激。
答案 0 :(得分:1)
Ansible中的扩展不是递归的。尝试以下扩展
host_peer: {{ office1[ansible_hostname].peer }}
例如下面的播放
- hosts: test_01
gather_facts: yes
vars:
office1:
test_01:
myip: 10.20.20.30
peer: 10.20.20.40
tasks:
- template:
src: template.j2
dest: /scratch/test_01.cfg
with template.j2
# Config File:
host_name: {{ ansible_hostname }}
host_peer: {{ office1[ansible_hostname].peer }}
给予:
# cat /scratch/test_01.cfg
# Config File:
host_name: test_01
host_peer: 10.20.20.40
回答问题
根据实际情况创建变量
一种选择是使用 lookup vars 。例如下面的播放
vars:
var1: var1
var2: var2
var3: var3
tasks:
- debug:
msg: "{{ lookup('vars', 'var' + item) }}"
with_sequence: start=1 end=3
给予(节略):
"msg": "var1"
"msg": "var2"
"msg": "var3"