ansible parse json 具有多个具有相同名称的键到一个列表变量
ansible parse json with several keys with the same name to one list variable
我在使用 ansible 解析 json 时遇到问题
我有一个任务连接到牧场主并获得一个 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-”匹配的主机名,但它不起作用。有什么想法吗?
试试这个
- 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 a fact of an array in Ansible?
- 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-.*
匹配的主机名。
我在使用 ansible 解析 json 时遇到问题 我有一个任务连接到牧场主并获得一个 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-”匹配的主机名,但它不起作用。有什么想法吗?
试试这个
- 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 a fact of an array in Ansible?
- 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-.*
匹配的主机名。