Как подключить диск с данными к виртуальной машине Windows Server Azure и отформатировать его непосредственно в шаблоне? - PullRequest
0 голосов
/ 06 июля 2018

Мне нужно подключить диски с данными к виртуальным машинам (в VMSS), и мне нравится мгновенно форматировать и использовать диск без дальнейшего ручного вмешательства. Как я могу добиться этого непосредственно в шаблоне ARM?

Ответы [ 2 ]

0 голосов
/ 07 июля 2018

Я добавил 3 параметра в шаблон ARM:

...
"scriptLocation": {
  "type": "string",
  "metadata": {
    "description": "Location of custom extension scripts on storage account container"
  }
},
"scriptStorageAccount": {
  "type": "string",
  "metadata": {
    "description": "Name of custom extension scripts storage account"
  }
},
"scriptStorageAccountKey": {
  "type": "string",
  "metadata": {
    "description": "Key to custom extension scripts storage account"
  }
},
...

Эти параметры заполняются в сценарии PowerShell, загружающем файл пользовательского сценария расширения и вызывающем New-AzureRmResourceGroupDeployment.

...
$StorageAccountName = "mydeploymentstorage"
$StorageContainerName = "ext"
$ArtifactStagingDirectory = ".\ExtensionScripts"
...
# transfer Extension script to Storage    $StorageAccount = (Get-AzureRmStorageAccount | Where-Object{$_.StorageAccountName -eq $StorageAccountName})
$StorageAccountContext = $StorageAccount.Context
New-AzureStorageContainer -Name $StorageContainerName -Context $StorageAccountContext -Permission Container -ErrorAction SilentlyContinue *>&1
$ArtifactFilePaths = Get-ChildItem $ArtifactStagingDirectory -Recurse -File | ForEach-Object -Process {$_.FullName}
foreach ($SourcePath in $ArtifactFilePaths) {
    Write-Host "transfering" $SourcePath
    $BlobName = $SourcePath.Substring($SourcePath.LastIndexOf("\")+1)
    Set-AzureStorageBlobContent -File $SourcePath -Blob $BlobName -Container $StorageContainerName -Context $StorageAccountContext -Force -ErrorAction Stop
}

# prepare and pass script parameters
$DynamicParameters = New-Object -TypeName Hashtable
$DynamicParameters["scriptLocation"] = $StorageAccountContext.BlobEndPoint + $StorageContainerName
$DynamicParameters["scriptStorageAccount"] = $StorageAccountName
$DynamicParameters["scriptStorageAccountKey"] = ($StorageAccount | Get-AzureRmStorageAccountKey).Value[0]
...
# start deployment
New-AzureRmResourceGroupDeployment -Name ((Get-ChildItem $TemplateFile).BaseName + '-' + ((Get-Date).ToUniversalTime()).ToString('MMdd-HHmm')) ` `
    -ResourceGroupName $ResourceGroupName `
    -TemplateFile $TemplateFile `
    -TemplateParameterFile $TemplateParametersFile `
    @DynamicParameters `
    -Verbose

В VMSS extensionProfile я добавил собственное расширение скрипта (чтобы оно было в одном месте с другими расширениями):

...
      "storageProfile": {
        "imageReference": {
          "publisher": "[parameters('vmImagePublisher')]",
          "offer": "[parameters('vmImageOffer')]",
          "sku": "[parameters('vmImageSku')]",
          "version": "[parameters('vmImageVersion')]"
        },
        "osDisk": {
          "caching": "ReadWrite",
          "createOption": "FromImage",
          "managedDisk": {
            "storageAccountType": "[parameters('storageAccountType')]"
          }
        },
        "dataDisks": [
          {
            "diskSizeGB": 128,
            "lun": 0,
            "createOption": "Empty",
            "managedDisk": {
              "storageAccountType": "[parameters('storageAccountType')]"
            }
          }
        ]
      }
...
    "virtualMachineProfile": {
      "extensionProfile": {
        "extensions": [
...
          {
            "name": "[concat(parameters('vmNodeType0Name'),'_CreateDisk')]",
            "properties": {
              "publisher": "Microsoft.Compute",
              "type": "CustomScriptExtension",
              "typeHandlerVersion": "1.9",
              "autoUpgradeMinorVersion": true,
              "settings": {
                "fileUris": [
                  "[concat(parameters('scriptLocation'),'/CreateDisk.ps1')]"
                ]
              },
              "protectedSettings": {
                "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File CreateDisk.ps1",
                "storageAccountName": "[parameters('scriptStorageAccount')]",
                "storageAccountKey": "[parameters('scriptStorageAccountKey')]"
              }
            }
          }
        ]

И, наконец, создал сценарий. Моя первоначальная проблема заключалась в том, что у меня не было достаточно места на C: для ... - SKU небольшого диска для хранения всех образов докера, поэтому я переместил docker на новый диск.

# create and format disk

Get-Disk |
    Where PartitionStyle -eq 'Raw' |
    Select-Object -First 1 |
    Initialize-Disk -PartitionStyle MBR -PassThru |
    New-Partition -DriveLetter F -UseMaximumSize |
    Format-Volume -FileSystem NTFS -NewFileSystemLabel "Containers" -Confirm:$false

# move docker to F:\docker

docker images -a -q | %{docker rmi $_ --force}

Stop-Service Docker
$service = (Get-Service Docker)
$service.WaitForStatus("Stopped","00:00:30")

@{"data-root"="F:\docker"} | ConvertTo-Json | Set-Content    C:\programdata\docker\config\daemon.json
Get-Process docker* | % {Stop-Process -Id $_.Id -Force}
docker system info

Copy-Item C:\programdata\docker F:\docker -Recurse

Start-Service Docker
0 голосов
/ 06 июля 2018

Вы можете использовать в шаблоне customscript объект, который указывает на скрипт lo

{
"type": "Microsoft.Compute/virtualMachineScaleSets/extensions",
"name": "[concat(variables('VmssName'),'/', variables('extensionName'))]",
"apiVersion": "2015-05-01-preview",
"location": "[resourceGroup().location]",
"dependsOn": [
    "[concat('Microsoft.Compute/virtualMachineScaleSets/', variables('VmssName'))]"
],
"properties": {
    "publisher": "Microsoft.Azure.Extensions",
    "type": "CustomScript",
    "typeHandlerVersion": "2.0",
    "autoUpgradeMinorVersion": true,
    "settings": {
        "fileUris": [
            "[parameters('BootScriptUri')]"
        ]
    },
    "protectedSettings": {
        "commandToExecute": "[parameters('commandToExecute')]"
    }
}

тогда такой скрипт

Get-Disk | 
    Where partitionstyle -eq 'raw' |
    Initialize-Disk -PartitionStyle MBR -PassThru |
    New-Partition -DriveLetter "F" -UseMaximumSize |
Format-Volume -FileSystem NTFS -NewFileSystemLabel "DataDisk" -Confirm:$false

Существует версия скрипта для Linux - с гораздо большим количеством возможностей! в https://github.com/Azure/azure-quickstart-templates/blob/master/shared_scripts/ubuntu/vm-disk-utils-0.1.sh

...