如何从模块结果中提取深度嵌套的值到变量以供以后的任务?

时间:2019-06-06 14:33:14

标签: ansible

在这种情况下,我正在使用uri模块对API部署进行烟雾测试。流程是:

  1. 尝试登录测试用户并捕获JWT令牌
  2. 如果#1无法注册新用户
  3. 如果#2被触发,则模拟点击“验证用户电子邮件”链接
  4. 如果触发#3,则将新的测试用户登录并捕获JWT令牌

在#1或#4中,我想将结果的JWT分配给变量以供以后使用。像这样:

- name: log user in
  uri:
    url: "{{ api_url }}/user"
    method: post
    body_format: json
    body:
      email: "{{ email }}"
      password: "{{ password }}"
  assign: 
    jwt: {{ response.json.data.jwt }}

好像assign是一件事。如果没有它,我可以register: session并在其余的烟雾测试中使用{{ session.json.data.jwt}}一百次,但是如果我可以更改播放范围变量(可能在播放列表的顶部定义),它将变得更加干净

1 个答案:

答案 0 :(得分:0)

答案来自@ matt-p的注释-使用set_fact。谢谢。

我想展示一下这在REST API上的效果。请注意,我们以后如何使用简单的{{ user.email }}从返回的JSON访问密钥,并将JWT令牌与headers: jwt={{ user.jwt }}

一起使用
- name: Login and get JWT session
  uri:
    url: "{{ url }}/users/login"
    body_format: json
    body:
      email: "{{ email }}"
      password: "{{ password }}"
    method: POST
    status_code: [200]
  register: user_login

- name: Assign user variable to user_login results
  set_fact:
    user: "{{ user_login.json.data }}"

- name: Create a post
  uri:
    url: "{{ url }}/users/{{ user.id }}/posts"
    body_format: json
    method: POST
    headers: jwt={{ user.jwt }}
    body:
      content: >
          My name is {{ user.firstName }} and you
          can email me at {{ user.email }}
    status_code: [201]
  register: post_creation