[PYTHON] Zeigen Sie Protokolle mit Ansible auf leicht verständliche Weise an

Möglicherweise befindet es sich bereits in anderen Konfigurationsverwaltungstools oder tatsächlich in Ansible, aber ich konnte es nicht finden. Deshalb habe ich den Code auf der Ebene "Ich wünschte, ich hätte so etwas" geschrieben, also werde ich ihn veröffentlichen.

Ich habe es in Python geschrieben, weil ich vermeiden wollte, so viel wie möglich in zusätzliche Dinge zu stecken, aber da ich ein Anfänger in Python war und das Programm nicht richtig studiert habe, denke ich, dass ich überall in der Heavy Box picken kann. Setzen Sie den Code ganz am Ende.

Ich bin vergesslich und frage oft: "Hast du das Spielbuch auf diesen Host angewendet?" Ansible's conf hat eine Einstellung zum Protokollieren, aber ich dachte, es wäre schwierig, die Protokolle zu verfolgen, da die meisten Nachrichten, die zur Laufzeit fließen, so protokolliert werden, wie sie sind.

Wie auch immer, ich möchte eine Liste sehen, wann und welche Aufgabe welches Playbook für den Host ausgeführt wurde.

Das Ergebnis des geschriebenen Codes ist wie folgt (Einzug ist angemessen)

ansible.png

Es tut mir leid, dass es schwer zu sehen ist. Es tut mir leid, dass es angemessen ist. Wie auch immer, ich möchte Informationen so schlampig anzeigen. Wenn Sie diese Art von Mechanismus bereits haben, sagen Sie es mir bitte, ohne über diesen Punkt hinauszuschauen.

Über das Skript

  1. Stellen Sie sicher, dass Sie sich in der ansible conf anmelden können (enable log =. Wenn Sie die Standardeinstellung /var/log/ansible.log verwenden, vergessen Sie nicht, die Berechtigungen festzulegen).
  2. Wenn Sie das Protokoll löschen, können Sie den früheren Status nicht verfolgen. Löschen Sie das Protokoll daher nicht (es ist bedeutungslos, es sei denn, Sie protokollieren zum Zeitpunkt des Betriebs)
  3. Das Protokoll wächst jedoch, da das Protokoll aufgrund der Analyse des Playbooks bei der Ausführung des Skripts zunimmt (sorry).
  4. Es wird davon ausgegangen, dass das Playbook ordnungsgemäß in einem Verzeichnis mit dem Namen .yml abgelegt ist.
  5. Die Hostbereichsspezifikation (www [0:10] .hoge usw.) wird nicht unterstützt.
  6. Ich habe den Gruppennamen unterwegs erhalten, konnte mir aber nicht vorstellen, wie ich ihn in der Liste anzeigen soll, also habe ich ihn gerade erhalten.

Dann ist es der folgende Code.

list.py


#-*- coding: utf-8 -*-

import commands

#Einstellung der Textfarbe
GREEN = '\033[92m'
YELLOW = '\033[93m'
RED ='\033[91m'
ENDC = '\033[0m'

#Geben Sie den Speicherort der Protokolldatei an
log=open('/var/log/ansible.log','r')

#Geben Sie den Speicherort der Hosts-Datei an
hosts=open('/etc/ansible/hosts', 'r')

#Geben Sie das Playbook-Verzeichnis an
ymldir='/etc/ansible/'

#Analysieren Sie zuerst die Hosts und erstellen Sie eine Liste

hostline = hosts.readline()
groupnames = []
groupnames.append('default')
hostnames = []
hostname = []

while hostline:
	if hostline.startswith("#") or hostline.startswith("\n"):
		pass
	elif hostline.startswith("["):
		groupnames.append(hostline.rstrip(']\n').lstrip('['))
		hostnames.append(hostname)
		hostname = []
	else:
		hostname.append(hostline.rstrip('\n'))
	hostline = hosts.readline()
else:
	hostnames.append(hostname)

#Machen Sie eine Liste bis jetzt. Gruppenname[default, webserver...] hostnames[ [Standardhost, Standardhost2] , [Webserver..]]Gespeichert in.

#Überprüfen Sie dann das Playbook und erstellen Sie eine Liste der entsprechenden Hosts und Aufgaben, die ausgeführt werden sollen.
#Speichert den Namen der Playbook-Datei

playbooks=commands.getoutput('/bin/ls '+ymldir+' | grep .yml').split('\n')
playbookhosts=[]
playbookhost=[]
tasks=[]
task=[]

for i in playbooks:
	result = commands.getoutput('/usr/bin/ansible-playbook '+ymldir+i+' --list-hosts --list-tasks').split('\n')
	hostcount = 0
	taskcount = 0
	taskmode = 0
	for j in result:
		if "host count=" in j:
			hostcount = j[(j.rfind("=") + 1):]
			hostcount = int(hostcount)
		elif hostcount > 0:
			playbookhost.append(j.strip())
			hostcount -= 1
		if hostcount==0 and "play #" in j:
			taskmode = 1
		elif taskmode==1 and len(j.strip()) > 0:
			task.append(j.strip())
			
	playbookhosts.append(playbookhost)
	playbookhost=[]
	tasks.append(task)
	task=[]	

#Machen Sie eine Liste bis jetzt. Spielbücher[playbook1.yml, playbook2.yml...] playbookhosts[ [playbook1 host 1,playbook2 host 2], [playbook3...]]]Gleiches gilt für in gespeicherte Aufgaben

#Ich habe alle erforderlichen Informationen (da das Ausführungsergebnis sowie Datum und Uhrzeit auf der Protokollseite der Rest sind), daher werde ich sie tabellieren.
#Eine Tabelle für alle Aufgaben in der Host-Playbook-Aufgabe.

disptable=[]
rows=[]

j = 0
for i in playbookhosts:
	hcount=len(playbookhosts[playbookhosts.index(i)]) 
	#Wiederholen Sie diesen Vorgang für die Anzahl der Hosts
	while hcount > 0:
		hcount -= 1
		tcount=len(tasks[j])
		#Wiederholen Sie diesen Vorgang für die Anzahl der Aufgaben
		while tcount > 0:
			tcount -= 1
			rows.append(playbookhosts[j][hcount])
			rows.append(playbooks[j])
			rows.append(tasks[j][tcount])
			disptable.append(rows)
			rows=[]
	j += 1

#Protokollanalyse von hier

line = log.readline()

while line:
	#Von oben betrachtet, wenn ansible, das keine Prüfung ist, ausgeführt wird
	if "ansible-playbook" in line and ymldir in line and "--check" not in line and "--list-" not in line:
		#Speichern Sie möglicherweise das laufende Playbook
		cbook = line[line.index(ymldir)+len(ymldir):line.index(".yml")+4]
	try:
		if cbook and "TASK" in line:
			#Aufgabe speichern
			ctask = line[line.index("TASK: [")+len("TASK :["):line.index("]")]
	except NameError:
		pass
	try:
		if cbook and ctask:
			if " changed:" in line:
				#Host abrufen
				chost = line[line.index("[")+len("["):line.index("]")]
				#Distpable mit passendem Host und Aufgabe[[]]Ich möchte hinzufügen. Überschreiben, wenn etwas aufgezeichnet wird
				for i in disptable:
					if chost in i and cbook in i and ctask in i:
						try:
							if disptable[disptable.index(i)][3]:
								disptable[disptable.index(i)][3] = YELLOW + "changed" + ENDC
								disptable[disptable.index(i)][4] = line[:line.index(",")]
						except IndexError:
								disptable[disptable.index(i)].append(YELLOW + "changed" + ENDC)
								disptable[disptable.index(i)].append(line[:line.index(",")])
			elif " ok:" in line:
				#Host abrufen
				chost = line[line.index("[")+len("["):line.index("]")]
				#disptable mit passendem Host und Aufgabe[[]]Ich möchte hinzufügen. Wenn eine Änderung aufgezeichnet wird, wird sie jedoch nicht ausgeführt (da ich das Änderungsdatum und die Änderungszeit wissen möchte).
				for i in disptable:
					if chost in i and cbook in i and ctask in i:
						try:
							if disptable[disptable.index(i)][3] != "changed":
								disptable[disptable.index(i)][3] = GREEN + "ok" + ENDC
								disptable[disptable.index(i)][4] = line[:line.index(",")]
						except IndexError:
								disptable[disptable.index(i)].append(GREEN + "ok" + ENDC)
								disptable[disptable.index(i)].append(line[:line.index(",")])
			elif " failed:" in line:
				#Host abrufen
				chost = line[line.index("[")+len("["):line.index("]")]
				#Distpable mit passendem Host und Aufgabe[[]]Ich möchte hinzufügen. Überschreiben, wenn etwas aufgezeichnet wird
				for i in disptable:
					if chost in i and cbook in i and ctask in i:
						try:
							if disptable[disptable.index(i)][3]:
								disptable[disptable.index(i)][3] = RED + "failed" + ENDC
								disptable[disptable.index(i)][4] = line[:line.index(",")]
						except IndexError:
								disptable[disptable.index(i)].append(RED + "failed" + ENDC)
								disptable[disptable.index(i)].append(line[:line.index(",")])
	except NameError:
		pass
	line = log.readline()

#Teil anzeigen

print "HOST\t\t\tPLAYBOOK\t\tTASK\t\tRESULT\t\tDATE"

disptable.sort()

j = 0;
prvhost=""
prvyml=""
for i in disptable:
	nowhost = disptable[j][0]
	nowyml = disptable[j][1]
	if nowhost==prvhost:
		nowhost="\t\t"
		if nowyml==prvyml:
			nowyml="\t\t"
	try:
		print nowhost + '\t\t' +  nowyml + '\t\t' + disptable[j][2] + '\t\t' + disptable[j][3] + '\t\t' + disptable[j][4]
	except IndexError:
		print nowhost + '\t\t' +  nowyml + '\t\t' + disptable[j][2] + '\t\t' + "no data" + '\t\t' + ""

	prvhost = disptable[j][0]
	prvyml = disptable[j][1]
	j += 1

Bitte lassen Sie mich wissen, ob es einen besseren Weg gibt (ich denke, es gibt definitiv einen).

Recommended Posts

Zeigen Sie Protokolle mit Ansible auf leicht verständliche Weise an
[Maschinelles Lernen] Fassen wir die zufällige Gesamtstruktur auf leicht verständliche Weise zusammen
Setzen Sie Postfix 2.11 mit ansible in die Quelle
Überprüfen Sie, ob die Einstellungsdatei leicht verständlich gelesen wird
Ich werde erklären, wie man Pandas auf leicht verständliche Weise benutzt.
[Python] Ich habe versucht, den kollektiven Typ (Satz) auf leicht verständliche Weise zusammenzufassen.
Ein leicht verständlicher Vergleich der grundlegenden Grammatik von Python und Go
Ich habe versucht zu erklären, wie der Artikelinhalt mit der MediaWiki-API auf leicht verständliche Weise anhand von Beispielen abgerufen werden kann (Python 3).
Einführung in Deep Learning (1) --Chainer wird Anfängern leicht verständlich erklärt.
Erstellen Sie ein Bild mit Zeichen mit Python (Japanisch)
Senden Sie eine E-Mail mit Excel in Python
Da ich Tensorflow 2 Monate lang berührt habe, habe ich das Faltungs-Neuronale Netzwerk auf leicht verständliche Weise mit 95,04% der "handgeschriebenen Hiragana" -Identifikation erklärt.
Stoppen Sie eine Instanz mit einem bestimmten Tag in Boto3
[Für Anfänger] Ich möchte die Anzahl der Lernerfahrungen leicht verständlich erklären.
[Deep Learning von Grund auf neu] Ich habe versucht, die Gradientenbestätigung auf leicht verständliche Weise zu erklären.