繁体   English   中英

从Facts Ansible和Jinja2创建Vars

[英]Create Vars from Facts Ansible and Jinja2

来自Ansible Facts的Crating Vars

更新:我有四个系统,在那些我需要提取事实然后在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 }}

修剪选项正常工作,因为我可以在模板上自行打印输出。 但是我得到的错误是peer不是office1.trimd_hostname的变量对象。

回答这个问题有点棘手,因为你没有发布完整的复制器。 这意味着这个问题可能有些偏差,因为我不得不对你正在做的事情做出一些假设。

如果我尝试使用以下示例playbook重现您的问题,它可以正常工作:

---
- 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变量的值将是适合运行任务的特定主机的任何值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM