我把Ansible的Inventory文件格式从ini改成了yml的故事
补充(2017/09/27)
- ansible 2.3.xでは問題がないが、2.4.0では次のようなエラーが発生する。
ERROR! Unexpected Exception, this is probably a bug: string indices must be integers
- ini形式で戻したら、エラーが無くなった。2.4.0のbugだと思うが、原因が分かり次第、追記する。
背景
-
- 久々にAnsible Inventoryのドキュメントを見たらymlでも作成できるようになっていた。
- まだ慣れてないini形式よりplaybookと同様のymlで直した方がいいと判断した。
目标节点列表
正在本地运行的服务器列表
Current machine states:
jumpbox running (virtualbox)
dev running (virtualbox)
test running (virtualbox)
live running (virtualbox)
gembox running (virtualbox)
proxy running (virtualbox)
db1 running (virtualbox)
db2 running (virtualbox)
redmine running (virtualbox)
chat running (virtualbox)
gitlab running (virtualbox)
runner running (virtualbox)
This environment represents multiple VMs. The VMs are all listed
above with their current state. For more information about a specific
VM, run `vagrant status NAME`.
在/etc/hosts文件中,列出了与服务器名称对应的映射关系。
库存文件
我用Ansible管理本地(macOS Sierra)和目标节点(位于Vagrant上的服务器)。我试图将文件从ini格式转换为yml格式。
local:
hosts: localhost
vars:
ansible_connection: local
all:
hosts:
jumpbox: jumpbox
dev: dev
test: test
live: live
gembox: gembox
proxy: proxy
redmine: redmine
chat: chat
gitlab: gitlab
runner: runner
children:
db:
hosts: db[1:2]
vars:
ansible_connection: ssh
ansible_user: vagrant
ansible_password: vagrant
ansible.cfg -> Ansible 配置文件
在存储库内管理Inventory文件更加方便。
我创建了ansible.cfg文件并写入了Inventory文件等默认设置来使用。
% cat ansible.cfg
[defaults]
inventory = inventories/hosts.yml
forks = 5
log_path = ~/Library/Logs/ansible.log
host_key_checking = false
gathering = smart
executable = /bin/bash -l
retry_files_save_path = ~/.ansible/retry-files
验证
- AnsibleでInventoryファイルをちゃんと解析しているのかを確認する。
% ansible all --list-hosts
hosts (13):
jumpbox
runner
gitlab
gembox
live
redmine
dev
chat
test
proxy
db1
db2
localhost
- ansibleコマンドで各サーバーについてpingテストを行う。
% ansible all -m ping
jumpbox | SUCCESS => {
"changed": false,
"ping": "pong"
}
gitlab | SUCCESS => {
"changed": false,
"ping": "pong"
}
runner | SUCCESS => {
"changed": false,
"ping": "pong"
}
live | SUCCESS => {
"changed": false,
"ping": "pong"
}
gembox | SUCCESS => {
"changed": false,
"ping": "pong"
}
redmine | SUCCESS => {
"changed": false,
"ping": "pong"
}
dev | SUCCESS => {
"changed": false,
"ping": "pong"
}
test | SUCCESS => {
"changed": false,
"ping": "pong"
}
chat | SUCCESS => {
"changed": false,
"ping": "pong"
}
proxy | SUCCESS => {
"changed": false,
"ping": "pong"
}
db1 | SUCCESS => {
"changed": false,
"ping": "pong"
}
db2 | SUCCESS => {
"changed": false,
"ping": "pong"
}
localhost | SUCCESS => {
"changed": false,
"ping": "pong"
}
没问题!
请看以下资料
- Ansible Inventory Document