La vie dans Azure
Bon, admettons, vous avez besoin de filter vos VM avec le type d’OS déployé dessus afin de savoir si vous avez plus de Linux ou de Windows dans Azure.
Avec Powershell, on se dit “ouais, c’est facile”. Un petit coup de Get-AzureRMVM et hop…
Cool, “OsType”, pile ce qu’on cherche, aller hop, on filtre avec | Select-Object
et ouais, c’est tout vide ! Et l’aide elle dit quoi ? Pas grand chose de plus :
On a plus le choix, on y va!
On va dedans !
Vérification des membres
Avec un petit Get-Member on liste les membres de la commande Get-AzureRMVM
On voit que OsType
n’existe pas, c’est donc une commande qui utilise une propriété calculée.
En revanche un élément , OsProfile
, parait correspondre au besoin.
On tente le Select-Object
?
Raté, ce coquin est un autre objet ! Etendons le !
Super! On a trouvé un truc!
On script ?
Déjà, on sait de base que le Script, on va s’en servir au moins une fois ;) donc pour le construire, il faut se poser quelques bonnes questions.
- Connexion a Azure ?
- Son nom (qui claque !)
Le nom j’ai déjà choisi (après tout…)
Get-cAzureRMVMOs
Personnellement, j’essaye de mettre un indicateur “c” pour “custom” sur mes functions pour les différencier des autres.
La connexion à Azure
J’utilise un petit bout de script que j’ai récupéré (je ne sais plus où, si l’auteur se manifeste !)
function Check-AzureRMSession () {
$Error.Clear()
#if context already exist
try {
Get-AzureRmVM -ErrorAction Stop | Out-Null
}
catch [System.Management.Automation.PSInvalidOperationException] {
Login-AzureRmAccount
}
$Error.Clear()
}
En gros, c’est simple, si on est connecté, il se passe rien, sinon on nous demande notre login. Simple, Efficace…
Le script en lui même
Function Get-cAzureRMVMOs {
[CmdletBinding()]
param(
)
Check-AzureRMSession
$vms = get-azurermvm
foreach ($vm in $vms) {
$osprofile = $($vm.OSProfile)
if ($($osprofile.LinuxConfiguration) -eq $null) {
$OsType = " Windows"
}
elseif ($($osprofile.WindowsConfiguration) -eq $null) {
$OsType = " Linux"
}
else {
$OsType = $osprofile
}
[PSCustomObject]@{
AvailabilitySetReference = $vm.AvailabilitySetReference
DiagnosticsProfile = $vm.DiagnosticsProfile
DisplayHint = $vm.DisplayHint
Extensions = $vm.Extensions
HardwareProfile = $vm.HardwareProfile
Id = $vm.Id
Identity = $vm.Identity
InstanceView = $vm.InstanceView
LicenseType = $vm.LicenseType
Location = $vm.Location
Name = $vm.Name
NetworkProfile = $vm.NetworkProfile
OSType = $OsType
Plan = $vm.Plan
ProvisioningState = $vm.ProvisioningState
RequestId = $vm.RequestId
ResourceGroupName = $vm.ResourceGroupName
StatusCode = $vm.StatusCode
StorageProfile = $vm.StorageProfile
Tags = $vm.Tags
Type = $vm.Type
VmId = $vm.VmId
}
}
}
Résultat ?
Ca fonctionne ! et le filtre ?
Du coup, avec notre super fonction, on peut filtrer comme on voulait :)
Get-cAzureRMVMOsType |?{ $_.OsType -eq "Windows" }
PS: Ce sript fonctionne très bien avec AzureRM.NetCore sur macOs :