Archives mensuelles : juillet 2019

Gestion de la sauvegarde de vos VM Azure avec des tags.

Après l’automatisation du Patch Management, nous allons nous attaquer au sujet de la sauvegarde. Si on doit raisonner de manière industrielle, on va continuer avec les Tags. Cette fois, le Tag se nommera BackupPolicy. Tout comme pour la gestion des Patchs, on va imposer :

  • La présence d’un Tag BackupPolicy avec une valeur par défaut
  • Deux valeurs autorisées (Yes/No)

La subtilité, c’est que dans Azure Site Recovery, nous n’avons pas de fonctionnalité équivalente à Dynamic group. Nous devrons donc gérer cela nous même. On y reviendra plus tard dans ce billet. Première étape : Imposer des valeurs par défaut pour notre Tag BackupPolicy.

 

Imposer les valeurs pour le Tag BackupPolicy

Je vais repartir sur une Azure Policy que j’ai déjà utilisée dans le billet Automatiser Azure Update Management avec Azure Policy. On va donc faire un peu de réuse. On pourrait penser qu’il serait une bonne idée d’assigner l’Azure Policy au niveau du Management Group et non de chaque souscription mais en fait, il n’en est rien. Il y a un ordre d’évaluation des Azure Policies : layering-policies. Assigné au niveau du Management group, elle obligera les consommateurs à déployer leurs machines virtuelles avec le tag BackupPolicy configuré. Assigné au niveau de la souscription, les consommateurs pourront ignorer la configuration et tag (et cependant avoir une valeur par défaut) et le reconfigurer plus tard. L’Azure Policy est disponible ici : AZ-ALLOWEDTAGVALUES. Le code PowerShell pour importer l’Azure Policy est sensiblement identique à celui utilisé dans le billet Automatiser Azure Update Management avec Azure Policy

[String]$ManagementGroupName = « MGMT01 »

[String]$PolicyDefinitionFileURI = « https://raw.githubusercontent.com/Benoitsautierecellenza/BackupPolicy/master/Policies/AZ-ALLOWEDTAGVALUES/AZ-ALLOWEDTAGVALUES-02-RULE.json« 

[String]$PolicyParameterFileURI = « https://raw.githubusercontent.com/Benoitsautierecellenza/BackupPolicy/master/Policies/AZ-ALLOWEDTAGVALUES/AZ-ALLOWEDTAGVALUES-02-PARAMETERS.json« 

[String]$PolicyName = « AllowedValues4BackupPolicy »

New-AzPolicyDefinition -Name $PolicyName `

-DisplayName $PolicyName `

-Policy $PolicyDefinitionFileURI `

-Parameter $PolicyParameterFileURI `

-ManagementGroupName $ManagementGroupName `

-Mode All

clip_image002

Pour l’assignation, nous allons travailler au niveau d’une souscription.

[String]$ManagementGroupName = « MGMT01 »

[String]$SubscriptionID = (Get-Azcontext).Subscription.id

[String]$BackupPolicyTagName = « BackupPolicy »

[String]$DefaultTagValue = « No »

[String]$PolicyName = « AllowedValues4BackupPolicy »

[String]$PolicyAssignName = « MGMT01-VM-P1 »

[array]$AllowedValues = @(« Yes », « No »)

[String]$Scope = « /subscriptions/$SubscriptionID »

$PolicyDefinition = Get-AzPolicyDefinition -ManagementGroupName $ManagementGroupName -Name $PolicyName

$AssignParameters = @{

‘BackupPolicyTagName’ = $BackupPolicyTagName;

‘BackupPolicyTagAllowedValues’= ($AllowedValues)

}

New-AzPolicyAssignment -Name $PolicyAssignname `

-PolicyDefinition $PolicyDefinition `

-Scope $Scope `

-PolicyParameterObject $AssignParameters

clip_image004


Imposer une valeur par défaut pour le tag BackupPolicy

Notre Tag BackupPolicy accepte maintenant deux valeurs. Il faut maintenant imposer sa présence à l’aide d’un Azure Policy de Type Append. La Policy AZ-DEFAULTTAG va permettre d’imposer notre valeur par défaut. Rien de bien compliqué dans le code PowerShell ci-dessous :

[String]$ManagementGroupName = « MGMT01 »

[String]$PolicyDefinitionFileURI = « https://raw.githubusercontent.com/Benoitsautierecellenza/BackupPolicy/master/Policies/AZ-DEFAULTTAG/AZ-DEFAULTTAG-01-RULE.json« 

[String]$PolicyParameterFileURI = « https://raw.githubusercontent.com/Benoitsautierecellenza/BackupPolicy/master/Policies/AZ-DEFAULTTAG/AZ-DEFAULTTAG-01-PARAMETERS.json« 

[String]$PolicyName = « DefaultValue4BackupPolicy »

New-AzPolicyDefinition -Name $PolicyName `

-DisplayName $PolicyName `

-Policy $PolicyDefinitionFileURI `

-Parameter $PolicyParameterFileURI `

-ManagementGroupName $ManagementGroupName `

-Mode All

clip_image006

Ne reste plus qu’à assigner. Réaliser l’assignation par défaut au niveau du Management Group impose la même valeur par défaut pour le tag BackupPolicy que la souscription soit de type DEV, UAT ou PROD. Or, ce n’est pas logique. Pour un environnement de production, il est logique de vouloir imposer la sauvegarde.

$SubscriptionID = (Get-AzContext).Subscription.id

[String]$ManagementGroupName = « MGMT01 »

[String]$BackupPolicyTagName = « BackupPolicy »

[String]$DefaultTagValue = « No »

[String]$PolicyName = « DefaultValue4BackupPolicy »

[String]$PolicyAssignName = « MGMT01-VM-P2 »

[String]$AllowedValues = « Yes »

[String]$Scope = « /subscriptions/$SubscriptionID »

$PolicyDefinition = Get-AzPolicyDefinition -ManagementGroupName $ManagementGroupName -Name $PolicyName

$AssignParameters = @{

‘BackupPolicyTagName’ = $BackupPolicyTagName;

‘DefaultTagValue’=($AllowedValues)

}

New-AzPolicyAssignment -Name $PolicyAssignname `

-PolicyDefinition $PolicyDefinition `

-Scope $Scope `

-PolicyParameterObject $AssignParameters

clip_image008

 

Un peu de travail avec Azure Automation

Contrairement à Update Management, ce ne sera pas automatique, on doit donc un peu aider. Deux Runbooks vont être mis à disposition :

Le fonctionnement des deux Runbooks est sensiblement identique, à savoir parcourir la liste des machines virtuelles de la souscription pour identifier la valeur du tag BackupPolicy. Si le tag est configuré à « Yes » et que la machine virtuelle n’est pas inscrite à un plan de protection, alors elle sera ajoutée. Si le tag est configuré à « No », alors on s’assure que la machine virtuelle n’est plus inscrite au plan de protection. On va mettre tout cela en place avec une exécution planifiée toutes les quatre heures. Commençons par l’import dans une instance Azure Automation nommé » « ManagementAutomation » contenue dans le groupe de ressources « Management” :

[String]$ResourceGroupName = « Management »

[String]$AutomationAccountName = « ManagementAutomation »

Import-AzAutomationRunbook -ResourceGroupName $ResourceGroupName `

-AutomationAccountName $AutomationAccountName `

-Path « C:\localgit\BackupPolicy\Runbooks\AutomaticBackupVMS-ON.PS1 » `

-Type PowerShell `

-Published

Import-AzAutomationRunbook -ResourceGroupName $ResourceGroupName `

-AutomationAccountName $AutomationAccountName `

-Path « C:\localgit\BackupPolicy\Runbooks\AutomaticBackupVMS-OFF.PS1 » `

-Type PowerShell `

-Published

clip_image010

Dernière étape, la planification de ces deux runbooks pour une exécution toutes les quatre heures :

[String]$ScheduleName = « FOUR_HOURS »

[DateTime]$StartTime = ((Get-date).date).AddDays(1)

[Int]$SchedulePeriodInHours = 4

[String]$TimeZoneName = ([System.TimeZoneInfo]::Local).Id

New-AzAutomationSchedule -ResourceGroupName $ResourceGroupName `

-AutomationAccountName $AutomationAccountName `

-Name $ScheduleName `

-StartTime $StartTime `

-HourInterval $SchedulePeriodInHours `

-TimeZone $TimeZoneName

Register-AzAutomationScheduledRunbook -ResourceGroupName $ResourceGroupName `

-AutomationAccountName $AutomationAccountName `

-RunbookName « AutomaticBackupVMS-ON » `

-ScheduleName $ScheduleName

Register-AzAutomationScheduledRunbook -ResourceGroupName $ResourceGroupName `

-AutomationAccountName $AutomationAccountName `

-RunbookName « AutomaticBackupVMS-OFF » `

-ScheduleName $ScheduleName

clip_image012

Note : Pour que les Runbooks fonctionnent, il est essentiel que votre instance Azure Automation fonctionne uniquement avec des modules AZ et non ARM : https://aka.ms/azps-migration-guide. Ci-dessous le résultat de l’exécution du runbook AutomaticBackupVMS-ON.

clip_image014

 

Conclusion

Ça demande un peu plus de travail mais cela contribue à réduire la charge de support sur la gestion du IaaS. Il aurait été possible de configurer la sauvegarde pendant le déploiement de la machine virtuelle mais ce choix implique que celui qui déploie dispose de permissions sur l’instance Azure Site Recovery, ce qui n’est pas nécessaire dans mon implémentation. C’est de l’exploitation « sans-couture », transparente pour vos consommateurs Azure.