【发布时间】: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