Ansible 在不丢失整数类型的情况下将整数变量传递给任务

Ansible 在不丢失整数类型的情况下将整数变量传递给任务,ansible,Ansible,我有一个任务(实际上是一个角色,但在这里使用一个任务使示例更简单),我没有这个任务,它对变量执行一些操作。它假定变量是整数。我需要以某种方式传递一个变量,让它以int的形式通过,我没有任何运气 以下是我不拥有的任务的超级简化版本: frob.yml - name: Validate that frob_count is <= 100 fail: msg="{{frob_count}} is greater than 100" when: frob_count > 100 -

我有一个任务(实际上是一个角色,但在这里使用一个任务使示例更简单),我没有这个任务,它对变量执行一些操作。它假定变量是整数。我需要以某种方式传递一个变量,让它以int的形式通过,我没有任何运气

以下是我不拥有的任务的超级简化版本:

frob.yml

- name: Validate that frob_count is <= 100
  fail: msg="{{frob_count}} is greater than 100"
  when: frob_count > 100

- name: Do real work
  debug: msg="We frobbed {{frob_count}} times!"
- name: Validate that frob_count is <= 100
  fail: msg="{{frob_count}} is greater than 100"
  when: frob_count|int > 100
不管怎样,我都会从
frob.yml
中得到类似“1大于100”的错误。看起来它将变量作为字符串而不是整数获取

我尝试过类似于
frob_count:“{{item.parameter | int}}”
之类的东西,但运气不好。如果我能改变
frob.yml
,那会很容易,但就像我说的,那是我无法控制的。有什么想法吗


这在Ansible 2.6.4上,当您发送带有包含任务的变量时,它会变成unicode,甚至在您的剧本上强制使用int。因此,您需要在frob.yml上使用int过滤器,如下所示:

frob.yml

- name: Validate that frob_count is <= 100
  fail: msg="{{frob_count}} is greater than 100"
  when: frob_count > 100

- name: Do real work
  debug: msg="We frobbed {{frob_count}} times!"
- name: Validate that frob_count is <= 100
  fail: msg="{{frob_count}} is greater than 100"
  when: frob_count|int > 100
-名称:验证frob_计数是否为100

解决方案

  • 升级至Ansible 2.7(目前作为分支提供)

  • ansible.cfg
    [默认值]
    部分添加
    jinja2\u native=True
    (或设置环境变量
    ansible\u jinja2\u native=True

  • 将您的代码保留为问题中的代码(即,
    frob_count:“{{item.parameter}}”

  • 结果是:

    TASK [Do real work] **********************************************************************************************************************
    ok: [localhost] => {
        "msg": "We frobbed 1 times!"
    }
    
    TASK [Validate that frob_count is <= 100] ************************************************************************************************
    skipping: [localhost]
    
    TASK [Do real work] **********************************************************************************************************************
    ok: [localhost] => {
        "msg": "We frobbed 2 times!"
    }
    
    TASK [Validate that frob_count is <= 100] ************************************************************************************************
    skipping: [localhost]
    
    TASK [Do real work] **********************************************************************************************************************
    ok: [localhost] => {
        "msg": "We frobbed 45 times!"
    }
    
    任务[做实际工作]**********************************************************************************************************************
    确定:[本地主机]=>{
    “味精”:“我们吃了1次!”
    }
    任务[验证frob_计数是否正确]{
    “味精”:“我们吃了两次!”
    }
    任务[验证frob_计数是否正确]{
    “味精”:“我们吃了45次!”
    }
    

    解释

    目前,Jinja2模板返回的任何值都是字符串,因此即使您在内部使用了
    int
    过滤器(如
    {{item.parameter | int}}
    ),输出也总是由Ansible呈现为字符串


    (使用上述参数)Jinja 2.10的一个功能调用并保留了数据类型。

    是的,但在我的场景中,我无法编辑任务。此外,传递int-literal(比如
    frob_count:5
    )非常有效,这听起来像是Jinja的问题…@KelsonSilva“当你用
    include
    任务发送变量时,它会变成unicode”--错误。你可以用
    debug:msg={{frob_count | type_debug}}
    替换
    include
    ,“发送”(不管它是什么意思)不是原因。 OP明确表示他们无法控制frob.yml@techraf我明白了…谢谢你的解释,我的理解是错误的…我很感激!听起来我必须希望我的组织尽快采用2.7,或者对这个麻烦的脚本进行公关并祈祷。啊,好吧。谢谢!完美,这是一个适当的解决方法可解释问题的nd