Ansible是自动转换字符串(json)与新的影响字典?



我用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的字典,所以,我想理解它。

一个变量的类型随着新的影响而改变是正常的吗?

是的,这实际上是非常常见的行为,自动强制内容到dictlist-它认为这是"帮助";你。

要阻止这种行为,您可以使第一个字符不是JSON-y字符之一,并且它将留下一个字符串,或者通常显式地通过| string发送管道也可以,如果前导空格对某些下游任务很重要:

- set_fact:
out: " {{ output.stdout }}"
- set_fact:
out: "{{ output.stdout | string }}"

请注意,因为——就像出现了jinja2 moustaches一样——ansible可以随时应用这些强制转换规则,所以当文本在各种求值管道中传递时必须特别小心

相关内容

  • 没有找到相关文章

最新更新