我有以下JMESPath查询
query="Reservations[].Instances[].{ \
InstanceId: InstanceId, \
RootDeviceVolumeId: BlockDeviceMappings[?DeviceName==\`/dev/sda1\`] \
| [].Ebs.VolumeId | [0], \
RootDeviceName: RootDeviceName \
}"
aws ec2 describe-instances --query $query
给出这样的输出
+------------+------------------+----------------------+
| InstanceId | RootDeviceName | RootDeviceVolumeId |
+------------+------------------+----------------------+
| i-12345678| /dev/sda1 | vol-abcdef12 |
| i-98765432| /dev/sda1 | vol-ef123456 |
| i-23456789| /dev/sda1 | vol-fedcba09 |
| i-aabbccdd| /dev/xvda | None |
+------------+------------------+----------------------+
我想找到一种方法来引用RootDeviceName
过滤器表达式中的BlockDeviceMappings
,而不是硬编码/dev/sda1
设备名称,因为有时它是{{1} } 例如。但是,我找不到在过滤器表达式中引用父元素的方法。
另一种选择是将/dev/xvda
和RootDeviceName
映射到所有设备的投影上,然后将其传递给过滤器表达式,但语法似乎不支持在投影中包含父元素任
我是否遗漏了某些内容,或者这只是JMESPath语法的限制?
答案 0 :(得分:4)
我们需要一些允许你绑定范围的机制,这是目前尚无法实现的。我很想添加这个。现在你必须使用替代工具。
答案 1 :(得分:0)
如果你愿意为你的JMESPath使用python代码添加自定义函数,那么就会有一种肮脏而丑陋的方式来做类似的事情。它确实违反了“功能应该没有副作用”的规则。这是要点:https://gist.github.com/martinvirtel/366235401cf7fbec503d53eb44109f25
gist中的fetchstore.py文件向JMESPath添加了一个fetch和store函数。请参阅下面的测试或示例,了解其工作原理。以下是有关如何使用Python项目向JMESPath添加函数的指导:https://pypi.python.org/pypi/jmespath#custom-functions。
输入:
{ "name" : "parent name",
"data" : [
{ "x" : 1, "y" : 2 },
{ "x" : 3, "y" : 2 }
]
}
JMESPath Expression:
{
name: store(name,'parent_name_attribute'),
data: data[][ fetch('parent_name_attribute'),x, y]
}
结果:
{
"name": "parent name",
"data": [
[ "parent name", 1, 2 ],
[ "parent name", 3, 2 ]
]
}