用YAML写Ansible的清单文件
(2017-01-03:我注意到变量的值可以是序列或字典,所以我进行了修正)
阅读了《回顾 Ansible 2017》一文,不过事实上,大多数人可能还不知道从2.1版本开始,Ansible的清单文件可以使用YAML格式编写。
当然啦,毕竟文件上没写。
所以说文档就是源代码。
首先,看一下lib/ansible/inventory/dir.py文件,其中以YAML编写的库存文件的扩展名必须是lib/ansible/constants.py中定义的YAML_FILENAME_EXTENSIONS中的任意一个。
换句话说,它必须是没有扩展名、yml、yaml或json中的任意一个。
当查看lib/ansible/inventory/yaml.py时,需要以以下格式进行描述。
(グループ1):
hosts:
(ホストa):
(ホストaに適用する変数A): (Aの値)
(ホストaに適用する変数B):
- (Bの値1)
- (Bの値2)
(ホストb):
(ホストbに適用する変数A): (Aの値)
(ホストbに適用する変数B):
- (Bの値1)
- (Bの値2)
vars:
(グループ1のすべてのホストに適用する変数C): (Cの値)
(グループ1のすべてのホストに適用する変数D):
- (Dの値1)
- (Dの値2)
children:
(子とするグループ2):
(子とするグループ3):
(グループ2):
hosts:
(以下、省略)
-
- ini(に似た何か)形式で書くインベントリファイルと違い、グループ名を省略してホスト名だけを書くことはできないようだ。
-
- 各グループの子要素にできるのはhostsかvarsかchildrenだけ。各ホストはグループの子要素にできずhostsの子要素にする必要がある。
-
- childrenに書くべきものはただのグループ名のリストであるが、シークエンスではなく値を空にしたディクショナリで記述する必要がある。
-
- varsや各ホストの変数の値としてスカラーだけでなくシークエンスやディクショナリを記述できる。この点、ini(に似た何か)形式より優秀。
- 試した限りでは、ホストに[1:9]のような繰り返しや(ホスト名):(ポート番号)のような記述も特に問題はなく想定通りに動作する。
2017-01-17追記:ini(类似的格式)下,隐式地将所有的组都作为all组的子组,但在YAML格式下则不是如此。我认为这是一个bug,已经进行了报告。
2017-03-29追記:确认此问题已在2.2.2版本中修复。
https://github.com/ansible/ansible/issues/20252
2017-04-17追记:在2.3.0版本中存在一个bug,导致all组中的主机无法添加,始终为空。这个问题已经修复,应该在2.3.1中得到解决。修复补丁在2.3.0版本发布的次日左右合并到了2.3分支中。
2017-06-03追记:确认这个问题已经在2.3.1版本中修复。
https://github.com/ansible/ansible/pull/23366
举个例子,将上一篇文章中使用的存货文件改成YAML格式的写法如下。
local_windows:
hosts:
local_windows:
vars:
ansible_host: localhost
ansible_user: (ユーザ名)
ansible_password: (パスワード)
ansible_port: 5986
ansible_connection: winrm
ansible_winrm_server_cert_validation: ignore
此外,因为JSON是YAML的一种,所以即使用JSON写也没有问题。
{
"local_windows" : {
"hosts" : {
"local_windows" : ""
},
"vars" : {
"ansible_host" : "localhost",
"ansible_user" : "(ユーザ名)",
"ansible_password" : "(パスワード)",
"ansible_port" : "5986",
"ansible_connection" : "winrm",
"ansible_winrm_server_cert_validation" : "ignore"
}
}
}