我用json文件做了一些测试,我看到我不理解它的行为,它是正常的还是一个bug?
My json file:
{
"interfaces": {
"GigabitEthernet0/0": {
"duplex_code": "auto",
"port_speed": "a-100",
"status": "connected",
"type": "10/100/1000BaseTX",
"vlan": "1"
}
}
}
任务:
- name: load the Json data to a Variable as a Fact
command: cat "{{ _jsonfile }}"
vars:
_jsonfile: 'file.json'
register: output
- name: output is string
debug: msg="output is string"
when: output is string
- name: output.stdout is string
debug: msg="output.stdout is string"
when: output.stdout is string
- set_fact:
out: "{{ output.stdout }}"
- name: out is string
debug: msg="out is string"
when: out is string
正如您所看到的,我用cat
命令加载JSON,并检查output.stdout
的注册输出是否为字符串。
结果:
TASK [**output is string**] *********************************************
Friday 29 October 2021 15:15:35 +0000 (0:00:00.347) 0:00:00.412 ********
**skipping**: [localhost]
TASK [**output.stdout is string**] *****************************************************************
Friday 29 October 2021 15:15:36 +0000 (0:00:00.028) 0:00:00.440 ********
ok: [localhost] =>
**msg: output.stdout is string**
TASK [set_fact] **************************************************************************
Friday 29 October 2021 15:15:36 +0000 (0:00:00.029) 0:00:00.470 ********
ok: [localhost]
TASK [**out is string**] *********************************************************************
Friday 29 October 2021 15:15:36 +0000 (0:00:00.031) 0:00:00.502 ********
**skipping: [localhost]**
output.stdout
是一个字符串,它是正常的,但是当我在另一个名为out
的变量中捕获output.stdout
时,这个变量不是字符串,但是一个我可以迭代out.interfaces
的字典,所以,我想理解它。
一个变量的类型随着新的影响而改变是正常的吗?
是的,这实际上是非常常见的行为,自动强制内容到dict
或list
-它认为这是"帮助";你。
要阻止这种行为,您可以使第一个字符不是JSON-y字符之一,并且它将留下一个字符串,或者通常显式地通过| string
发送管道也可以,如果前导空格对某些下游任务很重要:
- set_fact:
out: " {{ output.stdout }}"
- set_fact:
out: "{{ output.stdout | string }}"
请注意,因为——就像出现了jinja2 moustaches一样——ansible可以随时应用这些强制转换规则,所以当文本在各种求值管道中传递时必须特别小心