如何使用PowerShell DSC将构建输出文件传输到Azure VM?

时间:2014-10-23 15:10:15

标签: deployment azure-storage file-transfer azure-virtual-machine dsc

我一直在玩DSC,我认为这是一个很棒的平台。我做了一些测试来自动部署我们的TFS构建输出,并自动安装Web应用程序并配置环境。

这相对简单,因为我可以使用内部网络上的文件共享将我的drop文件夹路径传递给DSC脚本,并使用配置中的相对路径来选择我们的每个模块。

我现在的问题是如何将其扩展到Azure虚拟机。我们希望创建这些脚本以自动部署到Azure上托管的QA和Production服务器。由于它们不在我们的域中,我不能再使用File资源来传输文件,但同时我想要完全相同的功能:我想以某种方式将配置指向我们的构建输出文件夹并将文件从那里复制到虚拟机。

我是否可以通过某种方式轻松地从这些远程计算机上运行的配置中复制drop文件夹,而无需共享同一网络和域?我成功配置了虚拟机以使用证书通过https接受DSC呼叫,我刚刚发现the Azure PowerShell cmdlets enable you to upload a configuration to Azure storage and run it in the VMs automatically(这似乎比我做的要好很多)但我仍然不知道我将如何访问运行配置脚本时,我的构建输出来自虚拟机内部。

1 个答案:

答案 0 :(得分:1)

我最终使用Publish-AzureVMDscExtension cmdlet创建了一个本地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{}
}

通过在Azure使用的zip中使用zip,我可以访问PowerShell DSC Extension的工作目录中的内部内容(在DSCWork文件夹中)。我尝试将drop文件夹直接添加到zip文件中(不先将其压缩),然后DSC Extension将文件夹复制到模块路径,认为它是一个模块。

我对这个解决方案并不完全满意,而且我正在a few problems already,但这在我的脑海中是有意义的,应该可以正常工作。