从事实Ansible和Jinja2创建变量

时间:2019-05-14 13:00:43

标签: python ansible jinja2

根据实际情况定值变量

已更新:我有四个系统,在这些系统中,我需要提取事实,然后将它们用作jinja 2模板上的变量。真实的主机名带有带短划线的前缀,这使得很难将整个主机名用作变量。系统设置为:

office1
    debn-web01
    ubun-web02

office2
    linx-web01
    linx-web02

在Ansible剧中,我有:

vars:
    office1:
       web01:
          myip: 10.10.10.10
          peer: 10.10.10.20
       web02:
          myip: 10.10.10.20
          peer: 10.10.10.10

    office2:
       web01:
          myip: 10.20.20.30
          peer: 10.20.20.40
       web02:
          myip: 10.20.20.40
          peer: 10.20.20.30

我想在主机名上的破折号后提取主机名部分,即“ debn-web01”->“ web01”,以将其用作先前创建的ansible变量。

因此在Jinja2模板上,我有:

# This should create the var: web01
{% set trimd_hostname = ansible_hostname.split("-")[1] %}

# Start of Ansible Config File:
host_name: {{ ansible_hostname }}
web01 host_ip: {{ ansible_eth0.ipv4.address }}
host_peer: {{ office1[ trimd_hostname ]peer }}

修整选项正在起作用,因为我可以将输出本身打印在模板上。但是,我得到一个错误,即对等方不是office1.trimd_hostname的变量对象。

1 个答案:

答案 0 :(得分:0)

回答这个问题有些棘手,因为您还没有发布完整的复制人。这意味着这个问题可能还有些不足,因为我不得不对您的工作做一些假设。

如果我尝试通过以下示例剧本重现您的问题,则该书可以正常运行:

---
- hosts: localhost
  gather_facts: false
  vars:
    office1:
      web01:
        myip: 10.10.10.10
        peer: 10.10.10.20
      web02:
        myip: 10.10.10.20
        peer: 10.10.10.10

    office2:
      web01:
        myip: 10.20.20.30
        peer: 10.20.20.40
      web02:
        myip: 10.20.20.40
        peer: 10.20.20.30
    trimd_hostname: web01
    ansible_hostname: debn-web01
    ansible_eth0:
      ipv4:
        address: 1.2.3.4
  tasks:
    - copy:
        dest: ./output.txt
        content: |
          {% set trimd_hostname = ansible_hostname.split("-")[1] %}
          host_name: {{ ansible_hostname }}
          web01 host_ip: {{ ansible_eth0.ipv4.address }}
          host_peer: {{ office1[trimd_hostname].peer }}

output.txt中产生以下内容:

host_name: debn-web01
web01 host_ip: 1.2.3.4
host_peer: 10.10.10.20

我已经在您的问题中指出了一个错字,但是当您编写问题时,很难分辨出这是一个实际错误还是仅仅是复制/粘贴错误。

我想提出另一种组织数据的方式。摆脱office1office2变量,而使用ansible host_vars来存储信息。

也就是说,创建具有以下内容的host_vars/dbn-web01.yml

myip: 10.10.10.10
peer: 10.10.10.20

其他主机也是如此。然后,您的模板将变得简单:

host_name: {{ ansible_hostname }}
web01 host_ip: {{ ansible_eth0.ipv4.address }}
host_peer: {{ peer }}

peer变量的值将适合于在其上运行任务的特定主机。