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)
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
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