一. 简述:
关于inventory的基本用法可以参考上一篇文章:ansible-inventory定义-优快云博客
在实际线上环境中,单纯的靠配置文件管理,是一件很麻烦的事情(比如一致性问题),特别是规模较大的场景下,会有大量主机/节点列表(如本公司项目分组60多个,主机2500多台),涉及到日常的增加/回收/维修等情况,如果手动维护相关列表将会是一个非常繁琐的工作。ansible默认是基于静态的文件来获取主机列表的,但同时还支持script方法,即:通过脚本从其他资源(如cmdb系统)获取后按照特有格式定义好组及主机,然后输出,相当于变相的实现动态功能。
二. 实现方法:
ansible实现script方法,需要将inventory值定义为script的名字,脚本不限制语言。但需要支持两个参数:
1. -l(--list) 显示所有主机及主机组信息(json格式)
2. -H(--host) 参数后面需要指定一个host,返回主机的信息(认证,主机变量等) ,同样json格式。
这里通过zabbix api 获取了相关主机/分组列表的信息(其他环境中均可参考)作为例子,具体代码如下:
#!/usr/bin/python
import json
import argparse
import api_authcheck
def data_req(): #获取主机列表并json格式化
hosts = {}
method='hostgroup.get'
params={"output":['name'],'selectHosts':['name'],"groupids":['51','52']} #主机量多,这里只过滤了两个主机少的分组(ID),实际环境可去掉groupids
groupreq = api_authcheck.token(method,params)
groupinfo = groupreq.result_data()['result']
for groups in groupinfo:
host,hostlist ={},[]
for hostinfo in groups['hosts']:
hostlist.append(hostinfo['name'])
host['hosts'] = hostlist
hosts[groups['name']] = host
return json.dumps(hosts,indent=4)
def data_vars(names): #定义变量参数
va = {'ansible_ssh_port':'22'}
var = dict(va.items())
print json.dumps(var)
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument("-H","--host",help="host group name",type=data_vars)
parser.add_argument("-l","--list",help="host vars",action='store_true')
args = vars(parser.parse_args())
if args['list']:
print data_req()
其中import的api_authcheck模块是自己写的API认证模块, 实际上可以用在其他任何可作为数据一致性管理的平台(cmdb? )中进行整合 ,只要输出符合格式即可,如:
[root@xxx11-17 ansible]# python group_get.py --list
{
"Xlog": {
"hosts": [
"10.4.19.78",
"10.4.19.79",
"10.4.19.80",
"10.4.19.86",
"10.4.19.88",
"10.4.19.89",
"10.4.19.90"
]
},
"SMS": {
"hosts": [
"10.4.24.56",
"10.4.36.107",
"10.4.36.108",
"10.9.18.37"
]
}
}
可发现获取到了zabbix中group id为51和52的组名及组下的主机列表,变量设置如下:
# python group_get.py -H 10.4.24.56
{"ansible_ssh_port": "22"}
通过ansible执行相关命令:
执行完成!。。。
如报错如下:
需要在被控制端安装python-simplejson(yum install)
三. 附上inventory内置参数:
ansible_ssh_host | 定义 host ssh 地址 |
ansible_ssh_port | 定义 hosts ssh 端口 |
ansible_ssh_user | 定义 hosts ssh 认证用户 |
ansible_ssh_pass | 定义 hosts ssh 认证密码 |
ansible_sudo | 定义 hosts sudo 用户 |
ansible_sudo_pass | 定义 hosts sudo 密码 |
ansible_sudo_exe | 定义 hosts sudo 路径 |
ansible_connection | 定义 hosts 连接方式 |
ansible_ssh_private_key_file | 定义 hosts 私钥 |
ansible_shell_type | 定义 hosts shell 类型 |
ansible_python_interpreter | 定义 hosts 任务执行python路径 |
ansible_*_interpreter | 定义 hosts 其他语言解析器路径 |