Ansible自动化(十一) 编写YAML格式主机清单⽂件
1 | 作者:李晓辉 |
启用清单插件
Ansible 通过插件支持各种清单文件格式,插件就像小工具一样,能让 Ansible 处理更多格式。开发者可以写清单插件,轻松给 Ansible 增加对新格式的支持。
大部分插件默认已经启用了,如果你想用其他插件,只需要在 ansible.cfg
配置文件里的 inventory
部分设置 enable_plugins
就行。
比如,script
插件用来支持动态清单脚本,ini
插件支持 INI 格式,yaml
插件支持 YAML 格式。
1 | [inventory] |
Ansible 会按照你在 enable_plugins
里指定的顺序来尝试加载这些插件。
编写 YAML 格式清单⽂件
以下⽰例显⽰了 INI 格式的静态清单⽂件:
1 | cat > inventory <<-EOF |
以下⽰例⽤ YAML 格式定义相同的清单:
1 | all: |
YAML 清单其实就是通过“块”来组织内容,每个块开头是个组名,后面跟个冒号。然后,所有在这个组下缩进的内容,就都归这个组管啦。
如果你再继续往下缩进,就会看到一个叫 hosts
的块,这个块里写的服务器都是属于这个组的。哦对了,这些服务器本身也可以是小组哦,所以它们得以冒号结尾。
想要在组里弄个“子组”嘛?没问题!在组里加个 children
关键字,后面列出所有子组,这些子组可以再有自己的 hosts
和 children
块。这样层次分明,管理起来超方便!
设置清单变量
最理想的做法是避免直接把变量写进静态清单文件。相反,应该将变量和它们的值保存在 host_vars
或 group_vars
文件中。不过,如果你非得在清单里定义的话,可以按下面的方式来做:
INI 变量
1 | cat > inventory <<-EOF |
等效YAML静态清单
1 | all: |
将INI转换为YAML
你可以使用 ansible-navigator inventory
命令来帮助你将 INI 格式的清单文件转换成 YAML 格式。这个命令会帮助你轻松地完成转换,确保格式和结构符合要求。
转换前的ini
注意web1.example.com
主机属于两个组:web_servers 和 dc1。
1 | cat > inventory <<-EOF |
转换后的yaml
1 | [root@workstation ~]# ansible-navigator inventory -i inventory --yaml --eei ee-supported-rhel8 --pp never -m stdout --list |
YAML 输出中的部分组或主机⾏以花括号 {} 结尾。 这些花括号表⽰组没有任何成员或组变量,或者主机没有主机变量。 它们不需要包含在内。
1 | all: |
请注意,该命令将 http_port 组变量转换为 web_servers 组的成员主机变量。需要修正
1 | all: |
YAML ⽂件故障排除
保护后⾯跟着空格的冒号
在未加引号的字符串中,冒号后跟空格可导致错误。 YAML 会将此解释为在字典中开始⼀个新元素。
错误示范,第⼆个冒号未得到保护:
1 | title: Ansible: Best Practices |
正确示范
1 | title: 'Ansible: Best Practices' |
保护作为某个值开头的变量
通常,在使⽤任何保留字符时, [] {} > , |* & ! % # ` @ ,应在值的两边使⽤双引号
1 | name: "{{ variable }} rest ofthe value" |
了解字符串和布尔值或浮点值之间的区别
⽤作变量值的布尔值和浮点数不可加引号。 带引号的值被视为字符串
以下⽰例将 active 参数设置为 true 布尔值,并将 default_answer 参数设置为 true 字符串
1 | active: true |
以下⽰例将 temperature 参数设置为浮点值,并将 version 参数设置为字符串
1 | temperature: 36.5 |