【问题标题】:How to access variable name which include a hyphen in Ansible如何在 Ansible 中访问包含连字符的变量名
【发布时间】:2020-08-16 13:00:04
【问题描述】:

我有一个简单的 vlan 配置文件,我希望它具有与 JunOS 语法匹配的键(这样我可以在需要时将它们作为聚合传递),所以我使用 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
    }
}

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

【问题讨论】:

    标签: ansible yaml


    【解决方案1】:

    将属性放入括号'[]' aka array notation。例如

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

    引用Ansible allows dot notation and array notation for variables. Which notation should I use?

    如果您的变量包含点 (.)、冒号 (:) 或破折号 (-),如果一个键以两个下划线开头和结尾,或者如果一个键使用任何已知的公共属性,那么使用它会更安全数组表示法


    问:“这不是变量,它是关键。”

    答:没错。唯一的限制是键是唯一的。引用自YAML 1.2

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

    【讨论】:

    • 谢谢,这似乎有效。我什至可以使用子项目。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多