尝试通过 JSON 模板自定义扩展将 powershell 命令注入到 Azure RM VM
Trying to inject powershell commands in to Azure RM VMs via JSON template Custom Extension
这两行代码在我的 Azure RM VM 上本地下载、解压缩和执行我的所有 .bat 和 .msi 文件时都非常完美,我一直在通过我修改过的 ARM 模板进行部署太疯狂了,它可能充满了漏洞,因为我对这一切都很陌生。
我一直在尝试通过 Azure 文件共享通过 JSON 自定义脚本扩展来启动它们,但无济于事,我也一直在尝试通过 blob 容器启动它们,结果相同。我不断收到 "The network path can not be found." 的详细错误消息,我一直在扫描日志,但找不到有关如何解决此问题的任何信息。我是否正在以正确的方式接近我想要实现的目标?有没有更好的方法让我的安装在部署时使用动态参数自动启动?
cmdkey /add:$ArtifactsStorageAccountName.file.core.windows.net /u:$ArtifactsStorageAccountName /pass:$StorageAccountKey
Copy-Item -Path $InstallCustomScriptExtensionScriptFilePath -Destination C:\
Copy-Item -Path $InstallCustomScriptExtensionZIPFilePath -Destination C:\
Unblock-File -Path C:\UnzipMetaforceInstall.ps1
powershell -ExecutionPolicy Unrestricted -File C:\UnzipMetaforceInstall.ps1
PowerShell net use Z: \$ArtifactsStorageAccountName.file.core.windows.net$FileShareName\InstallMetaforce /u:artifactsstoaccastst $StorageAccountKey
PowerShell Copy-Item -Path Z:\UnzipMetaforceInstall.ps1 -Destination C:\
PowerShell Copy-Item -Path Z:\InstallMetaforce.zip -Destination C:\
PowerShell Unblock-File -Path C:\UnzipMetaforceInstall.ps1
PowerShell -ExecutionPolicy Unrestricted -File C:\UnzipMetaforceInstall.ps1
{
"name": "InstallCustomScriptExtension",
"type": "extensions",
"location": "[variables('location')]",
"apiVersion": "2015-06-15",
"dependsOn": [
"[concat('Microsoft.Compute/virtualMachines/', concat(parameters('vmNamePrefix'), copyindex(1)))]",
"DSCConfig"
],
"tags": {
"displayName": "InstallCustomScriptExtension"
},
"properties": {
"publisher": "Microsoft.Compute",
"type": "CustomScriptExtension",
"typeHandlerVersion": "1.4",
"autoUpgradeMinorVersion": true,
"settings": {
"fileUris": [
"[parameters('InstallCustomScriptExtensionScriptFilePath')]"
],
"commandToExecute": "[parameters('CommandToExecuteCustomScript')]"
},
"protectedSettings": {
"storageAccountName": "[parameters('ArtifactsStorageAccountName')]",
"storageAccountKey": "[parameters('StorageAccountKey')]"
}
}
}
期待能得到任何帮助,我已经在这一步停留了大约两周了。如果您需要任何其他信息,或者如果我有任何不清楚的地方,请告诉我,我会看看我能做些什么。第一次发帖,好久reader.
"The network path can not be found." 让我相信这是一种 我认为将 azure 文件附加为带有脚本的网络驱动器并不总是可靠的。我在链接主题中提供了直接从 Azure 文件下载的解决方案,我认为这对您也有帮助。如果它不适合你,请告诉我。
您也可以在此处查看示例:
https://github.com/bmoore-msft/AzureRM-Samples
然后查看文件夹:
https://github.com/bmoore-msft/AzureRM-Samples/tree/master/VMCSEInstallFilePS
文件夹中的示例模板使用自定义脚本扩展从 Azure blob 存储(或另一个 url)安装文件。
repo 的根包含一个 PowerShell 脚本,它可以做两件事:
- 将要安装的文件从本地计算机(例如构建计算机)复制到 Azure 存储中,并使用 sasToken 和
对其进行保护
- 部署 AzureRM 模板并将 blob 的 URI 和 sasToken 传递到部署中。
还要注意示例中的 "forceUpdateTag"(参见:)。如果您需要一遍又一遍地部署 json 模板,这需要在 VM 已经存在时获得 运行 的扩展(您也可以通过 PowerShell Remove-AzureRMVMExtension,标签可能更快).
如果您的脚本不包含任何机密或知识 属性,您可以将其上传到 blob 存储容器并将访问策略设置为“blob” (不是'private')然后你就不用担心 SAS 令牌了。
此模板适用于我(今天是 2016 年 4 月 28 日),具有 blob 存储和 powershell。
{
"type": "Microsoft.Compute/virtualMachines/extensions",
"name": "[concat(variables('vmName'),'/CustomScriptExtension')]",
"apiVersion": "2015-06-15",
"location": "[resourceGroup().location]",
"tags": {
"displayName": "CustomScriptExtension"
},
"dependsOn": [
"[concat('Microsoft.Compute/virtualMachines/', variables('vmName'))]"
],
"properties": {
"publisher": "Microsoft.Compute",
"type": "CustomScriptExtension",
"typeHandlerVersion": "1.8",
"settings": {
"fileUris": [ "[parameters('launchScriptBlobUri')]" ],
"commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -file ',parameters('scriptFileName'))]"
}
}
}
我本周末早些时候成功破解了它。通过 powershell / JSON 参数也使我的脚本动态化,它就像一个魅力。
{
"name": "InstallCustomScriptExtension",
"type": "extensions",
"location": "[variables('location')]",
"apiVersion": "2015-06-15",
"dependsOn": [
"[concat('Microsoft.Compute/virtualMachines/', concat(parameters('vmNamePrefix'), copyindex(1)))]",
"DSCConfig"
],
"tags": {
"displayName": "InstallCustomScriptExtension"
},
"properties": {
"publisher": "Microsoft.Compute",
"type": "CustomScriptExtension",
"typeHandlerVersion": "1.4",
"autoUpgradeMinorVersion": true,
"settings": {
"fileUris": [
"[concat(parameters('_artifactsLocation'), '/', parameters('InstallCustomScriptExtensionScriptFilePath'))]"
],
"commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File ', parameters('InstallCustomScriptExtensionScriptFilePath'), ' -ArtifactsStorageAccountName ', parameters('ArtifactsStorageAccountName'), ' -FileShareName ', parameters('FileShareName'), ' -StorageAccountKey ', parameters('StorageAccountKey'))]"
},
"protectedSettings": {
"storageAccountName": "[parameters('ArtifactsStorageAccountName')]",
"storageAccountKey": "[parameters('StorageAccountKey')]"
}
}
}
我的解压脚本内部现在看起来像这样:
param(
[string]$ArtifactsStorageAccountName,
[string]$FileShareName,
[string]$StorageAccountKey
)
PowerShell net use Z: \$ArtifactsStorageAccountName.file.core.windows.net$FileShareName\Install /u:$ArtifactsStorageAccountName $StorageAccountKey; PowerShell Copy-Item -Path Z:\Install.zip -Destination C:\;
$shell = New-Object -ComObject shell.application
$zip = $shell.NameSpace("C:\Install.zip")
MkDir("C:\Install")
foreach ($item in $zip.items()) {
$shell.Namespace("C:\Install").CopyHere($item)
}
Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Force
cd "C:\Install"
Unblock-File -Path "C:\Install\Install.ps1"
"C:\Install\Install.ps1" | Invoke-Expression
它可能需要做更多的工作,我的 JSON 模板中的受保护设置可能是不必要的,但目前它完成了工作,我现在有了一个可以继续构建的一键式部署。
这两行代码在我的 Azure RM VM 上本地下载、解压缩和执行我的所有 .bat 和 .msi 文件时都非常完美,我一直在通过我修改过的 ARM 模板进行部署太疯狂了,它可能充满了漏洞,因为我对这一切都很陌生。
我一直在尝试通过 Azure 文件共享通过 JSON 自定义脚本扩展来启动它们,但无济于事,我也一直在尝试通过 blob 容器启动它们,结果相同。我不断收到 "The network path can not be found." 的详细错误消息,我一直在扫描日志,但找不到有关如何解决此问题的任何信息。我是否正在以正确的方式接近我想要实现的目标?有没有更好的方法让我的安装在部署时使用动态参数自动启动?
cmdkey /add:$ArtifactsStorageAccountName.file.core.windows.net /u:$ArtifactsStorageAccountName /pass:$StorageAccountKey
Copy-Item -Path $InstallCustomScriptExtensionScriptFilePath -Destination C:\
Copy-Item -Path $InstallCustomScriptExtensionZIPFilePath -Destination C:\
Unblock-File -Path C:\UnzipMetaforceInstall.ps1
powershell -ExecutionPolicy Unrestricted -File C:\UnzipMetaforceInstall.ps1
PowerShell net use Z: \$ArtifactsStorageAccountName.file.core.windows.net$FileShareName\InstallMetaforce /u:artifactsstoaccastst $StorageAccountKey
PowerShell Copy-Item -Path Z:\UnzipMetaforceInstall.ps1 -Destination C:\
PowerShell Copy-Item -Path Z:\InstallMetaforce.zip -Destination C:\
PowerShell Unblock-File -Path C:\UnzipMetaforceInstall.ps1
PowerShell -ExecutionPolicy Unrestricted -File C:\UnzipMetaforceInstall.ps1
{
"name": "InstallCustomScriptExtension",
"type": "extensions",
"location": "[variables('location')]",
"apiVersion": "2015-06-15",
"dependsOn": [
"[concat('Microsoft.Compute/virtualMachines/', concat(parameters('vmNamePrefix'), copyindex(1)))]",
"DSCConfig"
],
"tags": {
"displayName": "InstallCustomScriptExtension"
},
"properties": {
"publisher": "Microsoft.Compute",
"type": "CustomScriptExtension",
"typeHandlerVersion": "1.4",
"autoUpgradeMinorVersion": true,
"settings": {
"fileUris": [
"[parameters('InstallCustomScriptExtensionScriptFilePath')]"
],
"commandToExecute": "[parameters('CommandToExecuteCustomScript')]"
},
"protectedSettings": {
"storageAccountName": "[parameters('ArtifactsStorageAccountName')]",
"storageAccountKey": "[parameters('StorageAccountKey')]"
}
}
}
期待能得到任何帮助,我已经在这一步停留了大约两周了。如果您需要任何其他信息,或者如果我有任何不清楚的地方,请告诉我,我会看看我能做些什么。第一次发帖,好久reader.
"The network path can not be found." 让我相信这是一种
您也可以在此处查看示例:
https://github.com/bmoore-msft/AzureRM-Samples
然后查看文件夹:
https://github.com/bmoore-msft/AzureRM-Samples/tree/master/VMCSEInstallFilePS
文件夹中的示例模板使用自定义脚本扩展从 Azure blob 存储(或另一个 url)安装文件。
repo 的根包含一个 PowerShell 脚本,它可以做两件事:
- 将要安装的文件从本地计算机(例如构建计算机)复制到 Azure 存储中,并使用 sasToken 和 对其进行保护
- 部署 AzureRM 模板并将 blob 的 URI 和 sasToken 传递到部署中。
还要注意示例中的 "forceUpdateTag"(参见:
如果您的脚本不包含任何机密或知识 属性,您可以将其上传到 blob 存储容器并将访问策略设置为“blob” (不是'private')然后你就不用担心 SAS 令牌了。
此模板适用于我(今天是 2016 年 4 月 28 日),具有 blob 存储和 powershell。
{
"type": "Microsoft.Compute/virtualMachines/extensions",
"name": "[concat(variables('vmName'),'/CustomScriptExtension')]",
"apiVersion": "2015-06-15",
"location": "[resourceGroup().location]",
"tags": {
"displayName": "CustomScriptExtension"
},
"dependsOn": [
"[concat('Microsoft.Compute/virtualMachines/', variables('vmName'))]"
],
"properties": {
"publisher": "Microsoft.Compute",
"type": "CustomScriptExtension",
"typeHandlerVersion": "1.8",
"settings": {
"fileUris": [ "[parameters('launchScriptBlobUri')]" ],
"commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -file ',parameters('scriptFileName'))]"
}
}
}
我本周末早些时候成功破解了它。通过 powershell / JSON 参数也使我的脚本动态化,它就像一个魅力。
{
"name": "InstallCustomScriptExtension",
"type": "extensions",
"location": "[variables('location')]",
"apiVersion": "2015-06-15",
"dependsOn": [
"[concat('Microsoft.Compute/virtualMachines/', concat(parameters('vmNamePrefix'), copyindex(1)))]",
"DSCConfig"
],
"tags": {
"displayName": "InstallCustomScriptExtension"
},
"properties": {
"publisher": "Microsoft.Compute",
"type": "CustomScriptExtension",
"typeHandlerVersion": "1.4",
"autoUpgradeMinorVersion": true,
"settings": {
"fileUris": [
"[concat(parameters('_artifactsLocation'), '/', parameters('InstallCustomScriptExtensionScriptFilePath'))]"
],
"commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File ', parameters('InstallCustomScriptExtensionScriptFilePath'), ' -ArtifactsStorageAccountName ', parameters('ArtifactsStorageAccountName'), ' -FileShareName ', parameters('FileShareName'), ' -StorageAccountKey ', parameters('StorageAccountKey'))]"
},
"protectedSettings": {
"storageAccountName": "[parameters('ArtifactsStorageAccountName')]",
"storageAccountKey": "[parameters('StorageAccountKey')]"
}
}
}
我的解压脚本内部现在看起来像这样:
param(
[string]$ArtifactsStorageAccountName,
[string]$FileShareName,
[string]$StorageAccountKey
)
PowerShell net use Z: \$ArtifactsStorageAccountName.file.core.windows.net$FileShareName\Install /u:$ArtifactsStorageAccountName $StorageAccountKey; PowerShell Copy-Item -Path Z:\Install.zip -Destination C:\;
$shell = New-Object -ComObject shell.application
$zip = $shell.NameSpace("C:\Install.zip")
MkDir("C:\Install")
foreach ($item in $zip.items()) {
$shell.Namespace("C:\Install").CopyHere($item)
}
Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Force
cd "C:\Install"
Unblock-File -Path "C:\Install\Install.ps1"
"C:\Install\Install.ps1" | Invoke-Expression
它可能需要做更多的工作,我的 JSON 模板中的受保护设置可能是不必要的,但目前它完成了工作,我现在有了一个可以继续构建的一键式部署。