国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

python3連接mysql獲取ansible動態inventory腳本

2024-07-24 12:41:52
字體:
來源:轉載
供稿:網友

Ansible Inventory  介紹

Ansible Inventory 是包含靜態 Inventory 和動態 Inventory 兩部分的,靜態 Inventory 指的是在文件中指定的主機和組,動態 Inventory 指通過外部腳本獲取主機列表,并按照 ansible 所要求的格式返回給 ansilbe 命令的。這部分一般會結合 CMDB 資管系統、云計算平臺等獲取主機信息。由于主機資源一般會動態的進行增減,而這些系統一般會智能更新。我們可以通過這些工具提供的 API 或者接入庫查詢等方式返回主機列表。

腳本地址: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 ipsunion allselect ‘1.1.3.112' as ipsunion allselect ‘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 argparseimport sysimport jsonimport settingsimport inventory_group as invgrpfrom connect_mysql import Mysql_Connclass 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()
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 英吉沙县| 平远县| 渭源县| 绥棱县| 富锦市| 浏阳市| 永丰县| 城步| 巍山| 霍州市| 铅山县| 长顺县| 金平| 宁蒗| 盱眙县| 旅游| 城步| 长泰县| 光山县| 肥西县| 陈巴尔虎旗| 永修县| 大宁县| 滨州市| 壶关县| 二手房| 桃园市| 扎囊县| 黎川县| 新宾| 铅山县| 广昌县| 新河县| 民丰县| 舞阳县| 鲁山县| 井陉县| 上饶县| 林州市| 田林县| 南康市|