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