首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ansible:从JSON响应创建变量

Ansible:从JSON响应创建变量
EN

Stack Overflow用户
提问于 2017-12-14 01:21:37
回答 2查看 2.2K关注 0票数 2

我正在努力理解如何将响应从一个uri调用传递到另一个uri调用。我正在为我的存储系统创建一个剧本。对于自定义报头"X-HP3PAR-WSAPI- SessionKey“中传递的所有REST调用,它需要一个SessionKey。

初始身份验证REST调用成功,我看到了SessionKey。我无法将SessionKey传递给随后的调用。

有什么建议吗?

代码语言:javascript
复制
---
- name: Connect to 3par
  hosts: localhost
  become: no

  vars:
    auth_3par_user: "3paruser"
    auth_3par_password: "3parpass"
    ip_address_3par: 1.1.1.1
    rest_api_url_3par: "https://{{ ip_address_3par }}:8080/api/v1"

  tasks:
    - name: check if 3par WSAPI is running
      uri:
        url: "{{ rest_api_url_3par }}/credentials"
        force_basic_auth: yes
        method: POST
        HEADER_Content-Type: application/json
        body_format: json
        body: "{ 'user': '{{ auth_3par_user }}', 'password': '{{ auth_3par_password }}' }"
        status_code: 201
        return_content: yes
        validate_certs: no
      register: output

    - name: Parsing key
      debug:
        msg: "{{ output.json.key }}"

    - name: GET 3par volumes
      uri:
        url: "{{ rest_api_url_3par }}/volumes"
        method: GET
        HEADER_Content-Type: "application/json"
        headers:
          "X-HP3PAR-WSAPI-SessionKey": "{{ output.json.key }}"
        status_code: 200
        return_content: yes
        validate_certs: no
      register: volume_output

    - name: Parsing Volumes GET
      debug:
        var={{ volume_output.stdout | from_json }}
代码语言:javascript
复制
TASK [Parsing key]     *************************************************************
task path: /home/chris/ansible/ansible_3par/playbooks/connect_3par.yml:26
ok: [localhost] => {
    "msg": "0-f150f34f975693b3c95efa84b13bd605-00cc315a"
}

TASK [check if 3par WSAPI is running] ******************************************
task path: /home/chris/ansible/ansible_3par/playbooks/connect_3par.yml:30
ESTABLISH LOCAL CONNECTION FOR USER: chris
127.0.0.1 EXEC ( umask 22 && mkdir -p "$( echo $HOME/.ansible/tmp/ansible-tmp-1513213268.76-220322452758647 )" && echo "$( echo $HOME/.ansible/tmp/ansible-tmp-1513213268.76-220322452758647 )" )
127.0.0.1 PUT /tmp/tmpgOtWjh TO /home/chris/.ansible/tmp/ansible-tmp-1513213268.76-220322452758647/uri
127.0.0.1 EXEC LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 /usr/bin/python /home/chris/.ansible/tmp/ansible-tmp-1513213268.76-220322452758647/uri; rm -rf "/home/chris/.ansible/tmp/ansible-tmp-1513213268.76-220322452758647/" > /dev/null 2>&1
fatal: [localhost]: FAILED! => {"changed": false, "connection": "close", "content": "{\"code\":6,\"desc\":\"invalid session key\"}", 

非标版本2.0.0.2

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-14 05:35:27

您正在为uri模块中的标头混合新旧语法。

当您使用过时的Anble2.0版本时,headers参数将被完全忽略。

升级到当前的Ansible版本。

供参考:

  • 如果使用Ansible < 2.1使用HEADER_*定义所有标头,
  • 如果使用Ansible >= 2.1,请在headers下定义所有标头。
票数 0
EN

Stack Overflow用户

发布于 2017-12-16 05:13:58

在修复标头并将Ansible更新为最新版本后,将修正后的功能代码发布以供参考。

代码语言:javascript
复制
---
- name: Connect to 3par
  hosts: localhost
  become: no

  vars:
    auth_3par_user: "3paruser"
    auth_3par_password: "3parpass"
    ip_address_3par: 1.1.1.1
    rest_api_url_3par: "https://{{ ip_address_3par }}:8080/api/v1"

  tasks:
    - name: check if 3par WSAPI is running
      uri:
        url: "{{ rest_api_url_3par }}/credentials"
        method: POST
        headers:
          Content-Type: "application/json"
        body_format: json
        body: "{ 'user': '{{ auth_3par_user }}', 'password': '{{ auth_3par_password }}' }"
        status_code: 201
        return_content: yes
        validate_certs: no
      register: output

    - name: Parsing key
      debug:
        msg: "{{ output.json.key }}"

    - name: GET 3par volumes
      uri:
        url: "{{ rest_api_url_3par }}/volumes"
        method: GET
        headers:
          Content-Type: "application/json"
          X-HP3PAR-WSAPI-SessionKey: "{{ output.json.key }}"
          Accept: "application/json"
        status_code: 200
        return_content: yes
        validate_certs: no
      register: volume_output

    - name: Parsing Volumes GET
      debug:
        msg: "{{ volume_output }}"enter code here
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47804527

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档