根据实际情况定值变量
已更新:我有四个系统,在这些系统中,我需要提取事实,然后将它们用作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的变量对象。
答案 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
我已经在您的问题中指出了一个错字,但是当您编写问题时,很难分辨出这是一个实际错误还是仅仅是复制/粘贴错误。
我想提出另一种组织数据的方式。摆脱office1
和office2
变量,而使用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
变量的值将适合于在其上运行任务的特定主机。