首页 文章

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

提问于
浏览
0

在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 回答

  • 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对象(使用纯字符串时不会发生) .

    琐事:你仍然可以通过在第一个{之前添加空格来欺骗Ansible认为它是一个字符串 . 在这里查看答案 .

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

相关问题