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