从输出中传递JSON,以获取另一个查询Ansible

发布于 2025-02-09 14:55:22 字数 2821 浏览 4 评论 0原文

请帮助我弄清楚我怎么了。我从Ansible中获得了JSON并进行过滤,之后我想保存输出并重复使用。但是,不幸的是,我发现此属性不存在。我哪里出错了?

剧本代码:

var:
  query_general: "body.results[].{display_name: display_name, subnets: subnets[]}"
- name: parsing query
  set_fact:  
    myvar: "{{ results | json_query(query_general) }}"
  register: output

- name: qwe
  set_fact: 
    scndjson: "{{ output.myvar[].display_name }}"

- name: print
  debug: 
    msg: "{{ scndjson }}"

我也尝试了JSON_QUERY第二种情况,但这也没有起作用。

寄存器中:输出我有:

[
            {
                "display_name": "1test",
                "subnets": [
                    {
                        "gateway_address": "0.0.0.0/25",
                        "network": "0.0.0.0/25"
                    }
                ]
            },
            {
                "display_name": "test",
                "subnets": [
                    {
                        "gateway_address": "0.0.0.1/25",
                        "network": "0.0.0.1/25"
                    }
                ]
            }
            ]

错误:

该任务包括一个带有未定义变量的选项。

它可以是:outputdisplay_name,etc

upd: 我纠正了YAML,没有错误,但是没有显示数据。

tasks:
   - name: 
     nsxt_rest:
       hostname: anyhost
       username: anyuser 
       password: anypass
       validate_certs: false
       method: get
       path: /policy/api/v1/infra/segments
     register: nsx_results

   - debug: 
         var: nsx_query_general
     vars: 
       nsx_query_general: "{{ nsx_results | json_query('body.results[].{display_name: display_name, subnets: subnets[]}') }}"
     register: output
  
   - debug:
        var: secondjson
     vars: 
       secondjson: "{{ output|json_query('[].display_name') }}"

nsx_query_general输出:

{
    "nsx_query_general": [
        {
            "display_name": "test",
            "subnets": [
                {
                    "gateway_address": "0.0.0.0/25",
                    "network": "0.0.0.0/25"
                }
            ]
        },
        {
            "display_name": "1test",
            "subnets": [
                {
                    "gateway_address": "0.0.0.1/25",
                    "network": "0.0.0.1/25"
                }
            ]
        }]}

secondjson的输出:

{
    "secondjson": "",
    "_ansible_verbose_always": true,
    "_ansible_no_log": false,
    "changed": false
}

Please help me figure out what I'm wrong with. I'm getting a JSON from Ansible and filtering it, after which I want to save the output and reuse it. But, unfortunately, I get an error that this attribute does not exist. Where did I go wrong?

playbook code:

var:
  query_general: "body.results[].{display_name: display_name, subnets: subnets[]}"
- name: parsing query
  set_fact:  
    myvar: "{{ results | json_query(query_general) }}"
  register: output

- name: qwe
  set_fact: 
    scndjson: "{{ output.myvar[].display_name }}"

- name: print
  debug: 
    msg: "{{ scndjson }}"

I tried the json_query second case as well, but that didn't work either.

in register:output i have:

[
            {
                "display_name": "1test",
                "subnets": [
                    {
                        "gateway_address": "0.0.0.0/25",
                        "network": "0.0.0.0/25"
                    }
                ]
            },
            {
                "display_name": "test",
                "subnets": [
                    {
                        "gateway_address": "0.0.0.1/25",
                        "network": "0.0.0.1/25"
                    }
                ]
            }
            ]

error:

The task includes an option with an undefined variable.

it can be: output, display_name, etc

UPD:
I corrected the yaml, there are no errors, but the data is not displayed.

tasks:
   - name: 
     nsxt_rest:
       hostname: anyhost
       username: anyuser 
       password: anypass
       validate_certs: false
       method: get
       path: /policy/api/v1/infra/segments
     register: nsx_results

   - debug: 
         var: nsx_query_general
     vars: 
       nsx_query_general: "{{ nsx_results | json_query('body.results[].{display_name: display_name, subnets: subnets[]}') }}"
     register: output
  
   - debug:
        var: secondjson
     vars: 
       secondjson: "{{ output|json_query('[].display_name') }}"

Output from nsx_query_general:

{
    "nsx_query_general": [
        {
            "display_name": "test",
            "subnets": [
                {
                    "gateway_address": "0.0.0.0/25",
                    "network": "0.0.0.0/25"
                }
            ]
        },
        {
            "display_name": "1test",
            "subnets": [
                {
                    "gateway_address": "0.0.0.1/25",
                    "network": "0.0.0.1/25"
                }
            ]
        }]}

Output from secondjson:

{
    "secondjson": "",
    "_ansible_verbose_always": true,
    "_ansible_no_log": false,
    "changed": false
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

演出会有结束 2025-02-16 14:55:22

给定注册变量 output

output:
  - display_name: 1test
    subnets:
    - gateway_address: 0.0.0.0/25
      network: 0.0.0.0/25
  - display_name: test
    subnets:
    - gateway_address: 0.0.0.1/25
      network: 0.0.0.1/25

使用 json_query

scndjson: "{{ output|json_query('[].display_name') }}"

map 属性

scndjson: "{{ output|map(attribute='display_name')|list }}"

两个声明创建

scndjson: [1test, test]

完整剧本的列表示例

- hosts: localhost
  vars: 
    output:
      - display_name: 1test
        subnets:
        - gateway_address: 0.0.0.0/25
          network: 0.0.0.0/25
      - display_name: test
        subnets:
        - gateway_address: 0.0.0.1/25
          network: 0.0.0.1/25
  tasks:
    - debug:
        var: scndjson
      vars:
        scndjson: "{{ output|json_query('[].display_name') }}"
    - debug:
        var: scndjson
      vars:
        scndjson: "{{ output|map(attribute='display_name')|list }}"

Given the registered variable output

output:
  - display_name: 1test
    subnets:
    - gateway_address: 0.0.0.0/25
      network: 0.0.0.0/25
  - display_name: test
    subnets:
    - gateway_address: 0.0.0.1/25
      network: 0.0.0.1/25

Either use json_query

scndjson: "{{ output|json_query('[].display_name') }}"

, or map attribute

scndjson: "{{ output|map(attribute='display_name')|list }}"

Both declarations create the list

scndjson: [1test, test]

Example of a complete playbook

- hosts: localhost
  vars: 
    output:
      - display_name: 1test
        subnets:
        - gateway_address: 0.0.0.0/25
          network: 0.0.0.0/25
      - display_name: test
        subnets:
        - gateway_address: 0.0.0.1/25
          network: 0.0.0.1/25
  tasks:
    - debug:
        var: scndjson
      vars:
        scndjson: "{{ output|json_query('[].display_name') }}"
    - debug:
        var: scndjson
      vars:
        scndjson: "{{ output|map(attribute='display_name')|list }}"

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文