JSON-запрос для поиска новейшего снимка для хоста и устройства?
Я пытаюсь найти новейший снимок для устройства и хоста в AWS с помощью aws ec2
команда. Я получаю следующий вывод от aws ec2 describe-snapshots
,
Как видите, у меня может быть несколько снимков для одного и того же хоста (см. Теги с ключами hostname и devicename) и устройства. Время начала отличается.
{
"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"
}
}
Как бы я запросил этот JSON в Ansible, чтобы получить новейший снимок для имени хоста и устройства? Я делаю это не часто, поэтому бьюсь над синтаксисом запроса.
До сих пор у меня есть следующее.
- 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"
Но как мне выбрать все элементы снимка, где Tags.Value равно определенному значению, где Key это "имя хоста"? И как мне выбрать самый новый из списка, который я получу?
1 ответ
Согласно прекрасному руководству, 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) }}"
Что касается "для определенного хоста", что vars: query:
подвергается интерполяции jinja2, как и любая другая строка, поэтому:
vars:
query: ... [? Value=='{{ the_hostname }}' ] ...
Просто будьте осторожны, чтобы убедиться, что значение правильно экранировано - что, скорее всего, не будет проблемой для имени хоста, но я имею в виду в целом.
Затем, что касается "самой новой из списка", ISO8601 имеет очень приятное побочное преимущество лексиграфической сортировки, поэтому:
vars:
jq: "Snapshots[? Tags[? Key=='hostname' && Value=='alpha']]"
tasks:
- debug:
msg: "{{ snap | from_json | json_query(jq) | sort(attribute='StartTime', reverse=True) }}"