Ansible解析json,其中几个键具有相同的名称,并且指向一个列表变量

dsa*_*don 5 json ansible ansible-playbook

我有一个问题使用ansible解析json我有一个连接到rancher的任务并获取json文件

任务:

- uri:
    url: http://rancher.local:8080/v1/hosts
    method: GET
    user: ##################
    password: ################
    body_format: json
  register: hosts_json

- name: test
  set_fact:
    rancher_env_hosts: "{{ item.hostname }}"
  #when: item.hostname == "*-i-*"
  with_items: "{{hosts_json.json.data}}"

- name: output
  debug:
    msg: "hosts: {{rancher_env_hosts}}"
Run Code Online (Sandbox Code Playgroud)

我得到以下json(在对其进行编辑以使其更具可读性之后):

{
    "json": {
        "data": [
            {
                "hostname": "rancher-i-host-02",
                "id": "adsfsa"
            },
            {
                "hostname": "rancher-i-host-01",
                "id": "gfdgfdg"
            },
            {
                "hostname": "rancher-q-host-01",
                "id": "dfgdg"
            },
            {
                "hostname": "rancher-q-host-02",
                "id": "dfgdg"
            }
        ]

    }

}
Run Code Online (Sandbox Code Playgroud)

当我启动剧本时,我仅获得变量中的最后一个主机名,而不是所有主机名列表。我可以将所有列表注册到同一变量吗?

另外,我还添加了带有注释“#”的行,以便仅获取与字符串“ -i-”位匹配的主机名,这是行不通的。任何的想法?

Kon*_*rov 8

这是过滤器(和this)用于:

- set_fact:
    hosts_all: "{{ hosts_json.json.data | map(attribute='hostname') | list }}"
    hosts_i: "{{ hosts_json.json.data | map(attribute='hostname') | map('regex_search','.*-i-.*') | select('string') | list }}"
Run Code Online (Sandbox Code Playgroud)

host_all将包含所有主机名,host_i将只包含.*-i-.*匹配的主机名。