【问题标题】:How to retrieve values from json response of a CURL request when using ansible command module?使用ansible命令模块时如何从CURL请求的json响应中检索值?
【发布时间】:2021-02-28 15:41:53
【问题描述】:

我正在使用 Ansible 来测试一些 API。我没有使用 ansible 的 get_url 或 uri 模块,而是使用带有命令/shell 模块的 Curl 请求。

我需要从 curl api 调用的 json 响应中提取一个特定值,以便我可以在下一个 curl 请求中使用该值。

例如,

- name: Run a curl request to login and get jwt token
  command:  curl -k -X POST -H "Content-Type:application/json" --data '{"user":"{{username}}","password":"{{password}}"}' https://localhost:8001/api/v1/login
  register: login_response

- name: Print the jwt response
  debug:
    var: login_response.stdout  

- name: Run a curl request to get service token
  command:  curl -k -X GET -H "Accept:application/json" -H "Authorization:Bearer {{login_response.stdout.jwt}}" https://localhost:8001/api/v1/servicetoken/issue
  register: service_token

- name: Print service token
  debug:
    var: service_token.stdout

上面的 ansible playbook 将在第三个任务中失败,因为它找不到像这样的变量:

login_response.stdout.jwt

通常,第二个任务中的变量,即 login_response.stdout 将打印如下内容:

ok: [localhost] => {
    "login_response.stdout": {
        "jwt": "eyJhbGciOiJIUzUxMiIsImtpZCI6ImFiNmU0ZDg2LWE4YzgtNDU4OS04MmRiLWIxZTg1YzQwNDNlZiJ9.eyJleHAiOjE2MDU2MTIxODAuNjA5MTI1NCwiaWF0IjoxNjA1NjExODgwLjYwOTEyMC42MDkxMjU0fQ.ZC4a3H3j03ZmzDkjGj11cvxSls2qXZmVOGuIvKp8LHVpYOUyEJlWJJOTArHxKhxne3DsuqWoGpslR6KxuUOBFg",
        "roles": [
            {
                "name": "Admin"
            }
        ]
    }
}

我想要的是从上述响应中提取该 jwt 令牌并在第三个任务中使用它。

我怎样才能做到这一点?

【问题讨论】:

  • 您的场景中的uri 模块有什么问题?
  • @Zeitounator 我在尝试使用 uri 模块时遇到这样的错误:The error was: NetrcParseError: ~/.netrc file owner (Muser) does not match current user (root) (/home/Muser/.netrc, line 3)
  • 为什么你需要 root 才能请求 API ? become: false 在播放或此特定任务上应该可以解决该问题。
  • @Zeitounator 非常感谢您的修复.... 到目前为止,我正在本地机器上测试剧本。这就是发生此错误的时间。实际上,这些任务是另一个剧本的一部分,该剧本被制作为以 root 用户身份在远程主机中执行。这就是为什么请求默认来自 root 用户的原因!

标签: json shell curl ansible extract


【解决方案1】:

我找到了答案!

这可以使用 from_json 过滤器来实现,以使 ansible 能够访问 json 字段。

现在工作手册应该是这样的:

- name: Run a curl request to login and get jwt token
  command:  curl -k -X POST -H "Content-Type:application/json" --data '{"user":"{{username}}","password":"{{password}}"}' https://localhost:8001/api/v1/login
  register: login_response

- name: Print the jwt token
  debug:
    var: (login_response.stdout|from_json).jwt   

- name: Run a curl request to get service token
  command:  curl -k -X GET -H "Accept:application/json" -H "Authorization:Bearer {{(login_response.stdout|from_json).jwt}}" https://localhost:8001/api/v1/servicetoken/issue
  register: service_token

- name: Print service token
  debug:
    var: (service_token.stdout|from_json).token

我在这里参考了这个想法:https://medium.com/@justinhennessy/parsing-json-with-ansible-bcbb8d4b6a54

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-01
    • 1970-01-01
    • 2017-12-03
    • 2020-09-02
    • 2022-11-20
    • 1970-01-01
    • 2022-10-13
    • 2023-02-04
    相关资源
    最近更新 更多