ansible动态inventory

来源:互联网 发布:js定义map 编辑:程序博客网 时间:2024/06/06 04:49

ansible动态investment,主机列表从ansible获取,只从数据库取两个字段,tag和外网ip

表结构:
+—————-+————–+——+—–+———+——-+
| Field | Type | Null | Key | Default | Extra |
+—————-+————–+——+—–+———+——-+
| instance_id | varchar(40) | NO | PRI | NULL | |
| region_name | varchar(30) | NO | | NULL | |
| placement | varchar(30) | NO | | NULL | |
| image_type | varchar(20) | NO | | NULL | |
| tag_name | varchar(50) | NO | | NULL | |
| group_id | varchar(30) | NO | | NULL | |
| root_volume_id | varchar(40) | NO | | NULL | |
| data_volume_id | varchar(40) | YES | | NULL | |
| public_addr | varchar(25) | NO | | NULL | |
| private_addr | varchar(25) | NO | | NULL | |
| instance_type | varchar(15) | YES | | NULL | |
| description | varchar(100) | YES | | NULL | |
+—————-+————–+——+—–+———+——-+

获取动态inventory:

#!/usr/bin/python#-*- coding:utf-8 -*-import sysimport MySQLdbimport json#db hostdbhost = 'XXX'dbport = 3306dbname = 'automatic'dbuser = 'root'password = 'XXX'def hostinfo(conn):    cur = conn.cursor()    #cur.execute("select `tag_name`,`tag_name` from aws_instance where `tag_name`=%s", (name))    cur.execute("select `tag_name` from aws_instance where tag_name REGEXP '_SG_T' order by `tag_name`")    testHost = []    for row in cur.fetchall():        testHost.append(row[0])    cur.close()#SG host---分组,按我这里的实际情况需要将主机分为TEST,SG,FK,OR这几组    cur = conn.cursor()    cur.execute("select `tag_name` from aws_instance where tag_name REGEXP '_SG_' order by `tag_name`")    sgHost = []    for row in cur.fetchall():        sgHost.append(row[0])    cur.close()#FK host    cur = conn.cursor()    cur.execute("select `tag_name` from aws_instance where tag_name REGEXP '_FK_' order by `tag_name`")    fkHost = []    for row in cur.fetchall():        fkHost.append(row[0])    cur.close()#OR host    cur = conn.cursor()    cur.execute("select `tag_name` from aws_instance where tag_name REGEXP '_OR_' order by `tag_name`")    orHost = []    for row in cur.fetchall():        orHost.append(row[0])    cur.close()#SP host    cur = conn.cursor()    cur.execute("select `tag_name` from aws_instance where tag_name REGEXP '_SP_' order by `tag_name`")    spHost = []    for row in cur.fetchall():        spHost.append(row[0])    cur.close()#SL host    cur = conn.cursor()    cur.execute("select `tag_name` from aws_instance where tag_name REGEXP '_SL_' order by `tag_name`")    slHost = []    for row in cur.fetchall():        slHost.append(row[0])    cur.close()#vars-ssh_host,除了分组,还需要指定每个tag的ansible_ssh_host    cur = conn.cursor()    cur.execute("select `tag_name`,`public_addr` from aws_instance order by `tag_name`")    varInfo = {}    for row in cur.fetchall():        varInfo[row[0]] = {'ansible_ssh_host':row[1]}    cur.close()    varHost = {'_meta':{'hostvars':varInfo}}#分组,我这里还定义了变量region,我自己需要用到    TESTGroup = {'hosts':testHost,'vars':{'region':'t'}}    SGGroup = {'hosts':sgHost,'vars':{'region':'sg'}}    FKGroup = {'hosts':fkHost,'vars':{'region':'fk'}}    ORGroup = {'hosts':orHost,'vars':{'region':'or'}}    SLGroup = {'hosts':slHost}    SPGroup = {'hosts':spHost}    ALL = {'children':['TEST','SG','FK','OR','SP','SL']}    hostdata = {'TEST':TESTGroup,SG:SGGroup,FK:FKGroup,OR:ORGroup,SP:SPGroup,SL:{'hosts':slHost},'_meta':{'hostvars':varInfo},'all':ALL}    print json.dumps(hostdata, indent=4)if __name__ == '__main__':    con = MySQLdb.connect(host=dbhost, port=dbport, user=dbuser, passwd=password, db=dbname)    hostinfo(con)

效果如下:
这里写图片描述

以上json转化为ansible的主机列表yaml就类似这样:
[all:children]
TEST
SG
FK
OR
SP
[FK:vars]
region=fk
[SG:vars]
region=sg
[OR:vars]
region=or
[TEST:vars]
region=t
[TEST]
host1 ansible_ssh_host=ip1
host2 ansible_ssh_host=ip2
host3 ansible_ssh_host=ip3

[SG]
host1 ansible_ssh_host=ip1
host2 ansible_ssh_host=ip2
host3 ansible_ssh_host=ip3

直接调用动态inventory的py脚本,通过ansible-playbook -i指定py文件即可。

ansible-playbook -i getinsfromdb.py test.yaml --list-hosts
原创粉丝点击