如何在Ansible uri模块中使用json字符串中的变量?

时间:2018-06-01 12:17:10

标签: ansible

在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:不可用类型
  致命:[localhost]:失败! => {"更改":false,"内容":""," msg":"状态代码为-1而不是[200]:发生未知错误:不可用类型","重定向":false,"状态":-1," url":&#34 ; https://webapp/api/orgs"}

在上述角色/任务中。如果我硬编码身体像:

body: "{\"name\": \"SAMPLE_PROJECT\"}"

它工作正常。但我不能这样做,我需要变量。有关如何解决的任何建议:

body: "{ \"name\": \"{{ project_name }}\" }"

2 个答案:

答案 0 :(得分:2)

json设置为body_format参数中的正文类型:

- name: REST POST Example
  uri:
    url: "{{ webapp_url }}/api/orgs"
    method: POST
    return_content: yes
    body: "{ \"name\": \"{{ project_name }}\" }"
    body_format: json
    validate_certs: no
    user: "{{ user }}"
    password: "{{ password }}"
    force_basic_auth: yes

当您使用body: "{\"name\": \"SAMPLE_PROJECT\"}"时,该值在内部表示为字符串(AnsibleUnicode)。

当你使用body: "{ \"name\": \"{{ project_name }}\" }"时,该值变为字典(dict),因为它通过模板引擎,之后输出被映射到Python对象(它没有#t; t用简单的字符串发生。)

Trivia:你仍然可以通过在第一个{之前添加一个空格来欺骗Ansible认为它是一个字符串。见the answers here

uri模块默认使用body_format: raw并且它需要一个字符串,如果它找到一个失败的对象;请参阅this issue

答案 1 :(得分:1)

Ansible ca自动将YAML解释为json,我建议使用以下方法:

- name: REST POST Example
  uri:
    url: "{{ webapp_url }}/api/orgs"
    method: POST
    return_content: yes
    body:
      name: "{{ projectname }}"
    body_format: json
    validate_certs: no
    user: "{{ user }}"
    password: "{{ password }}"
    force_basic_auth: yes