Ansible URI模块从变量传递整数

时间:2018-05-01 21:08:39

标签: ansible jinja2

我从前一个收集值(整数)的游戏中设置一个变量,然后使用uri模块在以下任务中调用它以通过API传递它。但我总是得到422错误,说“值应该是整数”。

- name: Deploy Staging Blueprint
local_action:
  module: uri
  url: "https://{{ server_address }}/api/application/{{app_id}}/deploy"
  method: PUT
  status_code: 202
  validate_certs: no
  headers:
    Content-Type: 'application/json'
    Accept: 'application/json'
    AUTHTOKEN: "{{ server_session.token }}"
  body_format: json
  body:
    version: "{{ staging.json.version }}"
run_once: true
register: deploy
changed_when: deploy|succeeded

我首先尝试将其转换为带有“| int”的整数但是没有用。然后我尝试了“| type_debug”并验证了该变量是一个整数。

但我仍然遇到这个错误。如果我用一个原始整数替换变量,它就可以正常工作。使用详细输出仍然会显示该值作为字符串传递。

"invocation": {
    "module_args": {
        "attributes": null,
        "backup": null,
        "body": {
            "version": "48"
        },
        "body_format": "json",

知道我在这里失踪了什么,或者我如何解决这个问题?我目前正在为这个项目运行Ansible 2.4.0。

3 个答案:

答案 0 :(得分:0)

uri模块可以采用json格式的预格式化主体。试试:

- name: Deploy Staging Blueprint
  local_action:
    module: uri
    url: "https://{{ server_address }}/api/application/{{app_id}}/deploy"
    method: PUT
    status_code: 202
    validate_certs: no
    headers:
      Content-Type: 'application/json'
      Accept: 'application/json'
      AUTHTOKEN: "{{ server_session.token }}"
    body_format: json
    body: '{ "version": {{ staging.json.version }} }'
  run_once: true
  register: deploy
  changed_when: deploy|succeeded

答案 1 :(得分:0)

是的,这是 Ansible 的一个非常奇怪的默认行为。它将每个值呈现为字符串,而不管其原始类型。所以你最终得到 staging.json.version 是一个字符串而不是数字类型。

可以在最近的 Ansible 版本中使用 jina2_native 标志全局更改此行为。

答案 2 :(得分:0)

为例
test_int: 50

尝试在 body 参数中使用不带引号的 Jinja 变量,即

body: '{ "test": {{ test_int }} }'

它在 Ansible 2.9.13 中对我有用