OneLiner ou pas, telle est la question !

Cela fait plusieurs que je voulais faire ce billet, l’ébauche trainait dans les brouillons, et chaque fois que je passait devant, c’était « Ah oui il faut que je le fasse ! »… Voilà chose faite aujourd’hui :p

Ce billet pose une bonne question à savoir OneLiner ou pas ?

Dans certains cas (comme pourra le confirmer notre ami et collègue hypervisor.fr), le OneLiner est plus qu’un bout de code, mais presque un Art :p

C’est vrai que c’est assez pratique, on balance la ligne de code et zou pas besoin de lancer de script, renseigner des arguments, etc …

Oui mais voilà, à un certains moment, tout n’est malheureusement pas faisable en OneLiner (en vrai OneLiner, ie sans utilisation de « ; » pour séparer des commandes sur une seule ligne :p trick not allowed ^^).

Dans ce cas là, on se retrouve avec tous les excellents scripts de LucD ou d’Alan Renouf, mais voilà, ce sont généralement des fichiers *.ps1 et donc il faut les charger dans notre session PowerCLI, et si on a le malheur de fermer la fenêtre et/ou d’en ouvrir une autre, il faut les recharger à chaque fois…

Voilà, on s’est dit que le mieux serait de tirer meilleure partie des 2 écoles et donc de retrouver la faciliter que l’on a avec les OneLiner, aussi avec les scripts *.ps1.

Donc dans le principe, ce que l’on veut faire, c’est :

  1. un repository ou l’on mettra tous les scripts *.ps1
  2. une fonction qui permet le chargement à la demande de ces cmdlets/fonctions
  3. un chargement automatique de ces cmdlets/fonctions au lancement de la console PowerCLI

Pour le repository, c’est simple, il suffit de créer un dossier dans lequel on mettra tous les fichiers *.ps1 qui contiennent les fonctions/cmdlet que l’on souhaite utiliser. Par exemple, dès que l’on récupère le dernier script de PowerCLI Man : hop dans le dossier !

Pour le point 2, on va créer un fichier Load-KickAssScripts.ps1 qui sera dans le repository du point 1. vu juste avant et qui contiendra la fonction suivante :

# PowerCLI Scripts loader and reloader
# www.vmdude.fr

Function global:Load-KickAssScripts([switch]$Silent = $false) {
	# Repository path of all *.ps1 scripts
	$path4Source = "C:\PowerCLI Scripts"

	ForEach ($Script2Source in (Get-Childitem $path4Source\* -Include *.ps1 -Exclude Load-KickAssScripts.ps1)) {
		# Sourcing of all ps1 scripts in directory
		. $Script2Source.FullName
		if (!$Silent) {
			Write-Host -Foregroundcolor green "Source of" $Script2Source.FullName
		}
	}
}

Cela va nous permettre de pouvoir charger de nouveaux scripts *.ps1 dans notre repository sans avoir besoin de relancer notre sessions PowerCLI.

Ensuite, pour le point 3. on modifiera le fichier C:\Program Files (x86)\VMware\Infrastructure\vSphere PowerCLI\Scripts\Initialize-PowerCLIEnvironment.ps1 pour rajouter le bout de code suivant juste avant la signature du script (fin de fichier) :

...
. "C:\PowerCLI Scripts\Load-KickAssScripts.ps1"
Load-KickAssScripts -Silent

# SIG # Begin signature block
...

Dans notre exemple, on a un fichier Get-HelloWorldByVMdude.ps1 qui contient une fonction basique pour des tests :

# Sample Hello World for testing automatic sourcing on PowerCLI profiles
# www.vmdude.fr

Function global:Get-HelloWorldByVMdude {
	Write-Host -ForegroundColor red "Hello World !"
}

Une fois tout ça mis en place, on a le comportement souhaité :

  • Etape n°1 : on vérifie que le chargement automatique du fichier Get-HelloWorldByVMdude.ps1 soit effectif
  • Etape n°2 : on vérifie que la fonction soit bien disponible
  • Etape n°3 : on copie dans le repository un nouveau script nommé Get-YellowHelloWorldByVMdude.ps1 qui contient le code suivant :
# Sample Hello World for testing automatic sourcing on PowerCLI profiles
# www.vmdude.fr

Function global:Get-YellowHelloWorldByVMdude {
	Write-Host -ForegroundColor yellow "Hello World !"
}
  • Etape n°4 : on appelle la fonction de chargement automatique des scripts du repository
  • Etape n°5 : on revérifie que le nouveau soit bien chargé
  • Etape n°6 : on vérifie que la nouvelle fonction soit bien disponible

Au final, cela nous permet de profiter du meilleurs des 2 mondes et l’utilisation de la fonction de chargement automatique permet de s’affranchir de relancer la console PowerCLI à chaque ajout de script.

Donc pour terminer, à la question OneLiner ou MultiLiner, la réponse est : les 2 !

Vous pouvez télécharger les scripts utilisés pour les tests ici :

Note : Il est important que les fonctions définies dans les scripts du repository soient dans le contexte PowerCLI global (pour plus d’informations sur les scopes des fonctions, un Get-Help about_Scopes vous expliquera tout ce qu’il faut savoir !)

Pour s’en assurer il suffit d’avoir la déclaration de la fonction comme cela :

Function global:NOMFONCTION() {}

et non pas comme cela :

Function NOMFONCTION() {}

2 comments

Laisser un commentaire

Required fields are marked *.