Deployment maszyny z funkcją Auto-Shutdown za pomocą szablonu arm

Szablony ARM mają nam pomać w pracy dlatego kiedy testuję wiele szablonów zdarza mi się, że zapominam o resource’ach, które utworzyłem w Azure co powoduje, że marnuję pieniądzę na subskrypcji. Powodem są zazwyczaj późne godziny pracy i przemęczenie, a później te z deploy’owane wirtualki działają przez parę dni nic nie robiąc. Dlatego postanowiłem sobie pomóc i do każego deploy’mentu dodaję wpis który wyłączy wirtualkę o jakiejś godzinie. Poniższy przykład zaprezentuje deplyment Windows’a 2016 z manage disk’iem i “Microsoft.DevTestLab/schedules”.

W poprzendich moich postach możesz przeczytać jak zalogować się do Azure za pomocą PowerShell i CLI oraz jak używać do deploymentów Visual Studio Code i Visual Studio.

Przydatne linki:

Źródła:

Kod:

Szablon jest bezobsługowy dlatego wystarczy wywołać go komendą:

New-AzureRMResourceGroupDeployment -ResourceGroupName XXX -TemplateURI "https://raw.githubusercontent.com/RogalaPiotr/JustCloudPublic/master/simple-vm-shutdown-on-time/azuredeploy.json" -adminUsername XXX -adminPassword XXX -vmName XXX

Poniżej mamy zaprezentowaną sekcję parameters. W niej możemy zdefiniować nazwę VM’ki jaka ma powstać oraz nazwę użytkownika i hasło. Aby ułatwić sobię pracę to dla DNS’u wykorzystałem funkcję unicqueString, aby generować sobię unikatową nazwę dla powstającego serwera.

{
 "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
 "contentVersion": "1.0.0.0",
 "parameters": {
 "adminUsername": {
 "type": "string",
 "defaultValue": "justcloud",
 "metadata": {
 "description": "Username for the Virtual Machine."
 }
 },
 "adminPassword": {
 "type": "string",
 "defaultValue": "YourPassword1",
 "metadata": {
 "description": "Password for the Virtual Machine."
 }
 },
 "dnsLabelPrefix": {
 "type": "string",
 "defaultValue": "[concat(uniqueString('x', resourceGroup().id))]",
 "metadata": {
 "description": "Unique DNS Name for the Public IP used to access the Virtual Machine."
 }
 },
 "vmName": {
 "type": "string",
 "defaultValue": "vmtest",
 "metadata": {
 "description": "Unique DNS Name for the Public IP used to access the Virtual Machine."
 }
 }
 },

Sekcja variables. W tej sekcji zefiniowane zostały wszystkie istotne wartości dla deploy’mentu. Wielkość maszyny, wersje Windows’a, adresacje itp. możesz modyfikować tutaj.

"variables": {
"windowsOSVersion":"2016-Datacenter",
"vmsize":"Standard_A1",
"publicIPAddressName":"[concat(parameters('vmName'), '-pip')]",
"virtualNetworkName":"[concat(parameters('vmName'), '-vnet')]",
"nicName":"[concat(parameters('vmName'), '-nic')]",
"subnetName":"[concat(parameters('vmName'), '-subnet')]",
"diskname":"[concat(parameters('vmName'), '-disk')]",
"addressPrefix":"10.0.0.0/16",
"subnetPrefix":"10.0.0.0/24",
"subnetRef":"[resourceId('Microsoft.Network/virtualNetworks/subnets', variables('virtualNetworkName'), variables('subnetName'))]",
"policyName":"[concat('shutdown-computevm-', parameters('vmName'))]",
"vmResourceId":"[resourceId('Microsoft.Compute/virtualMachines', parameters('vmName'))]"
},

Najważniejsza sekcja odpowidająca za wyłączenie maszyny to “type”:”Microsoft.DevTestLab/schedules” w niej definiujemy strefę czasową według której powinien być wyłączony serwer oraz godzinę.

Link do wszystkich stref znajdziesz na górze posta.

"timeZoneId":"W. Europe Standard Time",
"time":"1800"
{
"apiVersion":"2016-05-15",
"type":"Microsoft.DevTestLab/schedules",
"name":"[variables('policyName')]",
"location":"[resourceGroup().location]",
"dependsOn": [
"[resourceId('Microsoft.Compute/virtualMachines/', parameters('vmName'))]"
],
"properties": {
"status":"Enabled",
"timeZoneId":"W. Europe Standard Time",
"taskType":"ComputeVmShutdownTask",
"notificationSettings":{
"status":"Disabled",
"timeInMinutes":15,
"webhookUrl":null
},
"targetResourceId":"[variables('vmResourceId')]",
"dailyRecurrence":{
"time":"1800"
}
}
}
Efekt widoczny w portalu:
Mam nadzięję, że się przyda 🙂