ansible-动态inventory及内置函数

一. 简述:

   关于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 其他语言解析器路径

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值