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

相关内容

    暂无相关文章