[PYTHON] Affichez les journaux d'une manière facile à comprendre avec Ansible

Il se peut qu'il soit déjà dans d'autres outils de gestion de configuration, ou qu'il soit en fait dans Ansible, mais je n'ai pas pu le trouver, alors j'ai écrit le code au niveau "J'aurais aimé avoir quelque chose comme ça", donc je le posterai.

Je l'ai écrit en Python parce que je voulais éviter autant que possible d'ajouter des choses supplémentaires, mais comme j'étais un débutant en Python et que je n'avais pas étudié le programme correctement, je pense que je peux picorer partout dans la boîte lourde. Mettez le code à la toute fin.

Je suis oublieux, alors je demande souvent: "Avez-vous appliqué le playbook à cet hôte?" La configuration d'Ansible a un paramètre pour journaliser, mais j'ai pensé qu'il serait difficile de garder une trace des journaux car la plupart des messages qui circulent au moment de l'exécution sont journalisés tels quels.

Quoi qu'il en soit, je veux voir une liste de quand et quelle tâche de quel playbook a été exécuté pour l'hôte.

Le résultat du code écrit est le suivant (le retrait est approprié)

ansible.png

Je suis désolé, c'est difficile à voir. Je suis désolé que ce soit approprié. Quoi qu'il en soit, je veux afficher les informations d'une manière bâclée comme celle-ci. Si vous disposez déjà de ce genre de mécanisme, merci de me le dire sans regarder au-delà de ce point.

À propos du script

  1. Assurez-vous de pouvoir vous connecter à ansible conf (enable log =. Si vous utilisez la valeur par défaut /var/log/ansible.log, n'oubliez pas de définir les autorisations)
  2. Si vous supprimez le journal, vous ne pouvez pas suivre l'état passé, donc ne supprimez pas le journal (cela n'a aucun sens à moins que vous ne vous connectiez à partir du moment de l'opération)
  3. Cependant, le journal augmente car le journal augmente en raison de l'analyse du playbook lorsque le script est exécuté (désolé).
  4. On suppose que le playbook est correctement placé dans un répertoire avec le nom .yml.
  5. La spécification de la plage d'hôtes (www [0:10] .hoge, etc.) n'est pas prise en charge.
  6. J'ai eu le nom du groupe en cours de route, mais je ne savais pas comment l'afficher dans la liste, alors je l'ai juste obtenu.

Ensuite, c'est le code suivant.

list.py


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

import commands

#Réglage de la couleur du texte
GREEN = '\033[92m'
YELLOW = '\033[93m'
RED ='\033[91m'
ENDC = '\033[0m'

#Spécifiez l'emplacement du fichier journal
log=open('/var/log/ansible.log','r')

#Spécifiez l'emplacement du fichier d'hôtes
hosts=open('/etc/ansible/hosts', 'r')

#Spécifiez le répertoire du playbook
ymldir='/etc/ansible/'

#Analyser d'abord les hôtes et faire une 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)

#Faites une liste jusqu'à présent. nom de groupe[default, webserver...] hostnames[ [hôte par défaut, hôte par défaut2] , [serveur Web..]]Stocké dans.

#Ensuite, vérifiez le playbook et faites une liste des hôtes correspondants et des tâches à effectuer.
#Stocke le nom du fichier du playbook

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=[]	

#Faites une liste jusqu'à présent. playbooks[playbook1.yml, playbook2.yml...] playbookhosts[ [playbook1 hôte 1,playbook2 hôte 2], [playbook3...]]]La même chose s'applique aux tâches stockées dans

#J'ai toutes les informations nécessaires (car le résultat de l'exécution et la date et l'heure du côté du journal sont le reste), je vais donc les tabuler.
#Un tableau pour toutes les tâches de la tâche du playbook hôte.

disptable=[]
rows=[]

j = 0
for i in playbookhosts:
	hcount=len(playbookhosts[playbookhosts.index(i)]) 
	#Répétez pour le nombre d'hôtes
	while hcount > 0:
		hcount -= 1
		tcount=len(tasks[j])
		#Répétez pour le nombre de tâches
		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

#Analyse du journal à partir d'ici

line = log.readline()

while line:
	#En regardant du haut, quand il est possible que ce n'est pas un contrôle est exécuté
	if "ansible-playbook" in line and ymldir in line and "--check" not in line and "--list-" not in line:
		#Peut-être stocker le playbook en cours d'exécution
		cbook = line[line.index(ymldir)+len(ymldir):line.index(".yml")+4]
	try:
		if cbook and "TASK" in line:
			#Tâche de stockage
			ctask = line[line.index("TASK: [")+len("TASK :["):line.index("]")]
	except NameError:
		pass
	try:
		if cbook and ctask:
			if " changed:" in line:
				#récupérer l'hôte
				chost = line[line.index("[")+len("["):line.index("]")]
				#Distpable avec l'hôte et la tâche correspondants[[]]Je veux ajouter. Écraser si quelque chose est enregistré
				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:
				#récupérer l'hôte
				chost = line[line.index("[")+len("["):line.index("]")]
				#disptable avec l'hôte et la tâche correspondants[[]]Je veux ajouter. Cependant, si le changement est enregistré, il ne sera pas exécuté (car je veux connaître la date et l'heure du changement)
				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:
				#récupérer l'hôte
				chost = line[line.index("[")+len("["):line.index("]")]
				#Distpable avec l'hôte et la tâche correspondants[[]]Je veux ajouter. Écraser si quelque chose est enregistré
				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()

#Pièce d'affichage

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

S'il vous plaît laissez-moi savoir s'il y a une meilleure façon (je pense qu'il y en a certainement).

Recommended Posts

Affichez les journaux d'une manière facile à comprendre avec Ansible
[Apprentissage automatique] Résumons la forêt aléatoire de manière simple à comprendre
Mettre le suffixe 2.11 dans la source avec ansible
Vérifiez si le fichier de paramètres est lu de manière simple à comprendre
Je vais vous expliquer comment utiliser Pandas d'une manière facile à comprendre.
[Python] J'ai essayé de résumer le type collectif (ensemble) d'une manière facile à comprendre.
Comparer la grammaire de base de Python et Go d'une manière facile à comprendre
J'ai essayé d'expliquer comment obtenir le contenu de l'article avec l'API MediaWiki d'une manière facile à comprendre avec des exemples (Python 3)
Introduction au Deep Learning (1) --Chainer est expliqué d'une manière facile à comprendre pour les débutants-
Créer une image avec des caractères avec python (japonais)
Envoyer un e-mail avec Excel en pièce jointe en Python
Depuis que j'ai touché Tensorflow pendant 2 mois, j'ai expliqué le réseau de neurones convolutifs d'une manière facile à comprendre avec 95,04% d'identification «hiragana manuscrite».
Arrêter une instance avec une balise spécifique dans Boto3
[Pour les débutants] Je souhaite expliquer le nombre d’apprentissage d’une manière facile à comprendre.
[Deep Learning from scratch] J'ai essayé d'expliquer la confirmation du gradient d'une manière facile à comprendre.