如何在 Ansible 中按属性对列表进行排序?

Phi*_*uan 2 ansible

我有一个字符串列表以及与每个字符串关联的日期。我想按日期对列表进行排序并选取最新的字符串。

这是代码:

- debug: msg="{{ sort_list }}"

- debug: msg="{{_latest.snap_name }}"
  loop: "{{ sort_list }}"
    vars:
      _latest: "{{ item | sort(attribute='date')|last }}"
Run Code Online (Sandbox Code Playgroud)

输出是:

ok: [localhost] => {
    "msg": [
        {
            "date": "20220602020004",
            "snap_name": "aaa-bbb-ccc-data-sb-20220602020004"
        },
        {
            "date": "20220603020004",
            "snap_name": "aaa-bbb-ccc-data-sb-20220603020004"
        },
        {
            "date": "20220604020004",
            "snap_name": "aaa-bbb-ccc-data-sb-20220604020004"
        }
    ]
}

TASK [debug] *****************************************************
Sunday 05 June 2022  18:22:30 +0000 (0:00:00.055)       0:00:04.777 *********** 
fatal: [localhost]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: {{ item | sort(attribute='date')|last }}: 'ansible.utils.unsafe_proxy.AnsibleUnsafeText object' has no attribute 'date'\n\nThe error appears to be in '/home/philip.shangguan/code/devops/google/ansible/test-scripts/philip/prodcopy/a.yml': line 128, column 9, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n      - debug: msg=\"{{_latest.snap_name }}\"\n        ^ here\nWe could be wrong, but this one looks like it might be an issue with\nmissing quotes. Always quote template expression brackets when they\nstart a value. For instance:\n\n    with_items:\n      - {{ foo }}\n\nShould be written as:\n\n    with_items:\n      - \"{{ foo }}\"\n"}
Run Code Online (Sandbox Code Playgroud)

第一次调试给出了列表。然后我想选取zzz-wag-chicken-data-sb-20220604020004具有最新的字符串date

我的代码中第二个缺少/错误是什么debug

flo*_*ong 6

sort当您想要做的只是将列表传递给 时,您将循环整个列表,然后将单个项目传递给sort

      - debug:
          msg: "{{ _latest.snap_name }}"
        vars:
          _latest: "{{ sort_list | sort(attribute='date') | last }}"
Run Code Online (Sandbox Code Playgroud)

您也可以在没有中间变量的情况下执行此操作:

      - debug:
          msg: "{{ (sort_list | sort(attribute='date') | last).snap_name }}"
Run Code Online (Sandbox Code Playgroud)