通过AAP API向清单添加带变量新主机遇错误,求正确方法
通过Ansible URI模块调用AAP REST API创建带变量的主机的正确方法
核心问题:AAP的inventories/{id}/hosts/接口要求variables字段的值是JSON或YAML格式的字符串,而非直接传入字典结构。你的第一种写法直接传了字典,被body_format: json序列化为JSON对象,不符合API对字段类型的要求,因此报错。
之前三种写法的错误原因
- 第一种写法:
variables传入字典后,请求体中会变成{"variables": {"ansible_host": "192.168.0.1"}},但API期望variables是字符串类型(比如"{\"ansible_host\": \"192.168.0.1\"}"),因此提示“Not a valid string”。 - 第二种写法:直接在body中写
ansible_host不属于API的合法字段,因此变量未被添加;POST请求成功创建资源的标准HTTP状态码是201,你指定了200,所以任务报错,但主机实际已创建。 - 第三种写法:
ansible_host=192.168.0.1既不是合法JSON也不是YAML格式,导致API解析失败。
正确实现方式
以下两种方法都可以满足API要求,同时修正状态码为标准的201:
方法1:用JSON字符串传递变量
使用Ansible的to_json过滤器将变量字典序列化为字符串:
- name: Add new host with JSON variables ansible.builtin.uri: url: "https://{{ aap_fqdn }}/api/v2/inventories/{{ inventory }}/hosts/" user: '{{ user }}' password: '{{ pass }}' method: POST body: name: "host_1" variables: "{{ {'ansible_host': '192.168.0.1'} | to_json }}" force_basic_auth: yes status_code: 201 body_format: json validate_certs: no
方法2:用YAML字符串传递变量
使用to_yaml过滤器生成合法的YAML格式字符串:
- name: Add new host with YAML variables ansible.builtin.uri: url: "https://{{ aap_fqdn }}/api/v2/inventories/{{ inventory }}/hosts/" user: '{{ user }}' password: '{{ pass }}' method: POST body: name: "host_1" variables: "{{ {'ansible_host': '192.168.0.1'} | to_yaml }}" force_basic_auth: yes status_code: 201 body_format: json validate_certs: no
如果是固定变量,也可以直接写字符串形式的JSON/YAML:
# 直接写JSON字符串 variables: '{"ansible_host": "192.168.0.1"}' # 或者直接写YAML字符串 variables: "ansible_host: 192.168.0.1"
内容的提问来源于stack exchange,提问作者jeremywat
相关产品推荐
相关产品推荐

