如何访问Ansible中包含连字符的变量名



我有一个简单的vlan配置文件,我喜欢它的键与JunOS语法匹配(这样,如果需要,我可以将它们作为aggrogate传递(,所以我使用vlan-id键,就像这个示例变量文件一样。

# vlans.yaml
vlans:
- name: general
description: "General"
vlan-id: 100
- name: hotline
description: "Accounting"
vlan-id: 110

但是由于连字符,我无法访问vlan-id密钥

- debug:
msg: "{{ item.vlan-id }}"
loop: "{{ vlans }}"
tags: debug
"msg": "The task includes an option with an undefined variable. The error was: 'dict object' has no attribute 'vlan'

如果我直接输出项目,我可以看到密钥

- debug:
msg: "{{ item }}"
loop: "{{ vlans }}
ok: [SW02] => (item={'name': 'external', 'description': 'External', 'vlan-id': 209}) => {
"msg": {
"description": "External",
"name": "external",
"vlan-id": 209
}
}
ok: [SW01] => (item={'name': 'external', 'description': 'External', 'vlan-id': 209}) => {
"msg": {
"description": "External",
"name": "external",
"vlan-id": 209
}
}

有什么办法解决这个问题吗?

将属性放入方括号"[]"中,也就是数组表示法。例如

msg: "{{ item['vlan-id'] }}"

引用Ansible允许变量使用点表示法和数组表示法。我应该用哪种符号?

如果变量包含句点(.(、冒号(:(或短划线(-(,如果键以两个下划线开始和结束,或者键使用任何已知的公共属性,则使用数组表示法更安全。


Q:"这不是一个变量,它是关键">

A:对。唯一的限制是密钥是唯一的。引用YAML 1.2

映射。映射节点的内容是一组无序的键:值节点对,每个键都是唯一的YAML对节点没有进一步的限制。特别是,键可以是任意节点,同一节点可以用作几个键:值对的值,映射甚至可以将其自身包含为键或值(直接或间接(。

最新更新