Reputation: 527
I have some disk snapshots in GCP and I can get them in a list:
snap_list:
- name: s-1-data-2022-01-01
- name: s-1-data-2022-02-01
- name: s-1-data-2022-03-01
- name: s-2-data-2022-01-01
- name: s-2-data-2022-02-01
- name: s-2-data-2022-03-01
- name: s-3-data-2022-01-01
- name: s-3-data-2022-02-01
- name: s-3-data-2022-03-01
s-1, s-2 and s-3 are servers.
I want to create a Ansible playbook that will retrieve the latest snapshot(from 2022-03-01) for each server and then create the disk with that snapshot, then attach to the server.
How do I pick up the latest snapshot for each server from the snap_list?
Upvotes: 1
Views: 99
Reputation: 68084
Q: "Retrieve the latest snapshot for each server."
A: For example, declare the variables below as appropriate
_snap_lst: "{{ snap_list|
zip(_srv_date)|
map('flatten')|
map('combine')|list }}"
_srv_date: "{{ snap_list|
map(attribute='name')|
map('regex_replace', _regex, _replace)|
map('from_yaml')|list }}"
_regex: '^(.*)-data-(.*)$'
_replace: '{"server": "\1", "date": "\2"}'
gives
_snap_lst:
- {date: '2022-01-01', name: s-1-data-2022-01-01, server: s-1}
- {date: '2022-02-01', name: s-1-data-2022-02-01, server: s-1}
- {date: '2022-03-01', name: s-1-data-2022-03-01, server: s-1}
- {date: '2022-01-01', name: s-2-data-2022-01-01, server: s-2}
- {date: '2022-02-01', name: s-2-data-2022-02-01, server: s-2}
- {date: '2022-03-01', name: s-2-data-2022-03-01, server: s-2}
- {date: '2022-01-01', name: s-3-data-2022-01-01, server: s-3}
- {date: '2022-02-01', name: s-3-data-2022-02-01, server: s-3}
- {date: '2022-03-01', name: s-3-data-2022-03-01, server: s-3}
Then, grupby the attribute server and, in the loop, sort by the attribute date
- debug:
msg: "server: {{ item.0 }}, snapshot: {{ _latest.name }}"
loop: "{{ _snap_lst|groupby('server') }}"
vars:
_latest: "{{ item.1|sort(attribute='date')|last }}"
gives (abridged)
msg: 'server: s-1, snapshot: s-1-data-2022-03-01'
msg: 'server: s-2, snapshot: s-2-data-2022-03-01'
msg: 'server: s-3, snapshot: s-3-data-2022-03-01'
Upvotes: 1