1. ホーム
  2. python

ansible がホスト情報を取得し、mysql データベースに保存する。

2022-02-18 01:22:38
#! /usr/bin/python



# -*- coding:UTF-8 -*-.











インポート os



インポートシステムズ



インポートコマンド



MySQLdbのインポート



インポート json







#すべてのファクトを取得し、ホスト名をファイル名とするパスに保存する



(status, output) = commands.getstatusoutput('ansible all -m setup --tree /root/hosts')



#print status,'++++++++++++++'







#root/hosts 以下のファイルに .json サフィックスを追加します。



def rename_file(path):



for file in os.listdir(path):



<ブロッククオート
if os.path.isfile(os.path.join(path,file)) == True:
<ブロッククオート <ブロッククオート if file.find('.json') < 0:
<ブロッククオート <ブロッククオート <ブロッククオート
newname = file + '.json' です。
<ブロッククオート <ブロッククオート <ブロッククオート os.rename(os.path.join(path,file),os.path.join(path,newname)) <ブロッククオート <ブロッククオート <ブロッククオート プリントファイル,'ok' <ブロッククオート <ブロッククオート <ブロッククオート でなければ <ブロッククオート <ブロッククオート <ブロッククオート <ブロッククオート 続ける <ブロッククオート <ブロッククオート でなければ <ブロッククオート <ブロッククオート
続ける




print rename_file('/root/hosts')







#ホストのファクトを取得し、データベースに保存する



もし ~status:



#ファイル一覧の取得



(status,output) = commands.getstatusoutput('ls /root/hosts > /root/host_list')
# print status,'-------------'







<スパン if ~status:



# データベース接続を開く



db = MySQLdb.connect("localhost","ansible","R00t@123","ansible") )



# cursor()メソッドを使用して操作カーソルを取得する 



cursor = db.cursor()




<スパン # hosts データテーブルを作成する



flag = cursor.execute(" show tables like 'hosts' ")



# print flag,'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!



if flag == 0:



create_hosts_table = ''' CREATE TABLE hosts (



        ip char(20) primary key not null,



        ホスト名 CHAR(50)。



        ゲートウェイCHAR(20)。



        mac CHAR(30)。



        ディストリビューション CHAR(20)。



        distribution_version CHAR(20)。



        アーキテクチャ CHAR(20)。



        カーネル CHAR(30)。



        プロセッサCHAR(100)。



        processor_cores CHAR(20)。



        processor_count CHAR(20))です。



cursor.execute(create_hosts_table)を実行します。




<スパン ファイル = open("/root/host_list","r")



<ブロッククオート if ファイルを使用します。



をファイル内の行に追加してください。



<ブロッククオート
事実 = line.strip('\n')
ファクトを印刷する




#各ホストのファクトを取得する
file_fact = open("/root/hosts/"+fact,"r")
<ブロッククオート if file_fact: <ブロッククオート <ブロッククオート
データ = json.loads(file_fact.read())
<ブロッククオート
ホスト名 = data['ansible_facts']['ansible_hostname'] とする。
<ブロッククオート <ブロッククオート IP = data['ansible_facts']['ansible_default_ipv4']['address'] (アドレス) <ブロッククオート
ゲートウェイ = data['ansible_facts']['ansible_default_ipv4']['gateway'] (ゲートウェイ)
<ブロッククオート
mac = data['ansible_facts']['ansible_default_ipv4']['macaddress'] とする。
<ブロッククオート
distribution = data['ansible_facts']['ansible_distribution'] とする。
<ブロッククオート <ブロッククオート distribution_version = data['ansible_facts']['ansible_distribution_version'] とする。 <ブロッククオート
アーキテクチャ = data['ansible_facts']['ansible_architecture'] (英語)
<ブロッククオート <ブロッククオート カーネル = data['ansible_facts']['ansible_kernel'] とする。 <ブロッククオート <ブロッククオート プロセッサ = data['ansible_facts']['ansible_processor'][1]. <ブロッククオート <ブロッククオート processor_cores = data['ansible_facts']['ansible_processor_cores'] とする。 <ブロッククオート <ブロッククオート processor_count = data['ansible_facts']['ansible_processor_count'] とする。 <ブロッククオート
ホスト名、アーキテクチャ、ディストリビューション、ディストリビューションバージョン、カーネル、IP、ゲートウェイ、mac、プロセッサを表示する。
<ブロッククオート
#ホストデータの有無を確認する。
check_host = "セレクト * from hosts where IP = '%s' " % (IP)
flag = cursor.execute(check_host)
# print (フラグ,タイプ(フラグ))
#ホスト情報が既に存在する場合は更新する
if flag ! = 0L:
<ブロッククオート <ブロッククオート <ブロッククオート sql = "update hosts set IP = '%s',hostname = '%s',gateway = '%s',mac = '%s',distribution = '%s',distribution_version = '%s',architecture = '%s',kernel = '%s',processor = '%s',processor_cores = '%s' where IP = '%s' ".に設定されたホストを更新します。% (IP,hostname,gateway,mac,distribution,distribution_version,architecture,kernel,processor,processor_cores,processor_count,IP) <ブロッククオート
#ホストが存在しない場合、ホスト情報を挿入する
でなければ
<ブロッククオート <ブロッククオート <ブロッククオート sql = "insert into hosts (IP,hostname,gateway,mac,distribution,distribution_version,architecture,kernel,processor,processor_cores,processor_count) values ('%s','%s','%s','%s','%s','%s','%s','%s') " % (IP,hostname,gateway,mac,distribution,distribution_version,architecture,kernel,processor,processor_cores,processor_count) <ブロッククオート <ブロッククオート を試してみてください。 <ブロッククオート <ブロッククオート
  # sql文の実行
<ブロッククオート
#   print (sql,'******************')
<ブロッククオート <ブロッククオート   カーソル.execute(sql) <ブロッククオート
  # データベースにコミットして実行する
<ブロッククオート
  db.commit()
<ブロッククオート
  print (" '%s' update successfully ! ") % (ホスト名)
<ブロッククオート
を除く。
<ブロッククオート <ブロッククオート
  # エラー発生時のロールバック
<ブロッククオート <ブロッククオート   db.rollback() <ブロッククオート
  print '何かおかしいぞ! '
<ブロッククオート <ブロッククオート



file_fact.close #ファイルを閉じる "/root/hosts/"+fact
<ブロッククオート <スパン <スパン <スパン



<スパン
db.close()