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: []
这样写既省去了多余的键盘敲击,整体看上去也比较好看。