我在这里迷路了。使用ansible-2.9.9-1.fc30.noarch
,我不理解为什么Ansible将此somedata.aaa
转换为字符串:
- hosts: localhost
remote_user: root
gather_facts: no
vars:
aaa:
- 1.111
- 2.222
- 3.333
bbb: 4.444
roles:
tasks:
- set_fact:
somedata:
aaa: "{{ aaa | max | float }}"
bbb: "{{ bbb }}"
- debug:
msg: "orig: {{ aaa | max | type_debug }} aaa: {{ somedata.aaa | type_debug }} bbb: {{ somedata.bbb | type_debug }}"
- debug:
var: somedata
- debug:
msg: "{{ somedata | to_nice_json }}"
这是输出:
TASK [debug] ******************************************************************
Monday 08 June 2020 17:06:32 +0200 (0:00:00.350) 0:00:00.376 ***********
ok: [localhost] => {
"msg": "orig: float aaa: str bbb: float"
}
TASK [debug] ******************************************************************
Monday 08 June 2020 17:06:33 +0200 (0:00:00.332) 0:00:00.708 ***********
ok: [localhost] => {
"somedata": {
"aaa": "3.333",
"bbb": 4.444
}
}
TASK [debug] ******************************************************************
Monday 08 June 2020 17:06:33 +0200 (0:00:00.318) 0:00:01.027 ***********
ok: [localhost] => {
"msg": "{\n \"aaa\": \"3.333\",\n \"bbb\": 4.444\n}"
}
为什么是somedata.aaa
string而不是float?如何制作float?
max和float是jinja操作,默认情况下jinja将始终返回字符串。请注意,float
正在内部转换数字,jinja然后将其放入字符串中。
如果将3.333
更改为3
,则可以看到此:
aaa:
- 1.111
- 2.222
- 3
使用您的代码,浮点数将其转换为3.0-浮点值:
"somedata": {
"aaa": "3.0",
"bbb": 4.444
}
您可以通过将jinja2_native = True
添加到ansible.cfg
的默认部分来强制jinja始终返回本机类型。
TASK [debug] ************************************************
ok: [localhost] => {
"somedata": {
"aaa": 3.0,
"bbb": 4.444
}
}
TASK [debug] ************************************************
"msg": "{\n \"aaa\": 3.0,\n \"bbb\": 4.444\n}"
}
请记住,这可能会对代码的其他部分产生影响。