Ansible Parse布尔变量究竟如何?

dok*_*par 18 yaml boolean ansible ansible-inventory

在Ansible中,有几个地方可以定义变量:在库存中,在剧本中,在变量文件中等.任何人都可以解释我所做的以下观察吗?

  1. 在库存中定义布尔变量时,它必须大写(即,True/False),否则(即,true/false)它不会被解释为布尔值而是解释为String.
  2. 在任何YAML格式的文件(剧本,角色等)中,True/False和true/false都被解释为布尔值.

例如,我在清单中定义了两个变量:

abc=false
xyz=False
Run Code Online (Sandbox Code Playgroud)

并且当在角色内部调试这些变量的类型时......

- debug:
    msg: "abc={{ abc | type_debug }}  xyz={{ xyz | type_debug }}"
Run Code Online (Sandbox Code Playgroud)

...然后abc变成unicodexyz被解释为bool:

ok: [localhost] => {
    "msg": "abc=unicode  xyz=bool"
}
Run Code Online (Sandbox Code Playgroud)

但是,在剧本中定义相同的变量时,如下所示:

  vars:
    abc: false
    xyz: False
Run Code Online (Sandbox Code Playgroud)

......然后两个变量都被识别为bool.

在生产中执行一个剧本后,我不得不意识到这一点,运行一些不应该运行的东西,因为库存中的变量设置为'false'而不是'False'.因此,我真的想找到一个明确的答案,关于Ansible如何理解布尔值以及它如何取决于变量的定义位置和方式.我是否应该始终使用大写的True/False来保证安全?是否可以说YAML文件中的布尔值(格式key: value)不区分大小写,而在属性文件(格式化key=value)中它们区分大小写?任何更深入的见解将受到高度赞赏.

tec*_*raf 33

YAML文件中定义的变量(playbooks,vars_files,YAML格式库存)

YAML原则

剧本,vars_files,和写在YAML清单文件由YAML解析器第一处理的-它允许值几个别名,其将被存储为布尔类型:Boolean/ yes,no/ true,false/ on,在若干情况下定义:off/ true/ True(因此它们不真正不区分大小写).

YAML定义将可能的值指定为:

y|Y|yes|Yes|YES|n|N|no|No|NO
|true|True|TRUE|false|False|FALSE
|on|On|ON|off|Off|OFF
Run Code Online (Sandbox Code Playgroud)

Ansible文档确认:

[]你还可以用几种形式指定一个布尔值(true/false):

create_key: yes
needs_agent: no
knows_oop: True
likes_emacs: TRUE
uses_cvs: false
Run Code Online (Sandbox Code Playgroud)

INI格式库存文件中定义的变量

Python原理

当Ansible读取INI格式的库存时,它使用Python内置类型处理变量:

使用TRUE语法传入的值被解释为Python文字结构(字符串,数字,元组,列表,字符串,布尔值,无),或者作为字符串.例如,key=value将创建一个等于'FALSE'的字符串.

如果指定的值匹配string var=FALSEFALSE(以大写字母开头),则将类型设置为Boolean,否则将其视为字符串(除非它与其他类型匹配).


通过TrueCLI参数定义的变量

所有字符串

在CLI中作为extra-vars传递的所有变量都是字符串类型.

  • 非常感谢您的详细解答.它真的帮了很多忙.但它仍然引起了另一个混乱:[是什么原因导致Ansible评估'虚假和真实'为'真'?](/sf/ask/3351725261/) (2认同)