Как передать выходные файлы сборки на виртуальную машину Azure с помощью PowerShell DSC?
Я играл с DSC и думаю, что это потрясающая платформа. Я провел несколько тестов, чтобы автоматизировать развертывание наших выходных данных сборки TFS и автоматически установить веб-приложения и настроить среду.
Это было относительно легко, так как я мог передать путь к своей папке перетаскивания в сценарий DSC, используя общий файловый ресурс в нашей внутренней сети, и использовать относительные пути внутри конфигурации для выбора каждого из наших модулей.
Теперь моя проблема заключается в том, как расширить это до виртуальных машин Azure. Мы хотели создать эти сценарии для автоматического развертывания на наших серверах контроля качества и производства, которые размещены на Azure. Поскольку они не находятся в нашем домене, я не могу использовать File
больше ресурсов для передачи файлов, но в то же время мне нужна точно такая же функциональность: я бы хотел как-то указать конфигурацию в нашей выходной папке сборки и скопировать файлы оттуда на виртуальные машины.
Есть ли какой-нибудь способ, которым я могу легко скопировать файлы папки для перетаскивания изнутри конфигурации, которая выполняется на этих удаленных компьютерах, без использования одной сети и домена? Я успешно настроил виртуальные машины для приема вызовов DSC через https с использованием сертификатов, и я только что обнаружил, что командлеты Azure PowerShell позволяют загружать конфигурацию в хранилище Azure и автоматически запускать ее на виртуальных машинах (что кажется намного лучше, чем то, что я делал).) но я до сих пор не знаю, как получить доступ к выводам сборки из виртуальной машины при запуске сценария конфигурации.
1 ответ
Я закончил тем, что использовал Publish-AzureVMDscExtension
Командлет для создания локального zip-файла, добавление выходных данных моей сборки в zip, а затем публикация zip, что-то вроде этого:
function Publish-AzureDscConfiguration
{
[CmdletBinding()]
Param(
[Parameter(Mandatory)]
[string] $ConfigurationPath
)
Begin{}
Process
{
$zippedConfigurationPath = "$ConfigurationPath.zip";
Publish-AzureVMDscConfiguration -ConfigurationPath:$ConfigurationPath -ConfigurationArchivePath:$zippedConfigurationPath -Force
$tempFolderName = [System.Guid]::NewGuid().ToString();
$tempFolderPath = "$env:TEMP\$tempFolderName";
$dropFolderPath = "$tempFolderPath\BuildDrop";
try{
Write-Verbose "Creating temporary folder and symbolic link to build outputs at '$tempFolderPath' ...";
New-Item -ItemType:Directory -Path:$tempFolderPath;
New-Symlink -LiteralPath:$dropFolderPath -TargetPath:$PWD;
Invoke-Expression ".\7za a $tempFolderPath\BuildDrop.zip $dropFolderPath -r -x!'7za.exe' -x!'DscDeployment.ps1'";
Write-Verbose "Adding component files to DSC package in '$zippedConfigurationPath'...";
Invoke-Expression ".\7za a $zippedConfigurationPath $dropFolderPath.zip";
}
finally{
Write-Verbose "Removing symbolic link and temporary folder at '$tempFolderPath'...";
Remove-ReparsePoint -Path:$dropFolderPath;
Remove-Item -Path:$tempFolderPath -Recurse -Force;
}
Publish-AzureVMDscConfiguration -ConfigurationPath:$zippedConfigurationPath -Force
}
End{}
}
Используя zip внутри zip, используемого Azure, я могу получить доступ к внутреннему содержимому в рабочем каталоге расширения PowerShell DSC (в папке DSCWork). Я попытался просто добавить папку для перетаскивания непосредственно в zip-архив (без предварительного архивирования), но затем расширение DSC копирует папку в путь к модулям, думая, что это модуль.
Я еще не совсем доволен этим решением, и у меня уже есть несколько проблем, но это имеет смысл в моей голове и должно работать нормально.