根据实际情况创建变量

时间:2019-05-02 17:36:22

标签: variables ansible jinja2

我有四个系统,在这些系统中,我需要提取事实,然后将它们用作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没有定义。

任何帮助,将不胜感激。

1 个答案:

答案 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"