web-dev-qa-db-ja.com

JSON出力のAnsible解析

「vchosts」と呼ばれるレジスタにJSOn出力を取得するためにURIを使用しています

TASK [debug] *************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "vchosts": {
        "changed": false,
        "msg": "All items completed",
        "results": [
            {
                "_ansible_ignore_errors": null,
                "_ansible_item_result": true,
                "_ansible_no_log": false,
                "_ansible_parsed": true,
                "changed": false,
                "connection": "close",
                "content_type": "application/json",
                "cookies": {},
                "date": "Mon, 11 Jun 2018 09:50:45 GMT",
                "failed": false,
                "invocation": {
                    "module_args": {
                        "attributes": null,
                        "backup": null,
                        "body": null,
                        "body_format": "raw",
                        "client_cert": null,
                        "client_key": null,
                        "content": null,
                        "creates": null,
                        "delimiter": null,
                        "dest": null,
                        "directory_mode": null,
                        "follow": false,
                        "follow_redirects": "safe",
                        "force": false,
                        "force_basic_auth": true,
                        "group": null,
                        "headers": {
                            "Cookie": "vmware-api-session-id=56fa6d3015150212b086917d15165bee;Path=/rest;Secure;HttpOnly"
                        },
                        "http_agent": "ansible-httpget",
                        "method": "GET",
                        "mode": null,
                        "owner": null,
                        "regexp": null,
                        "remote_src": null,
                        "removes": null,
                        "return_content": false,
                        "selevel": null,
                        "serole": null,
                        "setype": null,
                        "seuser": null,
                        "src": null,
                        "status_code": [
                            200
                        ],
                        "timeout": 30,
                        "unsafe_writes": null,
                        "url": "https://vcenter01.lab.test/rest/vcenter/host?filter.clusters=domain-c310",
                        "url_password": null,
                        "url_username": null,
                        "use_proxy": true,
                        "validate_certs": false
                    }
                },
                "item": {
                    "cluster": "domain-c310",
                    "drs_enabled": true,
                    "ha_enabled": false,
                    "name": "DB-CLUSTER"
                },
                "json": {
                    "value": [
                        {
                            "connection_state": "CONNECTED",
                            "Host": "Host-312",
                            "name": "vmh19.lab.test",
                            "power_state": "POWERED_ON"
                        },
                        {
                            "connection_state": "CONNECTED",
                            "Host": "Host-313",
                            "name": "vmh20.lab.test",
                            "power_state": "POWERED_ON"
                        }
                    ]
                },
                "msg": "OK (unknown bytes)",
                "redirected": false,
                "status": 200,
                "url": "https://vcenter01.lab.test/rest/vcenter/host?filter.clusters=domain-c310"
            }
        ]
    }
}

完全なJSONから、私は値が必要です:

"name": "vmh20.lab.test" "name": "vmh19.lab.test"

この出力は、クラスターサイズに応じて、クラスター内の任意の数のホストを提供できます。

これらの値をタスクのホスト名のエントリとして使用したいと思います。

 - name: Modify root local user to ESXi
    vmware_local_user_manager:
      hostname: '{{ item.results.json.value.name }}'
      username: root
      password: '{{ esxi_pass }}'
      local_user_name: root
      local_user_password: '{{ esxi_new_pass }}'
      validate_certs: False
    with_items:
    -  "{{ vchosts }}"

しかし、それはエラーのようには機能しません:

TASK [Modify root local user to ESXi] **********************************************************************************************************************************************************************
fatal: [localhost]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'list object' has no attribute 'json'\n\nThe error appears to have been in '/Users/jv/Workspace/vmware-powershell/ansible/site.yml': line 90, column 5, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n  - name: Modify root local user to ESXi\n    ^ here\n"}

私が試したデバッグを使用してもう少し調査する

  - debug:
    var: item.json.value.name
    with_items:
    -  "{{ vchosts.results }}"

しかし、出力は

TASK [debug] ***********************************************************************************************************************************************************************************************
ok: [localhost] => (item=None) => {
    "msg": "Hello world!"
}

私も試しました:

 - debug:
    var: item.vchosts.results.json.value[*].name
    with_items:
    -  "{{ vchosts }}"

  - debug:
    var: item
    with_items:
    -  "{{ vchosts | json_query('[*].value[*].{name: name}') }}"

以前と同じHelloworldを取得しました。私が最後に試したのは

  - debug:
    var: item.name
    with_items:
    -  "{{ vchosts | json_query('*.value') }}"

そして、Hello worldの代わりに、タスクで空の出力を取得します

TASK [debug] ***********************************************************************************************************************************************************************************************

私はansible2.5.4を使用しています

2
Vidanez

「vmh20.lab.test」と「vmh19.lab.test」という値だけが必要な場合、これは探しているコードではありませんか?

- name: Modify root local user to ESXi
  vmware_local_user_manager:
    hostname: '{{ item }}'
    username: root
    password: '{{ esxi_pass }}'
    local_user_name: root
    local_user_password: '{{ esxi_new_pass }}'
    validate_certs: False
  with_items:
    - vmh20.lab.test
    - vmh19.lab.test
1
Vladimir Botka

なぜこれがわからない

- debug: var=item.name
    with_items:
    -  "{{ vchosts.json.value }}"

と同じではありません

- debug: 
    var: item.name
    with_items:
    -  "{{ vchosts.json.value }}"

実際、それは私を夢中にさせていました、これは確かにこのバージョンのansibleのバグです

問題は、最初のリクエストの要素をJson内のリストとして取得していたため、それらを列挙する必要があることです。

ダーティな「vchosts」JSONを取得しないようにするには、「vcclust」から1つの要素のみを使用する必要があるため、コードは次のように終了します。

 - name: Get vCenter cluster ID for {{ cluster_touched }}
    uri:
      url: "https://{{ vcenter_hostname }}/rest/vcenter/cluster?filter.names={{ cluster_touched }}"
      force_basic_auth: yes
      validate_certs: no
      headers:
        Cookie: '{{ login.set_cookie }}'
    register: vcclust

  - name: Get ESXi nodes from cluster ID for {{ cluster_touched }}
    uri:
      url: "https://{{ vcenter_hostname }}/rest/vcenter/host?filter.clusters={{ vcclust.json.value[0].cluster }}"
      force_basic_auth: yes
      validate_certs: no
      headers:
        Cookie: '{{ login.set_cookie }}'
    register: vchosts

  - name: Modify root local user to ESXi
    vmware_local_user_manager:
      hostname: '{{ item.name }}'
      username: root
      password: '{{ esxi_pass }}'
      local_user_name: root
      local_user_password: '{{ esxi_new_pass }}'
      validate_certs: False
    with_items:
    -  "{{ vchosts.json.value }}"
0
Vidanez