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

Posted

技术标签:

【中文标题】如何在 Ansible uri 模块的 json 字符串中使用变量?【英文标题】:How to use variable inside json string in Ansible uri module? 【发布时间】:2018-11-11 14:03:33 【问题描述】:

在 ubuntu 16.10 上使用 ansible 2.5.3。

我需要在 Ansible uri 模块的主体标签的 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 致命的:[本地主机]:失败! => "changed": false, "content": "", "msg": "状态码是 -1 而不是 [200]: 发生未知错误:unhashable type", "redirected": false, "status" : -1, "url": "https://webapp/api/orgs"

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

body: "\"name\": \"SAMPLE_PROJECT\""

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

body: " \"name\": \" project_name \" "

?

【问题讨论】:

【参考方案1】:

json设置为body_format参数内的body type:

- 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 认为它是一个字符串。见the answers here。

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

【讨论】:

感谢您的回答 - 这让我发疯了!【参考方案2】:

Ansible 会自动将 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

【讨论】:

以上是关于如何在 Ansible uri 模块的 json 字符串中使用变量?的主要内容,如果未能解决你的问题,请参考以下文章

使用URI和XML模块进行Ansible变量赋值

Ansible:从JSON响应创建变量

使用Ansible从Json输出中提取数据

如何在ansible中将字典或列表转换为字符串

ansible核心模块playbook介绍

如何利用ansible callback插件对执行结果进行解析