[英]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
我已经在你的问题中指出了一个拼写错误,但很难说这是一个实际的错误,还是在你写这个问题时这只是一个复制/粘贴错误。
我想建议一种不同的数据组织方式。 摆脱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
变量的值将是适合运行任务的特定主机的任何值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.