JSON 查询主机和设备的最新快照?
JSON query for finding the newest snapshot for host and device?
我正在尝试使用 aws ec2
命令在 AWS 中查找设备和主机的最新快照。我从 aws ec2 describe-snapshots
.
得到以下输出
如您所见,我可以为同一个主机(请参阅带有密钥主机名和设备名的标签)和设备创建多个快照。开始时间不同。
{
"Snapshots": [
{
"Description": "My desc.",
"Encrypted": false,
"VolumeId": "vol-aaa",
"State": "completed",
"VolumeSize": 8,
"StartTime": "2018-02-02T19:27:56.000Z",
"Progress": "100%",
"OwnerId": "5674567",
"SnapshotId": "snap-xxx"
},
{
"Description": "host1.domain.com - sdc",
"Tags": [
{
"Value": "SNAP1",
"Key": "Name"
},
{
"Value": "sdc",
"Key": "devicename"
},
{
"Value": "host1.domain.com",
"Key": "hostname"
}
],
"Encrypted": false,
"VolumeId": "vol-xxx",
"State": "completed",
"VolumeSize": 140,
"StartTime": "2018-09-21T08:39:58.000Z",
"Progress": "100%",
"OwnerId": "345634563456",
"SnapshotId": "snap-xxx"
},
{
"Description": "host1.domain.com - sdc",
"Tags": [
{
"Value": "SNAP2",
"Key": "Name"
},
{
"Value": "sdc",
"Key": "devicename"
},
{
"Value": "host1.domain.com",
"Key": "hostname"
}
],
"Encrypted": false,
"VolumeId": "vol-xxx",
"State": "completed",
"VolumeSize": 140,
"StartTime": "2018-09-22T08:39:58.000Z",
"Progress": "100%",
"OwnerId": "345634563456",
"SnapshotId": "snap-xxx"
}
}
我如何在 Ansible 中查询此 JSON 以获得主机名和设备的最新快照?我不经常这样做,所以对查询语法很纠结。
到目前为止,我有以下内容。
- shell: "aws ec2 describe-snapshots"
register: snap
delegate_to: localhost
- debug:
msg: "{{ snap.stdout | from_json | json_query(query) }}"
vars:
query: "Snapshots[].Tags[?Key=='hostname'].Value"
但是我如何 select 所有快照元素,其中 Tags.Value 等于某个值,其中 Key 是“主机名”?然后我如何 select 我得到的列表中的最新信息?
根据the fine manual,JMESPath 支持嵌套括号说明符表达式:
vars:
snap: |
{
"Snapshots": [
{"Id": "aaa", "Tags": [{"Key": "hostname", "Value": "alpha"}]},
{"Id": "bbb", "Tags": [{"Key": "hostname", "Value": "beta"}]}
]
}
jq: "Snapshots[? Tags[? Key=='hostname' && Value=='alpha']].Id"
tasks:
- debug:
msg: "{{ snap | from_json | json_query(jq) }}"
至于 "for a certain host" 部分,vars: query:
就像所有其他 ansible 字符串一样受制于 jinja2 插值,因此:
vars:
query: ... [? Value=='{{ the_hostname }}' ] ...
请小心确保值被正确转义——这可能不会成为主机名的问题,但我的意思是通常。
然后,至于 "newest from the list" 部分,ISO8601 具有按字典顺序排序的非常令人愉悦的附带好处,因此:
vars:
jq: "Snapshots[? Tags[? Key=='hostname' && Value=='alpha']]"
tasks:
- debug:
msg: "{{ snap | from_json | json_query(jq) | sort(attribute='StartTime', reverse=True) }}"
我正在尝试使用 aws ec2
命令在 AWS 中查找设备和主机的最新快照。我从 aws ec2 describe-snapshots
.
如您所见,我可以为同一个主机(请参阅带有密钥主机名和设备名的标签)和设备创建多个快照。开始时间不同。
{
"Snapshots": [
{
"Description": "My desc.",
"Encrypted": false,
"VolumeId": "vol-aaa",
"State": "completed",
"VolumeSize": 8,
"StartTime": "2018-02-02T19:27:56.000Z",
"Progress": "100%",
"OwnerId": "5674567",
"SnapshotId": "snap-xxx"
},
{
"Description": "host1.domain.com - sdc",
"Tags": [
{
"Value": "SNAP1",
"Key": "Name"
},
{
"Value": "sdc",
"Key": "devicename"
},
{
"Value": "host1.domain.com",
"Key": "hostname"
}
],
"Encrypted": false,
"VolumeId": "vol-xxx",
"State": "completed",
"VolumeSize": 140,
"StartTime": "2018-09-21T08:39:58.000Z",
"Progress": "100%",
"OwnerId": "345634563456",
"SnapshotId": "snap-xxx"
},
{
"Description": "host1.domain.com - sdc",
"Tags": [
{
"Value": "SNAP2",
"Key": "Name"
},
{
"Value": "sdc",
"Key": "devicename"
},
{
"Value": "host1.domain.com",
"Key": "hostname"
}
],
"Encrypted": false,
"VolumeId": "vol-xxx",
"State": "completed",
"VolumeSize": 140,
"StartTime": "2018-09-22T08:39:58.000Z",
"Progress": "100%",
"OwnerId": "345634563456",
"SnapshotId": "snap-xxx"
}
}
我如何在 Ansible 中查询此 JSON 以获得主机名和设备的最新快照?我不经常这样做,所以对查询语法很纠结。
到目前为止,我有以下内容。
- shell: "aws ec2 describe-snapshots"
register: snap
delegate_to: localhost
- debug:
msg: "{{ snap.stdout | from_json | json_query(query) }}"
vars:
query: "Snapshots[].Tags[?Key=='hostname'].Value"
但是我如何 select 所有快照元素,其中 Tags.Value 等于某个值,其中 Key 是“主机名”?然后我如何 select 我得到的列表中的最新信息?
根据the fine manual,JMESPath 支持嵌套括号说明符表达式:
vars:
snap: |
{
"Snapshots": [
{"Id": "aaa", "Tags": [{"Key": "hostname", "Value": "alpha"}]},
{"Id": "bbb", "Tags": [{"Key": "hostname", "Value": "beta"}]}
]
}
jq: "Snapshots[? Tags[? Key=='hostname' && Value=='alpha']].Id"
tasks:
- debug:
msg: "{{ snap | from_json | json_query(jq) }}"
至于 "for a certain host" 部分,vars: query:
就像所有其他 ansible 字符串一样受制于 jinja2 插值,因此:
vars:
query: ... [? Value=='{{ the_hostname }}' ] ...
请小心确保值被正确转义——这可能不会成为主机名的问题,但我的意思是通常。
然后,至于 "newest from the list" 部分,ISO8601 具有按字典顺序排序的非常令人愉悦的附带好处,因此:
vars:
jq: "Snapshots[? Tags[? Key=='hostname' && Value=='alpha']]"
tasks:
- debug:
msg: "{{ snap | from_json | json_query(jq) | sort(attribute='StartTime', reverse=True) }}"