Share via


Powershell Workflow - error while attaching NIC to subnet

Question

Wednesday, March 29, 2017 8:35 AM

Hi All,

I'm trying to create a parallel Workflow script but facing some challenges while attaching NIC to existing Subnet. I'm getting the following error.

Microsoft.PowerShell.Utility\Write-Error : Cannot validate argument on parameter 'SubnetId'. The argument is null or empty. Provide an argument that is not null or empty, and then try the command again.

Following is my Workflow script which creates VNet, Subnet, NSG, PIP and tries to create NIC from AzureRM automation Runbook.

********************************************************************************************

workflow Parallel-New-Gulab
{

Param
    (
        [Parameter(Mandatory=$true)]
        [String] $NewVMName,

        [Parameter(Mandatory=$true)]
        [String] $VMLocation,

        [Parameter(Mandatory=$true)]
        [String] $VMSize,

        [Parameter(Mandatory=$true)]
        [String] $OSProfile,

        [Parameter(Mandatory=$true)]
        [String] $SourceImageRGName,

        [Parameter(Mandatory=$true)]
        [String] $SourceImageName,

        [Parameter(Mandatory=$true)]
        [String] $SharedResourcesRGName,

        [Parameter(Mandatory=$true)]
        [String] $NSGName,

        [Parameter(Mandatory=$true)]
        [String] $VNetName,

        [Parameter(Mandatory=$true)]
        [String] $SubnetName,

        [Parameter(Mandatory=$true)]
        [String] $AdminUserName,

        [Parameter(Mandatory=$true)]
        [String] $AdminPassword,

        [Parameter(Mandatory=$False)]
        [String] $DataDSKSize
    )

Try
    {
        InLineScript
            {
                $ErrorActionPreference = 'Stop'
                $SNetAddPrefix = "10.0.0.0/26"
                $VNetAddPrefix = "10.0.0.0/26"

"Create ResourceGroup for Resources"

        New-AzureRmResourceGroup -Name $Using:SharedResourcesRGName -Location $Using:VMLocation -Force

"Successfully Created ResourceGroup for Resources"

"# Shared Network Resources for all NewVMs"

"Creating New Network Security Group"

        $nsg = New-AzureRmNetworkSecurityGroup -ResourceGroupName $Using:SharedResourcesRGName -Location $Using:VMLocation `
        -Name $Using:NSGName

"Creating Virtual Network ad Subnet Config"

        $subnet = New-AzureRmVirtualNetworkSubnetConfig -Name $Using:SubnetName -AddressPrefix $SNetAddPrefix

        $vnet = New-AzureRmVirtualNetwork -Name $Using:VNetName -ResourceGroupName $Using:SharedResourcesRGName `
        -Location $Using:VMLocation -AddressPrefix $VNetAddPrefix -Subnet $subnet

"Setting Virtual Network with Subnet"

        Set-AzureRmVirtualNetworkSubnetConfig -Name $subnet.Name -VirtualNetwork $vnet -AddressPrefix $SNetAddPrefix `
           
        Set-AzureRmVirtualNetwork -VirtualNetwork $vnet
}

Foreach -parallel ($i in 1..1)
   
    {
        $ErrorActionPreference = 'Stop'

$VMName = "$NewVMName"+$i.ToString("00")
           
"Create ResourceGroup for VMName"

        New-AzureRmResourceGroup -Name $VMName -Location $VMLocation -Force

"Successfully Created ResourceGroup"

"#Creating Network Config Foreach VM"

"Get Network Security Group Information"
$gnsg = Get-AzureRmNetworkSecurityGroup -Name $NSGName -ResourceGroupName "$SharedResourcesRGName"

"Get Virtual Network Information"
$gvnet = Get-AzureRmVirtualNetwork -Name $VNetName -ResourceGroupName $SharedResourcesRGName

Write-Output $gvnet.SubentsText

        $pip = New-AzureRmPublicIpAddress -Name "$VMName-PIP" -ResourceGroupName $VMName -Location $VMLocation `
        -AllocationMethod Dynamic -DomainNameLabel $VMName -Force

        $nic = New-AzureRmNetworkInterface -Name "$VMName-NIC" -ResourceGroupName $VMName -Location $VMLocation `
        -SubnetId $gvnet.Subnets[0].ID -PublicIpAddressId $pip.Id -NetworkSecurityGroupId $gnsg.Id -Force
}              
  
    }

Catch
    {
            write-output "Exception Caught..."
            Write-Error -Message $_.Exception
            $ErrorMessage = $_.Exception.Message  
            Write-Output "Error Occurred: Message: $ErrorMessage."

    }
  }

***************************************************************************************

How do I get the value of Subnet in AzureRM Workflow runbook

Gulab Pasha

All replies (6)

Wednesday, March 29, 2017 6:57 PM

You must post the complete error message.

You need to post your code with the code posting tool so that it is readable.

\(ツ)_/


Thursday, March 30, 2017 7:27 AM

Hi,

Thanks for your reply, I'm sending error and my complete PS Workflow script.

Error Starts Here.

Microsoft.PowerShell.Utility\Write-Error : Cannot validate argument on parameter 'SubnetId'. The argument is null or empty. Provide an argument that is not null or empty, and then try the command again. At Parallel-New-Gulab:140 char:140 + + CategoryInfo : NotSpecified: (:) [Write-Error], CmdletInvocationException + FullyQualifiedErrorId : System.Management.Automation.CmdletInvocationException,Microsoft.PowerShell.Commands.WriteErrorCommand

Error Ends Here.

*************** My Runbook Script Starts Here **************************************

workflow Parallel-New-Gulab
{

Param 
    (
        [Parameter(Mandatory=$true)]
        [String] $NewVMName,

        [Parameter(Mandatory=$true)]
        [String] $VMLocation,

        [Parameter(Mandatory=$true)]
        [String] $VMSize,

        [Parameter(Mandatory=$true)]
        [String] $OSProfile,

        [Parameter(Mandatory=$true)]
        [String] $SourceImageRGName,

        [Parameter(Mandatory=$true)]
        [String] $SourceImageName,

        [Parameter(Mandatory=$true)]
        [String] $SharedResourcesRGName,

        [Parameter(Mandatory=$true)]
        [String] $NSGName,

        [Parameter(Mandatory=$true)]
        [String] $VNetName,

        [Parameter(Mandatory=$true)]
        [String] $SubnetName,

        [Parameter(Mandatory=$true)]
        [String] $AdminUserName,

        [Parameter(Mandatory=$true)]
        [String] $AdminPassword
    )


"#******************************* Login to Azure Run As Connection ********************************************#"
$connectionName = "AzureRunAsConnection"
    
Try
    {
# Get the connection "AzureRunAsConnection"
        
            $servicePrincipalConnection=Get-AutomationConnection -Name $connectionName         

"Logging in to Azure..."

            Add-AzureRmAccount -ServicePrincipal -TenantId $servicePrincipalConnection.TenantId `
            -ApplicationId $servicePrincipalConnection.ApplicationId `
            -CertificateThumbprint $servicePrincipalConnection.CertificateThumbprint 
    }

Catch 
    {
        if (!$servicePrincipalConnection)
            {
                $ErrorMessage = "Connection $connectionName not found."
                throw $ErrorMessage
            } 
        else
            {
                Write-Error -Message $_.Exception
                throw $_.Exception
                $ErrorMessage = $_.Exception

            }
    }   
"#******************************* Successfully Logged in to Azure Run As Connection ********************************#"
Try
    {
        InLineScript 
            {
                $ErrorActionPreference = 'Stop'
                $SNetAddPrefix = "10.0.0.0/26"
                $VNetAddPrefix = "10.0.0.0/26"

"Create ResourceGroup for Resources"

        New-AzureRmResourceGroup -Name $Using:SharedResourcesRGName -Location $Using:VMLocation -Force

"Successfully Created ResourceGroup for Resources" 

"Creating Shared Network Resources for all NewVMs"

"Creating New Network Security Group"

        $nsg = New-AzureRmNetworkSecurityGroup -ResourceGroupName $Using:SharedResourcesRGName -Location $Using:VMLocation `
        -Name $Using:NSGName

"Creating Virtual Network ad Subnet Config"

        $subnet = New-AzureRmVirtualNetworkSubnetConfig -Name $Using:SubnetName -AddressPrefix $SNetAddPrefix

        $vnet = New-AzureRmVirtualNetwork -Name $Using:VNetName -ResourceGroupName $Using:SharedResourcesRGName `
        -Location $Using:VMLocation -AddressPrefix $VNetAddPrefix -Subnet $subnet

"Associating Virtual Network with Subnet"

        Set-AzureRmVirtualNetworkSubnetConfig -Name $subnet.Name -VirtualNetwork $vnet -AddressPrefix $SNetAddPrefix `
            
        Set-AzureRmVirtualNetwork -VirtualNetwork $vnet

            } # InLineScript Closes here.

Foreach -parallel ($i in 1..1)
    
    {
        $ErrorActionPreference = 'Stop'

$VMName = "$NewVMName"+$i.ToString("00")
            
"Creating New ResourceGroup for Each New VM"

        New-AzureRmResourceGroup -Name $VMName -Location $VMLocation -Force

"Successfully Created ResourceGroup" 

"Creating Network Config Foreach NewVM"

"Get Network Security Group Information"
$gnsg = Get-AzureRmNetworkSecurityGroup -Name $NSGName -ResourceGroupName "$SharedResourcesRGName"

"Get Virtual Network Information"
$gvnet = Get-AzureRmVirtualNetwork -Name $VNetName -ResourceGroupName $SharedResourcesRGName

"Creating Public IP with DNS Name Foreach NewVM"

        $pip = New-AzureRmPublicIpAddress -Name "$VMName-PIP" -ResourceGroupName $VMName -Location $VMLocation `
        -AllocationMethod Dynamic -DomainNameLabel $VMName -Force

"Creating Network Interface Card Foreach NewVM"

        $nic = New-AzureRmNetworkInterface -Name "$VMName-NIC" -ResourceGroupName $VMName -Location $VMLocation `
        -SubnetId $gvnet.Subnets[0].ID -PublicIpAddressId $pip.Id -NetworkSecurityGroupId $gnsg.Id -Force

        $image = Get-AzureRMImage -ImageName $SourceImageName -ResourceGroupName $SourceImageRGName
     
"#Successfully Created Network Config Foreach VM"     

"Add and Set New VMSize, OS Profile and Credentials Foreach NewVM"

        $cred = New-Object PSCredential $AdminUserName, ($AdminPassword | ConvertTo-SecureString -AsPlainText -Force)

        $ComputerName = $VMName
        
        $vm = New-AzureRmVMConfig -VMName $VMName -VMSize $VMSize

        $vm = Set-AzureRmVMSourceImage -VM $vm -Id $image.Id

If ($OSProfile -eq 'Linux')
    {
"Configuring NewVM for Linux Environment"
       
        $vm = Set-AzureRmVMOSDisk -VM $vm -StorageAccountType StandardLRS -CreateOption FromImage -Linux `
        -Caching ReadWrite -Name $VMName

        $vm = Set-AzureRmVMOperatingSystem -VM $vm -Linux -ComputerName $ComputerName -Credential $cred

"Successfully Configured NewVM for Linux Environment"
    }

ElseIf ($OSProfile -eq 'Windows')
    {
"Configuring NewVM for Windows Environment"
       
        $vm = Set-AzureRmVMOSDisk -VM $vm -StorageAccountType StandardLRS -CreateOption FromImage -Windows `
        -Caching ReadWrite -Name $VMName

        $vm = Set-AzureRmVMOperatingSystem -VM $vm -Windows -ComputerName $ComputerName -Credential $cred

"Successfully Configured NewVM for Windows Environment"
    }

"Associating Network Interface Card Foreach NewVM"

        $vm = Add-AzureRmVMNetworkInterface -VM $vm -Id $nic.Id
        
"Network Interface Card Successfully Associated with VMName"

        $vm = Set-AzureRmVMBootDiagnostics -VM $vm -Disable

"Adding the Config to an VM Array and Creating NewVM - Please Wait ...................."

        New-AzureRmVM -VM $vm -ResourceGroupName $VMName -Location $VMLocation

"Successfully Deployed NewVM - $VMName"

    } #Try Block Closes here. 

Catch 
        {
            write-output "Exception Caught..." 
            Write-Error -Message $_.Exception 
            $ErrorMessage = $_.Exception.Message   
            Write-Output "Error Occurred: Message: $ErrorMessage." 

        } #Catch Block Closes here.

} #WorkFlow Closes here.

*************** My Runbook Script Ends Here **************************************

Gulab Pasha


Thursday, March 30, 2017 8:35 AM

That is not the complete error because  you are "catching" it and reporting only the basic text. We need the compete error without any interpretation.

\(ツ)_/


Thursday, March 30, 2017 1:38 PM

that was the error what I can see on my screen.

New-AzureRmNetworkInterface : Cannot validate argument on parameter 'SubnetId'. The argument is null or empty. Provide an argument that is not null or empty, and then try the command again. At Parallel-New-Gulab:141 char:141 + + CategoryInfo : InvalidData: (:) [New-AzureRmNetworkInterface], ParameterBindingValidationException + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.Azure.Commands.Network.NewAzureNetworkInterfaceCommand

Gulab Pasha


Thursday, March 30, 2017 8:26 PM

The full error will be in the error stack:

$error[0]

The last error is always on top.

\(ツ)_/


Thursday, March 30, 2017 11:10 PM

No its not.  It has the complete info

$error[0]  select *

You need the line number so you can tell which command is missing the subnetid.

\(ツ)_/