Как передать выходные файлы сборки на виртуальную машину 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 копирует папку в путь к модулям, думая, что это модуль.

Я еще не совсем доволен этим решением, и у меня уже есть несколько проблем, но это имеет смысл в моей голове и должно работать нормально.

Другие вопросы по тегам