python3連接mysql獲取ansible動態inventory

腳本地址:https://github.com/AlbertCQY/scripts/tree/master/ansible
腳本用法:README.txt
1、腳本用法
bestpay用戶 cd /tools/scripts/ansible
python3.6 invscript.py -h
1)、查詢某個分組中包含哪些主機,oracle_nj_all爲inventory_group.py中的組名
python3.6 invscript.py --group oracle_nj_all
2)、查詢所有
python3.6 invscript.py --list
3)、查詢某分組主機中主機名,腳本也可以在play-book中使用-i指定inventory
ansible -i invscript.py mysql_nj_all -m shell -a “hostname”
2、更新數據庫主機列表,sql中最好對ip進行去除空格並排序,否則可能會有warning
inventory_group.py中格式:
mygrp2就是ansible使用的組名
‘ssh_user’:‘root’ root用戶代表連到目標主機的用戶。如果ansible server主機的test用戶和目標的root用戶有互信,那麼ansible腳本在test用戶下執行。
例子如下:
mygrp2 = {‘sql’:"""
select ‘1.1.3.8’ as ips
union all
select ‘1.1.3.112’ as ips
union all
select ‘1.1.3.113’ as ips
“”",
‘ssh_user’:‘root’}

部分腳本內容:

#!/usr/bin/env python
#-*- coding: UTF-8 -*-
# =========================================================================
"""
-- File Name : invscript.py
-- Purpose : 從mysql數據中動態獲取主機列表,動態inventory,不用維護主機列表
-- Date : 2020/01
-- Author:陳晴陽
Vervisons:
-- 20200106 1.0,陳晴陽,實現了動態獲取主機列表,按照默認互信方式獲取主機信息。
-- 20200116 2.0,陳晴陽,增加--group參數,並統計各個分組主機個數;重構了group_all 所有主機按照各組設置的互信用戶來抓信息;增加對IP地址排序功能。
"""
# =========================================================================
import argparse
import sys
import json
import settings
import inventory_group as invgrp
from connect_mysql import Mysql_Conn


class DynamicInventory(object):

    def read_cli(self):
        parser = argparse.ArgumentParser()
        parser.add_argument('--host', nargs=1)
        parser.add_argument('--list', action='store_true')
        parser.add_argument('--group')
        self.options = parser.parse_args()

    def GetItemList(self):
        list_item = []
        for item in dir(invgrp):
            if not item.startswith("__"):
                list_item.append(item)
        return list_item

    def GetGrpList(self):
        list_grpinfo = []
        list_item = self.GetItemList()
        for item in list_item:
            itemcontent = getattr(invgrp, item)
            tmp_dic = {}
            tmp_dic[item] = itemcontent
            list_grpinfo.append(tmp_dic)
        return list_grpinfo

    def get_groups(self):
        hostgroups = self.GetGrpList()
        #allhost = []
        for hostdic in hostgroups:#hostgroup爲字典
            for hostgroup in hostdic: #獲取字典的key
                self.result[hostgroup] = {}
                v_sql = hostdic[hostgroup]['sql'] #獲取sql
                v_ssh_user = hostdic[hostgroup]['ssh_user']  # 獲取sql
                hosts = self.connection.execsql(v_sql)
                #print(hosts)
                # 構建每個分組
                grp_host_list = [host[0] for host in hosts]
                grp_host_list = sorted(grp_host_list, key=lambda x: (int(x.split('.')[0]), int(x.split('.')[1]), int(x.split('.')[2]))) #排序
                self.result[hostgroup]['hosts'] =  grp_host_list
                self.result[hostgroup]['vars'] = {'ansible_ssh_user': v_ssh_user}
                #構建_meta,注意ip爲元組,需要做個小轉換ip[0] 需要字符串值
                for ip in hosts:
                    tmp_dic = {}
                    tmp_dic['ansible_ssh_host'] = ip[0]
                    self.result['_meta']['hostvars'][ip[0]] = tmp_dic
        # 構建group_all
        self.result[self.defaultgroup]['hosts']=[]
        self.result[self.defaultgroup]['children'] =self.GetItemList()
        return self.result

    def get_host(self,ipaddr):
        ip = ''
        for i in ipaddr:
            ip = i
        data = {'ansible_ssh_host': ip}
        return data

    def get_group_hosts(self,grpname):
        if grpname == 'group_all':
            allhosts = []
            #查詢出來所有的主機列表
            hostgroups = self.GetGrpList()
            for hostdic in hostgroups:  # hostgroup爲字典
                for hostgroup in hostdic:  # 獲取字典的key
                    v_sql = hostdic[hostgroup]['sql']  # 獲取sql
                    hosts = self.connection.execsql(v_sql)
                    allhosts.extend([host[0] for host in hosts])

            allhosts = set(allhosts)  # 去重
            allhosts = sorted(allhosts, key=lambda x: (int(x.split('.')[0]), int(x.split('.')[1]), int(x.split('.')[2]))) #排序
            cnt = 0
            for i in allhosts:
                print(cnt + 1, i)
                cnt = cnt + 1
            print('Group ' + grpname + ' Total hosts:', cnt)
        else:
            txt_grp ='invgrp.'+grpname+"""['sql']"""
            v_sql = eval(txt_grp) #這裏偷懶用了邪惡函數eval
            hosts = self.connection.execsql(v_sql)
            cnt = 0
            for i in hosts:
                print(cnt + 1,i[0])
                cnt = cnt + 1
            print('Group '+grpname+' Total hosts:',cnt)


    def __init__(self):

        try:
            self.connection = Mysql_Conn(settings.my_usr, settings.my_pass, settings.my_ip, settings.my_port, settings.my_db)
        except Exception as err:
            print("connect wrong", err)
        self.defaultgroup = 'group_all'
        self.options = None
        self.read_cli()

        self.result = {}
        self.result[self.defaultgroup] = {}
        self.result[self.defaultgroup]['hosts'] = []
        self.result[self.defaultgroup]['vars'] = {'ansible_ssh_user': 'bestpay'}
        self.result['_meta'] = {}
        self.result['_meta']['hostvars'] = {}

        if self.options.host:
            data = self.get_host(self.options.host)
            print(json.dumps(data,indent=4))
        elif self.options.list:
            data = self.get_groups()
            print(json.dumps(data,indent=4))
        elif self.options.group:
            data = self.get_group_hosts(self.options.group)
        else:
            sys.exit("usage: --list or --host HOSTNAME or --group GROUPNAME")

if __name__ == '__main__':
    DynamicInventory()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章