我已经尝试了ansible中的uri模块,但仍然出现401身份验证错误。 在 shell 模块中,当我使用curl 时,一切正常。 有人可以尝试翻译成 uri 代码吗?
- name: Get authentication token
uri:
url: https://myIPcontrol.com:8443/inc-rest/api/v1/login
method: POST
timeout: 30
validate_certs: no
headers:
Content-Type: application/x-www-form-urlencoded
Accept: application/json
body:
username: admin
password: mypsw
body_format: json
return_content: yes
register: authtoken
- name: Get authentication token
shell: "curl -k --header 'Content-Type: application/x-www-form-urlencoded' --header 'Accept:
application/json' -d 'username=admin&password=mypsw' -X POST
https://myIPcontrol.com:8443/inc-rest/api/v1/login"
register: authtoken
通过 shell 执行时,您的主体 (
-d
) 将作为 username=admin&password=mypsw
传递。这个结构是 form-urlencoded
,但您正在传递 body_format: json
,因此 Ansible 将正文作为 {"user":"admin","password":"mypsw"}
传递,与您设置的 Content-Type
标头冲突。
改为使用
body:
username: admin
password: mypsw
body_format: form-urlencoded
其余的对我来说看起来是正确的。 https://docs.ansible.com/ansible/latest/collections/ansible/builtin/uri_module.html
当 API 调用需要身份验证时,请根据 ansible.builtin.uri 模块使用 force_basic_auth 标志,并将其设置为“yes”。当相应的 Web 服务未响应 401 错误响应时,需要执行此操作,这将强制 Ansible 发送身份验证请求。
这是一个例子:
- name: Get repository variables
ansible.builtin.uri:
url: https://api.bitbucket.org/2.0/repositories/SAMPLE_PROJECT/SAMPLE_REPO/commits
method: POST
user: TESTUSER
password: TESTPASSWORD
force_basic_auth: yes
headers:
Accept: application/json
return_content: yes
body_format: json