在ubuntu 16.10上使用ansible 2.5.3 .
我需要在Ansible uri模块的body标签的JSON字符串中包含一个变量 . 我尝试过各种各样的事情 . 我的最新尝试在下面的任务中看起来像这样:
- name: REST POST Example
uri:
url: "{{ webapp_url }}/api/orgs"
method: POST
return_content: yes
body: "{ \"name\": \"{{ project_name }}\" }"
validate_certs: no
user: "{{ user }}"
password: "{{ password }}"
force_basic_auth: yes
headers:
Content-Type: "application/json"
在我的剧本中,我定义了 project_name
变量:
---
- hosts: all
gather_facts: no
vars:
project_name: "SAMPLE_PROJECT"
但是当我运行playbook时, project_name
变量似乎没有正确扩展:
任务执行期间发生异常 . 要查看完整的回溯,请使用-vvv . 错误是:TypeError:unhashable type fatal:[localhost]:FAILED! => {“已更改”:false,“content”:“”,“msg”:“状态代码为-1而不是[200]:发生未知错误:不可用类型”,“重定向”:false,“status” :-1,“url”:“https:// webapp / api / orgs”}
在上面的角色/任务中 . 如果我硬编码身体像:
body: "{\"name\": \"SAMPLE_PROJECT\"}"
它工作正常 . 但我不能这样做,我需要变量 . 有关如何修复的任何建议:
body: "{ \"name\": \"{{ project_name }}\" }"
?
1 回答
将
json
设置为body_format
参数内的主体类型:使用
body: "{\"name\": \"SAMPLE_PROJECT\"}"
时,该值在内部表示为字符串(AnsibleUnicode
) .当您使用
body: "{ \"name\": \"{{ project_name }}\" }"
时,该值将变为字典(dict
),因为它将通过模板引擎,之后输出将映射到Python对象(使用纯字符串时不会发生) .琐事:你仍然可以通过在第一个{之前添加空格来欺骗Ansible认为它是一个字符串 . 在这里查看答案 .
uri
模块默认使用body_format: raw
并且它需要一个字符串,如果它找到一个失败的对象;参考this issue .