如 动态Inventory所介绍,ansibel可以从一个动态的数据源获取到inventory信息,包含元端数据源。
怎么写一个自己的数据源?
很简单! 我们仅仅需要创建一个在适当参数下,能够返回正确JSON格式数据的脚本或者程序,你可以使用任何语言来实现。
脚本规范:
当我们在外部使用-list 蚕食调用这个脚本时,
[root@node01 ~]# python /etc/ansible/inventory.py -list
{"all": ["192.168.137.3"]}
这个脚本必须返回一个JSON散列/字典,它包含所管理的所有组,每个组的value应该是一个关于其包含的主机/IP哈希/字典,
它可能是一个子组或者租的变量 或者仅仅是一个主机/IP的列表:
[root@node01 ansible]# cat p2.py
# !/usr/bin/env python
# -*- coding: utf-8 -*-
import cx_Oracle
from pprint import pprint
import csv
import time
import re
import binascii
import json
a={
"databases" : {
"hosts" : [ "host1.example.com", "host2.example.com" ],
"vars" : {
"a" : 'true'
}
},
"webservers" : [ "host2.example.com", "host3.example.com" ],
"atlanta" : {
"hosts" : [ "host1.example.com", "host4.example.com", "host5.example.com" ],
"vars" : {
"b" : 'false'
},
"children": [ "marietta", "5points" ]
},
"marietta" : [ "host6.example.com" ],
"5points" : [ "host7.example.com" ]
}
b=json.dumps(a)
print b
[root@node01 ansible]# python /etc/ansible/p2.py -list
{"webservers": ["host2.example.com", "host3.example.com"],
"atlanta": {"hosts": ["host1.example.com", "host4.example.com", "host5.example.com"],
"children": ["marietta", "5points"], "vars": {"b": "false"}},
"marietta": ["host6.example.com"], "5points": ["host7.example.com"],
"databases": {"hosts": ["host1.example.com", "host2.example.com"],
"vars": {"a": "true"}}}
[root@node01 ansible]# chmod +x p2.py
[root@node01 ansible]# ansible -i /etc/ansible/p2.py webservers -m raw -a "hostname"
host2.example.com | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: ssh: Could not resolve hostname host2.example.com: Name or service not known
",
"unreachable": true
}
host3.example.com | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: ssh: Could not resolve hostname host3.example.com: Name or service not known
",
"unreachable": true
}
ansible -i /etc/ansible/p2.py webservers -m raw -a "hostname" 调用webservers 组