Azure / Azure/azure-powershell
Add ability to run scripts from remote HTTP sources in Invoke-AzureRmVMRunCommand
- Dominant language
- C#
- Stars
- 4.8k
- Forks
- 4.3k
- Avg merge
- 2d 17h
- Merged PRs (30d)
- 51
Description
### Description
Right now, the `ScriptPath` parameter of this commandlet expects a Filesystem path only. As in, if I pass a Blob Storage URL with SAS token, it doesn't give out any output. When launched with `Debug` switch, I get the following.
This commandlet would be a much nicer alternative to a "Custom Script Extension" which differs for both Windows & Linux. Even in this case, the CommandID would be different but a simple if-else would be much more suitable when deploying Linux/Windows VMs from a single template and running commands. I can talk about the scenario more as well if required.
There are 2 things in this -
1. No output coming when an HTTP url is specified in the `ScriptPath` parameter.
2. Add ability to run commands from remote URLs since it is a much better way to run than the Custom Script Extensions.
### Script/Steps for Reproduction
```powershell
Invoke-AzureRmVMRunCommand -ResourceGroupName "DevEnv" -VMName "XZE-PD-DC-01" -CommandId "RunPowerShellScript" -ScriptPath "https://pranavdevtest.blob.core.windows.net/devcontainer/CustomScript.ps1?sp=r&st=2018-09-21T14:03:53Z&se=20153Z&spr=https&sv=2017-11-09&sig=BcIJr7tEr9ekJSADSm8%2Bs9yw%3D&sr=b"
```
### Module Version
```powershell
PS C:\WINDOWS\system32> Get-Module -ListAvailable
Directory: C:\Program Files\WindowsPowerShell\Modules
ModuleType Version Name ExportedCommands
---------- ------- ---- ----------------
Script 5.3.0 Azure {Get-AzureAutomationCertificate, Get-AzureAutomationConnection, New-Azur...
Script 0.5.4 Azure.AnalysisServices {Add-AzureAnalysisServicesAccount, Restart-AzureAnalysisServicesInstance...
Script 4.5.0 Azure.Storage {Get-AzureStorageTable, New-AzureStorageTableSASToken, New-AzureStorageT...
Script 6.8.1 AzureRM
Script 0.6.14 AzureRM.AnalysisServices {Resume-AzureRmAnalysisServicesServer, Suspend-AzureRmAnalysisServicesSe...
Script 6.1.5 AzureRM.ApiManagement {Add-AzureRmApiManagementRegion, Get-AzureRmApiManagementSsoToken, New-A...
Script 0.1.8 AzureRM.ApplicationInsights {Get-AzureRmApplicationInsights, New-AzureRmApplicationInsights, Remove-...
Script 5.1.1 AzureRM.Automation {Get-AzureRMAutomationHybridWorkerGroup, Get-AzureRmAutomationJobOutputR...
Script 4.0.10 AzureRM.Backup {Backup-AzureRmBackupItem, Enable-AzureRmBackupContainerReregistration, ...
Script 4.1.5 AzureRM.Batch {Remove-AzureRmBatchAccount, Get-AzureRmBatchAccount, Get-AzureRmBatchAc...
Script 0.14.6 AzureRM.Billing {Get-AzureRmBillingInvoice, Get-AzureRmBillingPeriod, Get-AzureRmEnrollm...
Script 5.0.5 AzureRM.Cdn {Get-AzureRmCdnProfile, Get-AzureRmCdnProfileSsoUrl, New-AzureRmCdnProfi...
Script 0.9.10 AzureRM.CognitiveServices {Get-AzureRmCognitiveServicesAccount, Get-AzureRmCognitiveServicesAccoun...
Script 5.5.2 AzureRM.Compute {Remove-AzureRmAvailabilitySet, Get-AzureRmAvailabilitySet, New-AzureRmA...
Script 0.3.7 AzureRM.Consumption {Get-AzureRmConsumptionBudget, Get-AzureRmConsumptionMarketplace, Get-Az...
Script 0.2.10 AzureRM.ContainerInstance {New-AzureRmContainerGroup, Get-AzureRmContainerGroup, Remove-AzureRmCon...
Script 1.0.10 AzureRM.ContainerRegistry {New-AzureRmContainerRegistry, Get-AzureRmContainerRegistry, Update-Azur...
Script 5.0.3 AzureRM.DataFactories {Remove-AzureRmDataFactory, Get-AzureRmDataFactoryRun, Get-AzureRmDataFa...
Script 0.5.10 AzureRM.DataFactoryV2 {Set-AzureRmDataFactoryV2, Update-AzureRmDataFactoryV2, Get-AzureRmDataF...
Script 5.1.4 AzureRM.DataLakeAnalytics {Get-AzureRmDataLakeAnalyticsDataSource, New-AzureRmDataLakeAnalyticsCat...
Script 6.1.2 AzureRM.DataLakeStore {Get-AzureRmDataLakeStoreTrustedIdProvider, Remove-AzureRmDataLakeStoreT...
Script 4.0.9 AzureRM.DevTestLabs {Get-AzureRmDtlAllowedVMSizesPolicy, Get-AzureRmDtlAutoShutdownPolicy, G...
Script 5.0.4 AzureRM.Dns {Get-AzureRmDnsRecordSet, New-AzureRmDnsRecordConfig, Remove-AzureRmDnsR...
Script 0.3.7 AzureRM.EventGrid {New-AzureRmEventGridTopic, Get-AzureRmEventGridTopic, Set-AzureRmEventG...
Script 0.6.10 AzureRM.EventHub {New-AzureRmEventHubNamespace, Get-AzureRmEventHubNamespace, Set-AzureRm...
Script 4.1.8 AzureRM.HDInsight {Get-AzureRmHDInsightJob, New-AzureRmHDInsightSqoopJobDefinition, Wait-A...
Script 5.1.3 AzureRM.Insights {Get-AzureRmMetricDefinition, Get-AzureRmMetric, Remove-AzureRmLogProfil...
Script 3.1.8 AzureRM.IotHub {Add-AzureRmIotHubKey, Get-AzureRmIotHubEventHubConsumerGroup, Get-Azure...
Script 5.2.1 AzureRM.KeyVault {Add-AzureKeyVaultCertificate, Update-AzureKeyVaultCertificate, Stop-Azu...
Script 4.1.4 AzureRM.LogicApp {Get-AzureRmIntegrationAccountAgreement, Get-AzureRmIntegrationAccountCa...
Script 0.18.5 AzureRM.MachineLearning {Move-AzureRmMlCommitmentAssociation, Get-AzureRmMlCommitmentAssociation...
Script 0.4.8 AzureRM.MachineLearningCompute {Get-AzureRmMlOpCluster, Get-AzureRmMlOpClusterKey, Test-AzureRmMlOpClus...
Script 0.2.5 AzureRM.MarketplaceOrdering {Get-AzureRmMarketplaceTerms, Set-AzureRmMarketplaceTerms}
Script 0.10.4 AzureRM.Media {Sync-AzureRmMediaServiceStorageKeys, Set-AzureRmMediaServiceKey, Get-Az...
Script 6.6.1 AzureRM.Network {Add-AzureRmApplicationGatewayAuthenticationCertificate, Get-AzureRmAppl...
Script 5.0.3 AzureRM.NotificationHubs {Get-AzureRmNotificationHub, Get-AzureRmNotificationHubAuthorizationRule...
Script 5.0.6 AzureRM.OperationalInsights {New-AzureRmOperationalInsightsAzureActivityLogDataSource, New-AzureRmOp...
Script 1.0.4 AzureRM.PolicyInsights {Get-AzureRmPolicyEvent, Get-AzureRmPolicyState, Get-AzureRmPolicyStateS...
Script 4.1.10 AzureRM.PowerBIEmbedded {Remove-AzureRmPowerBIWorkspaceCollection, Get-AzureRmPowerBIWorkspaceCo...
Script 5.5.1 AzureRM.Profile {Disable-AzureRmDataCollection, Disable-AzureRmContextAutosave, Enable-A...
Script 4.1.8 AzureRM.RecoveryServices {Get-AzureRmRecoveryServicesBackupProperty, Get-AzureRmRecoveryServicesV...
Script 4.4.1 AzureRM.RecoveryServices.Backup {Backup-AzureRmRecoveryServicesBackupItem, Get-AzureRmRecoveryServicesBa...
Script 0.2.9 AzureRM.RecoveryServices.SiteRec... {Edit-AzureRmRecoveryServicesAsrRecoveryPlan, Get-AzureRmRecoveryService...
Script 5.0.5 AzureRM.RedisCache {Remove-AzureRmRedisCachePatchSchedule, New-AzureRmRedisCacheScheduleEnt...
Script 0.3.10 AzureRM.Relay {New-AzureRmRelayNamespace, Get-AzureRmRelayNamespace, Set-AzureRmRelayN...
Script 6.4.2 AzureRM.Resources {Get-AzureRmProviderOperation, Remove-AzureRmRoleAssignment, Get-AzureRm...
Script 0.16.10 AzureRM.Scheduler {Disable-AzureRmSchedulerJobCollection, Enable-AzureRmSchedulerJobCollec...
Script 0.6.11 AzureRM.ServiceBus {New-AzureRmServiceBusNamespace, Get-AzureRmServiceBusNamespace, Set-Azu...
Script 0.3.12 AzureRM.ServiceFabric {Add-AzureRmServiceFabricApplicationCertificate, Add-AzureRmServiceFabri...
Script 4.11.3 AzureRM.Sql {Get-AzureRmSqlDatabaseTransparentDataEncryption, Get-AzureRmSqlDatabase...
Script 5.0.4 AzureRM.Storage {Get-AzureRmStorageAccount, Get-AzureRmStorageAccountKey, New-AzureRmSto...
Script 4.0.10 AzureRM.StreamAnalytics {Get-AzureRmStreamAnalyticsFunction, Get-AzureRmStreamAnalyticsDefaultFu...
Script 4.0.5 AzureRM.Tags {Remove-AzureRmTag, Get-AzureRmTag, New-AzureRmTag}
Script 4.1.1 AzureRM.TrafficManager {Add-AzureRmTrafficManagerCustomHeaderToEndpoint, Remove-AzureRmTrafficM...
Script 4.0.5 AzureRM.UsageAggregates Get-UsageAggregates
Script 5.0.9 AzureRM.Websites {Get-AzureRmAppServicePlan, Set-AzureRmAppServicePlan, New-AzureRmAppSer...
Script 1.0.1 Microsoft.PowerShell.Operation.V... {Get-OperationValidation, Invoke-OperationValidation}
Binary 1.0.0.1 PackageManagement {Find-Package, Get-Package, Get-PackageProvider, Get-PackageSource...}
Script 3.4.0 Pester {Describe, Context, It, Should...}
Script 1.0.0.1 PowerShellGet {Install-Module, Find-Module, Save-Module, Update-Module...}
Script 1.2 PSReadline {Get-PSReadlineKeyHandler, Set-PSReadlineKeyHandler, Remove-PSReadlineKe...
```
### Environment Data
```powershell
PS C:\WINDOWS\system32> $PSVersionTable
Name Value
---- -----
PSVersion 5.1.17134.228
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.17134.228
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
```
### Debug Output
```powershell
PS C:\WINDOWS\system32> Invoke-AzureRmVMRunCommand -Debug -ResourceGroupName "DevEnv" -VMName "XZE-PD-DC-01" -CommandId "RunPowerShellScript" -ScriptPath "https://pranavdevtest.blob.core.windows.net/devcontainer/CustomScript.ps1?sp=r&st=2018-09-21T14:03:53Z&se=2018-09-21&spr=https&sv=2017-11-09&sig=BcIJr7tErIKegcBd9ekJSADSm8%2Bs9yw%3D&sr=b"
DEBUG: 19:38:53 - InvokeAzureRmVMRunCommand begin processing with ParameterSet 'DefaultParameter'.
DEBUG: 19:38:55 - using account id 'aaa@aaa.com'...
Invoke-AzureRmVMRunCommand : Cannot find drive. A drive with the name 'https' does not exist.
At line:1 char:1
+ Invoke-AzureRmVMRunCommand -Debug -ResourceGroupName "Exelon-DevEnv" ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : CloseError: (:) [Invoke-AzureRmVMRunCommand], DriveNotFoundException
+ FullyQualifiedErrorId : Microsoft.Azure.Commands.Compute.Automation.InvokeAzureRmVMRunCommand
DEBUG: AzureQoSEvent: CommandName - Invoke-AzureRmVMRunCommand; IsSuccess - False; Duration - 00:00:57.5683518; Exception - System.Man
agement.Automation.DriveNotFoundException: Cannot find drive. A drive with the name 'https' does not exist.
at System.Management.Automation.SessionStateInternal.GetDrive(String name, Boolean automount)
at System.Management.Automation.SessionStateInternal.GetDrive(String name, Boolean automount)
at System.Management.Automation.LocationGlobber.GetDriveRootRelativePathFromPSPath(String path, CmdletProviderContext context, Bool
ean escapeCurrentLocation, PSDriveInfo& workingDriveForPath, CmdletProvider& providerInstance)
at System.Management.Automation.LocationGlobber.GetProviderPath(String path, CmdletProviderContext context, Boolean isTrusted, Prov
iderInfo& provider, PSDriveInfo& drive)
at System.Management.Automation.LocationGlobber.GetProviderPath(String path, ProviderInfo& provider)
at Microsoft.Azure.Commands.Compute.Automation.InvokeAzureRmVMRunCommand.b__0_0()
at Microsoft.Azure.Commands.Compute.ComputeClientBaseCmdlet.ExecuteClientAction(Action action)
at Microsoft.WindowsAzure.Commands.Utilities.Common.AzurePSCmdlet.ProcessRecord();
DEBUG: Finish sending metric.
DEBUG: 19:39:52 - InvokeAzureRmVMRunCommand end processing.
DEBUG: 19:39:52 - InvokeAzureRmVMRunCommand end processing.
```
Contributor guide
Assessment
This issue has not been assessed yet.