Ansible uri模块中HTTP LIST方法的Python等效实现及使用问题
实现自定义HTTP LIST方法的Python调用
问题背景
Ansible的ansible.builtin.uri模块支持直接指定自定义HTTP方法(比如LIST),但Python的requests库仅为标准HTTP方法提供了快捷调用(如requests.get()、requests.post()),直接使用requests.list()会报错“list不是请求方法”。
解决方案
对于自定义HTTP方法,可通过requests的通用request()方法实现,或者使用更底层的HTTP客户端库发送请求。
方法1:使用requests.request()(推荐)
requests.request()方法支持传入任意自定义HTTP方法名称,完全匹配Ansible uri模块的逻辑:
import requests # 替换为实际的Vault URL vault_url = "https://your-vault-url" # 发送LIST请求,对应Ansible中的配置 response = requests.request( method='LIST', url=vault_url, headers={'Content-Type': 'application/json'} # 对应body_format: json ) # 模拟Ansible的register变量,存储响应结果 list_url = { 'content': response.text, 'json': response.json(), 'status_code': response.status_code }
如果需要处理认证(比如Vault的Token),只需添加headers参数:
response = requests.request( method='LIST', url=vault_url, headers={ 'Content-Type': 'application/json', 'X-Vault-Token': 'your-vault-token' } )
方法2:使用urllib3(底层实现)
如果需要更精细化的控制,可使用urllib3直接发送请求:
import urllib3 import json http = urllib3.PoolManager() response = http.request( 'LIST', vault_url, headers={'Content-Type': 'application/json'} ) # 解析响应内容 list_content = response.data.decode('utf-8') list_json = json.loads(list_content)
关键说明
- Ansible的
uri模块本质上封装了底层HTTP客户端,天然支持自定义方法;而requests的快捷函数仅覆盖标准HTTP方法,通用request()方法才是处理自定义方法的正确方式。 - Ansible中的
body_format: json对应Python中设置Content-Type: application/json请求头,若需要发送JSON体,可添加json={"param": "value"}参数。
内容的提问来源于stack exchange,提问作者Sukh
相关产品推荐
相关产品推荐

