来自 ansible 输出字典的唯一值

Unique values from ansible output dict's

我有一些服务器有很多wordpress实例,我问他们有什么版本。

- name: CONTADOR WP VERSIONES
shell: mycommand 
register: wp_versions 

- debug: msg: "{{ wp_versions.stdout_lines }}"

例如:

    TASK [debug] *********************************************************************
    ok: [server1] => {
        "msg": [
            "5.1.13"
        ]
    }
    ok: [server2] => {
        "msg": [
            "5.1.12",
            "5.1.13"
        ]
    }
    ok: [server3] => {
        "msg": [
            "5.1.10",
            "5.1.13",
        ]
    }

我需要像这样列出一个唯一值:

"msg": [
    "5.1.10",
    "5.1.12",
    "5.1.13",
]

我已经尝试了我发现的所有方法,但没有任何效果。

谢谢

你可以这样做:

- hosts: all
  gather_facts: false
  tasks:
    - name: CONTADOR WP VERSIONES
      shell: mycommand
      register: wp_versions

- hosts: localhost
  gather_facts: false
  tasks:
    # This tasks builds a flattened list of all the
    # wp_versions.stdout_lines values collected from your hosts.
    - name: Collect wp_versions information
      set_fact:
        all_wp_versions_pre: "{{ all_wp_versions_pre + hostvars[item].wp_versions.stdout_lines }}"
      loop: "{{ groups.all }}"
      vars:
        all_wp_versions_pre: []

    # Here we use the `unique` filter to produce a list of
    # unique versions.
    - name: Set all_wp_versions fact
      set_fact:
        all_wp_versions: "{{ all_wp_versions_pre|unique }}"

    - debug:
        var: all_wp_versions

根据您的示例,这将产生以下输出:

TASK [debug] ********************************************************************************************
ok: [localhost] => {
    "all_wp_versions": [
        "5.1.13",
        "5.1.12",
        "5.1.10"
    ]
}

使用 special variable ansible_play_hosts and extract 来自 hostvars

的变量
    - set_fact:
        all_vers: "{{ ansible_play_hosts|
                      map('extract', hostvars, ['wp_versions', 'stdout_lines'])|
                      flatten|unique }}"
      run_once: true

给予

all_vers:
  - 5.1.13
  - 5.1.12
  - 5.1.10