SaltStack使用现有的序列化系统来渲染sls数据。而这个现有的序列化系统就是YAML,而严格的YAML格式往往使现在正在学习SaltStack的同学屡屡掉坑。下面就结合官网文档说一说这个YAML格式:

Spaces vs Tabs

YAML使用spaces(空格),因此不要在你的sls文件中使用Tabs!如果你又奇妙的遇到了类似于”rendering sls files errors“等错误,请检查你的sls文件,确保没有Tabs出现。

缩进

YAML文件的语法建议使用两个空格进行缩进,但是YAML会遵循个人文件中所使用的缩进长度,当然我个人还是比较喜欢使用两个空格进行缩进,这样不会导致嵌套比较多的时候,要啪啪啪敲一堆的空格。
今天群里一朋友遇到一个问题,定义nodegroups时报错了,内容如下:
Key nodegroups with value None has an invalid type of <type ‘nonetype’=”">, a dict is required for this value
具体定义的内容如下:

nodegroups:
webgroup1: 'L@cn-gd-gz-0002,cn-gd-gz-0003'
mysqlgroup2: 'L@cn-gd-gz-0007'

从报错内容可以明显看出,nodegroups这个key没有取到value,YAML实际上是将定义的数据进行序列化成一个字典。key下面的缩进内容则会被序列化给改key的对应value,因此这个错误,大家应该知道是哪的问题了。

嵌套的字典

当嵌套字典时,他们不再遵循相同的缩进逻辑,下面是一个file.manager的state管理所定义的数据格式:

/etc/http/conf/http.conf:
  file:
    - managed
    - source: salt://apache/http.conf
    - user: root
    - group: root
    - mode: 644
    - template: jinja
    - context:
        custom_var: "override"
    - defaults:
        custom_var: "default value"
        other_var: 123

注意:这里默认缩进都是用了两个空格,只有定义context,defaults选项的时候才使用了四个空格作为缩进。如果只使用2个空格作为缩进,那么数据将不会被正确渲染。如果使用双倍的行距,那么深层的嵌套字典,可以使用大括号括起来:

/etc/http/conf/http.conf:
  file:
    - managed
    - source: salt://apache/http.conf
    - user: root
    - group: root
    - mode: 644
    - template: jinja
    - context: {
      custom_var: "override"}
    - defaults: {
        custom_var: "default value",
        other_var: 123 }

布尔值的声明,使用

对于布尔值的声明使用,YAML将会载入True/False 而对于Un-capitalized将会载入true/false,yes/no,on/off,所以在构建pillar数据时,如果出现了以上字符则很可能会出现问题。因此在你使用这些值的时候请务必将其用引号引起来,请其构建为一个字符串。

YAML不喜欢两个连续的缩写形式

乍一看也学并不太明白什么叫做连续的缩写形式,别着急,看下面
比如我们要安装一个httpd的包,我们可以这样写

httpd:
  pkg.installed

又比如,我们要新建一个用户,名为httpd,我们还可以这样写

httpd:
  user.present

细心观察一下,两个state是不能写入到一个state的sls文件中的,因为他们两个的ID冲突了。因此我们被迫这样写:

httpd:
  pkg:
    - installed
  user:
    - present

这样算下来,这样的写法,我们至少多敲了10次键盘。
那么我们这样写是否可以:

httpd:
  pkg.installed
  user.present

重点来了,上面的这种写法就是刚刚前面所提到的“两个连续的缩写形式”,坏消息是,这种写法是不被支持的;
而好消息是我们可以这样写:

httpd:
  pkg.installed: []
  user.present: []

这样写既省去了多余的键盘敲击,整体看上去也比较好看。