根据事实Ansible和Jinja2创建变量

2024-10-01 11:31:16 发布

您现在位置:Python中文网/ 问答频道 /正文

从可解释的事实中找出变数

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

office1
    debn-web01
    ubun-web02

office2
    linx-web01
    linx-web02

在Ansible的剧本中我有:

^{pr2}$

我想提取主机名上破折号后的主机名部分,即“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 }}

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


Tags: 模板hostjinja2系统ansiblehostname事实主机名
1条回答
网友
1楼 · 发布于 2024-10-01 11:31:16

回答这个问题有点棘手,因为你还没有发布完整的复制品。这意味着这个问题可能有点离题,因为我不得不对你所做的做一些假设。在

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

 -
- 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中生成以下内容:

^{pr2}$

我已经指出了你问题中的一个错误,但很难判断这是一个真正的错误,还是仅仅是一个复制/粘贴错误,当你写问题的时候。在

我想建议一种不同的方式来组织你的数据。去掉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变量的值将是适合于运行任务的特定主机的值。在

相关问题 更多 >