ansible动态inventory,ansibleinventory
ansible动态inventory,ansibleinventory
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 sys
import MySQLdb
import json
#db host
dbhost = 'XXX'
dbport = 3306
dbname = '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
评论暂时关闭