templates - 带有 if 条件库存名称的 ansible 模板
问题描述
实际上,我尝试为网桥创建网络配置。为此,我在 group_vars 中有以下内容。
---
backbone_ip:
- name: server2
ipv4: 111.111.111.2/24
ipv6: 2001:111:111:1::2/64
- name: server3
ipv4: 111.111.111.3/24
ipv6: 2001:111:111:1::3/64
- name: server5
ipv4: 111.111.111.5/24
ipv6: 2001:111:111:1::5/64
使用模板模块我编写配置。模板:
auto br-{{ bridge_network }}
iface br-{{ bridge_network }} inet static
{% for server in backbone_ip %}
{% if server.name in hostvars[host].inventory_hostname %}
address {{ server.ipv4 }}
bridge_ports none
bridge_stp off
bridge_fd 0
iface br-{{ bridge_network }} inet6 static
address {{ server.ipv6 }}
{% endif %}
{% endfor %}
现在我的问题是,如果 server.name 是实际连接到的服务器 ansible 的库存名称,我只想写这些行。
hostvars[host].inventory_hostname 似乎是错误的。应该更改为 = 或语法如何?
谢谢 pr0
解决方案
此用例的列表结构错误。将其更改为字典,例如
backbone_dict:
server2:
ipv4: 111.111.111.2/24
ipv6: 2001:111:111:1::2/64
server3:
ipv4: 111.111.111.3/24
ipv6: 2001:111:111:1::3/64
server5:
ipv4: 111.111.111.5/24
ipv6: 2001:111:111:1::5/64
然后属性的寻址是微不足道的,例如
- debug:
msg: "{{ backbone_dict[inventory_hostname].ipv4 }}"
如果您无法更改数据的结构,请先转换它,例如
- set_fact:
backbone_dict: "{{ dict(_keys|zip(backbone_ip)) }}"
vars:
_keys: "{{ backbone_ip|map(attribute='name')|list }}"
run_once: true
推荐阅读
- azure-devops - Azure DevOps 如何定义 YAML 构建路径
- python - 使用 f-strings python 格式化具有相同宽度的数字
- ios - Scandit SDK 在扫描一维条码时出现的奇怪问题
- node.js - 为什么填充在 mongodb 中返回空结果
- doctrine - API 不会停止急切加载
- sql-server - 如何使用 SSIS 执行 url
- amazon-web-services - SNS 和 SQS 哪个更适合发送命令?
- python - 使用 Pyo Python 进行麦克风输入
- kdb - 使用解析或值(KDB / Q)从字符串中访问本地范围的变量
- java - 给定一个 0 和 1 的二进制矩阵。找到 1 的最长序列,无论是行还是列。JAVA