Philip Shangguan
Philip Shangguan

Reputation: 527

Retrieve from a list of directory in Ansible

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

Answers (1)

Vladimir Botka
Vladimir Botka

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

Related Questions