Ansible Parse布尔变量究竟如何?

时间:2017-12-18 22:38:49

标签: boolean ansible yaml ansible-inventory

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

  1. 在清单中定义布尔变量时,它必须大写(即,真/假),否则(即,真/假)它不会被解释为布尔值而是被解释为字符串。
  2. 在任何YAML格式的文件(剧本,角色等)中,True / False和true / false都被解释为布尔值。
  3. 例如,我在清单中定义了两个变量:

    fetchOO()

    在角色中调试这些变量的类型时......

    abc=false
    xyz=False
    

    ...然后- debug: msg: "abc={{ abc | type_debug }} xyz={{ xyz | type_debug }}" 变为abc,但unicode被解释为xyz

    bool

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

    ok: [localhost] => {
        "msg": "abc=unicode  xyz=bool"
    }
    

    ...然后两个变量都被识别为 vars: abc: false xyz: False

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

1 个答案:

答案 0 :(得分:23)

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

YAML原则

Playbooks,vars_files和inventory files written in YAML首先由YAML解析器处理。它允许多个别名用于存储为Boolean类型的值:yes / notrue / falseon / {{ 1}},在几种情况下定义:off / true / True(因此它们并非真正不区分大小写)。

YAML definition将可能的值指定为:

TRUE

Ansible docs confirm that

  

您还可以使用多种形式指定布尔值(true / false):

y|Y|yes|Yes|YES|n|N|no|No|NO
|true|True|TRUE|false|False|FALSE
|on|On|ON|off|Off|OFF

INI格式清单文件

中定义的变量

Python原则

当Ansible读取INI格式的库存时,它会处理变量using Python built-in types

  

使用create_key: yes needs_agent: no knows_oop: True likes_emacs: TRUE uses_cvs: false 语法传入的值被解释为Python文字结构(字符串,数字,元组,列表,字符串,布尔值,无),或者作为字符串。例如,key=value会创建一个等于var=FALSE的字符串。

如果指定的值匹配字符串FALSETrue(以大写字母开头),则类型设置为布尔值,否则将其视为字符串(除非它与其他类型匹配)。

通过False CLI参数

定义的变量

所有字符串

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