ansible 使用多个与一个列表变量同名的键来解析 json

问题描述 投票:0回答:2

我在使用 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}}"

我得到以下 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"
            }
        ]

    }

}

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

此外,我还添加了一行注释“#”,以便仅获取与字符串“-i-”匹配的主机名,但它不起作用。有什么想法吗?

json ansible
2个回答
8
投票

这就是 filters(和 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 }}"

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


5
投票

试试这个

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

- name: init fact
  set_fact:
    rancher_env_hosts: []

- name: test
  set_fact:
    rancher_env_hosts: "{{ rancher_env_hosts + [item.hostname] }}"
  when: item.hostname | search(".*-i-.*")
  with_items: "{{hosts_json.json.data}}"

- name: output
  debug:
    msg: "hosts: {{rancher_env_hosts}}"

关于

search
您可以在这里阅读http://docs.ansible.com/ansible/playbooks_tests.html

更新:
关于向数组添加值:Is it possible to set afact of a list in Ansible?

© www.soinside.com 2019 - 2024. All rights reserved.