如果key中有特殊字符,则无法从ansible_devices变量中获取值

时间:2014-06-23 08:54:22

标签: json ansible ansible-playbook

我正在使用聚集事实变量来获取ansible_devices variable的大小。对于某些主机,我得到变量"ansible_devices": { "sda"并且很少有服务器获得"ansible_devices": { "cciss!c0d0"

问题: - 当我使用ansible变量{{ ansible_devices.sda.size }}时,它的效果非常好。但是当我尝试从我的剧本中的{{ ansible_devices.cciss!c0d0.size }}访问值时,它没有返回任何值,而在json ansible_devices变量中,{{ ansible_devices.cciss!c0d0.size }}存在值。

     {
        "ansible_devices": {
            "cciss!c0d0": {
                "holders": [],
                "host": "RAID bus controller: Hewlett-Packard Company Smart Array Controller (rev 03)",
                "model": "LOGICAL VOLUME",
                "partitions": {},
                "removable": "0",
                "rotational": "1",
                "scheduler_mode": "cfq",
                "sectors": "143299800",
                "sectorsize": "512",
                "size": "68.33 GB",
                "support_discard": "0",
                "vendor": "HP"
            }
        },
        "item": ""
    }

可能是ansible变量json键中的特殊字符,这就是我无法获取其值的原因。 任何人都可以建议我如何在这里访问{{ ansible_devices.cciss!c0d0.size }}值?

2 个答案:

答案 0 :(得分:1)

如果您使用的是javascript,还可以将JSON数据提取为:

ansible_devices["cciss!c0d0"]

它会在 cciss!c0d0 键下显示整个对象,然后你可以正常使用像size一样的inbuild函数。

所以尝试使用:

ansible_devices["cciss!c0d0"].size

答案 1 :(得分:0)

从边缘ansible_devices使用hostvars[inventory_hostname]["ansible_devices"] ansible变量,它会给我正确的值。我不知道这背后的确切原因是什么,但这是解决这个问题的诀窍。

{{ hostvars[inventory_hostname]["ansible_devices"]["cciss!c0d0"]["size"] }}

我在Ansible Project Google Group

中获得此解决方案