VMware Cloud Community
AnkurS11
Contributor
Contributor
Jump to solution

ESXCLI Storage NMP SATP Rule Script Error

Hi there,

I am running the below commands from pow

$esxcli = Get-EsxCli -VMHost $esxhosts

$esxcli.storage.nmp.satp.rule.remove($false,"tpgs_on","HP 3PAR Custom Rule",$null,$null,"VV",$null,"VMW_PSP_RR","iops=1","VMW_SATP_ALUA",$null,$null,"3PARdata") | Out-Null

$esxcli.storage.nmp.satp.rule.add($false,"tpgs_on","HP 3PAR Custom Rule",$null,$null,$null,"VV",$null,"VMW_PSP_RR","iops=1","VMW_SATP_ALUA",$null,$null,"3PARdata") | Out-Null

Error:

PS C:\Windows\system32> $esxcli.storage.nmp.satp.rule.remove($false,"tpgs_on","HP 3PAR Custom Rule",$null,$null,"VV",$null,"VMW_PSP_RR","iops=1","VMW_SATP_ALUA",$null,$null,"3PARdata")

Cannot find an overload for "remove" and the argument count: "13".

At line:1 char:1

+ $esxcli.storage.nmp.satp.rule.remove($false,"tpgs_on","HP 3PAR Custom ...

+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    + CategoryInfo          : NotSpecified: (:) [], MethodException

    + FullyQualifiedErrorId : MethodCountCouldNotFindBest

Cannot find an overload for "add" and the argument count: "14".

At P:\Ankur\Ankur Scripts\Host-Get-AdvancedSetting-ChangeAttribute.ps1:40 char:3

+   $esxcli.storage.nmp.satp.rule.add($false,"tpgs_on","HP 3PAR Custom  ...

+   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    + CategoryInfo          : NotSpecified: (:) [], MethodException

    + FullyQualifiedErrorId : MethodCountCouldNotFindBest

1 Solution

Accepted Solutions
LucD
Leadership
Leadership
Jump to solution

You had the incorrect variable in the VMHost parameter.

Try like this

$esxhosts = Get-Content -Path C:\Scripts\HostName.txt


foreach ($esx in $esxhosts) {

   $esxcli = Get-EsxCli -VMHost $esx -V2


   $sRem = $esxcli.storage.nmp.satp.rule.remove.CreateArgs()

   $sRem['boot'] = $false

   $sREm['claimoption'] = 'tpgs_on'

   $sREm['description'] = 'HP 3PAR Custom Rule'

   $sREm['model'] = 'VV'

   $sREm['psp'] = 'VMW_PSP_RR'

   $sREm['pspoption'] = 'iops=1'

   $sREm['satp'] = 'VMW_SATP_ALUA'

   $sREm['vendor'] = '3PARdata'


   $removeResult = $esxcli.storage.nmp.satp.rule.remove.Invoke($sRem)


   $sAdd = $esxcli.storage.nmp.satp.rule.add.CreateArgs()

   $sAdd['boot'] = $false

   $sAdd['claimoption'] = 'tpgs_on'

   $sAdd['description'] = 'HP 3PAR Custom Rule'

   $sAdd['model'] = 'VV'

   $sAdd['psp'] = 'VMW_PSP_RR'

   $sAdd['pspoption'] = 'iops=1'

   $sAdd['satp'] = 'VMW_SATP_ALUA'

   $sAdd['vendor'] = '3PARdata'


   $addResult = $esxcli.storage.nmp.satp.rule.add.Invoke($sAdd)


   "" | Select @{N='VMHost';E={$esxcli.VMHost.Name}},

   @{N='Remove_Rule';E={$removeResult}},

   @{N='Add_Rule';E={$addResult}}

}


Blog: lucd.info  Twitter: @LucD22  Co-author PowerCLI Reference

View solution in original post

0 Kudos
13 Replies
LucD
Leadership
Leadership
Jump to solution

It is much easier when you use the V2 switch.

Then you can use the CreateArgs method to see all the parameters (required and optional).

$esxcli = Get-EsxCli -VMHost $esxhosts -v2

$esxcli.storage.nmp.satp.rule.remove.CreateArgs()

You can now assign the values (note that you need to provide anything ot the optional parameters you don't use).

$esxcli = Get-EsxCli -VMHost $esxhosts -v2

$sRem = $esxcli.storage.nmp.satp.rule.remove.CreateArgs()

$sRem['boot'] = $false

...

The you call the Invoke method with the hash table.

$esxcli.storage.nmp.satp.rule.remove.Invoke($sRem)

PS: I hope you only have 1 VMHost in $esxHosts, otherwise you will have some other issues.


Blog: lucd.info  Twitter: @LucD22  Co-author PowerCLI Reference

0 Kudos
AnkurS11
Contributor
Contributor
Jump to solution

Thanks for reply

$esxcli = Get-EsxCli -VMHost $esxhosts -v2

$esxcli.storage.nmp.satp.rule.remove.CreateArgs()

$esxcli.storage.nmp.satp.rule.remove($false,"tpgs_on","HP 3PAR Custom Rule",$null,$null,"VV",$null,"VMW_PSP_RR","iops=1","VMW_SATP_ALUA",$null,$null,"3PARdata") | Out-Null

$esxcli.storage.nmp.satp.rule.add($false,"tpgs_on","HP 3PAR Custom Rule",$null,$null,$null,"VV",$null,"VMW_PSP_RR","iops=1","VMW_SATP_ALUA",$null,$null,"3PARdata")| Out-Null

$sRem = $esxcli.storage.nmp.satp.rule.add.CreateArgs()

$esxcli.storage.nmp.satp.rule.add($false,"tpgs_on","HP 3PAR Custom Rule",$null,$null,$null,"VV",$null,"VMW_PSP_RR","iops=1","VMW_SATP_ALUA",$null,$null,"3PARdata")| Out-Null

$sRem['boot'] = $false = ------ what this will do . we don't want to reboot the host as we are planning to run this cmd on live hosts

$esxcli.storage.nmp.satp.rule.remove.Invoke($sRem)

Does the above will work LucD

0 Kudos
LucD
Leadership
Leadership
Jump to solution

No, you have to fill in all the hash entries (the optional ones that you want and the required ones).

The 'boot' entry was just 1 example, you'll have to the other as well.

Then you use the remove.Invoke($sRem) as I showed in the samepl code.

No more passing all the parameters on the method itself.

You find a more elaborate explanation on how to work with the V2 switch in PowerCLI 6.3 R1: Get-ESXCLI Why the V2?


Blog: lucd.info  Twitter: @LucD22  Co-author PowerCLI Reference

0 Kudos
AnkurS11
Contributor
Contributor
Jump to solution

Hi LucD,

Below is my complete script which the changes you mentioned. Does this looks correct.

$VC = read-host "Please enter vCenter Name"

connect-viserver $VC

$esxHosts = Get-Content -Path C:\Scripts\HostName.txt

$esxcli = Get-EsxCli -VMHost $esxhosts -V2

foreach($esx in $esxHosts)

{

   Get-AdvancedSetting -Entity $esx -Name Disk.QFullSampleSize | Set-AdvancedSetting -Value '32' -Confirm:$false |Select Entity,Name,Value | Export-CSV -NoTypeInformation -Append -path c:\scripts\ADSettingsChnage.csv

   Get-AdvancedSetting -Entity $esx -Name Disk.QFullThreshold| Set-AdvancedSetting -Value '4' -Confirm:$false |Select Entity,Name,Value | Export-CSV -NoTypeInformation -Append -path c:\scripts\ADSettingsChnage.csv

  Get-AdvancedSetting -Entity $esx -Name Disk.EnableNaviReg| Set-AdvancedSetting -Value '0' -Confirm:$false |Select Entity,Name,Value | Export-CSV -NoTypeInformation -Append -path c:\scripts\ADSettingsChnage.csv

   

  Get-AdvancedSetting -Entity $esx -Name Disk.ReqCallThreshold| Set-AdvancedSetting -Value '30' -Confirm:$false |Select Entity,Name,Value | Export-CSV -NoTypeInformation -Append -path c:\scripts\ADSettingsChnage.csv

Get-AdvancedSetting -Entity $esx -Name VMFS3.UseATSForHBOnVMFS5 | Set-AdvancedSetting -Value '0' -Confirm:$false |Select Entity,Name,Value | Export-CSV -NoTypeInformation -Append -path c:\scripts\ADSettingsChnage.csv

$sRem=  $esxcli.storage.nmp.satp.rule.remove.CreateArgs($false,"tpgs_on","HP 3PAR Custom Rule",$null,$null,"VV",$null,"VMW_PSP_RR","iops=1","VMW_SATP_ALUA",$null,$null,"3PARdata") | Out-Null

$sAdd= $esxcli.storage.nmp.satp.rule.add.CreateArgs($false,"tpgs_on","HP 3PAR Custom Rule",$null,$null,$null,"VV",$null,"VMW_PSP_RR","iops=1","VMW_SATP_ALUA",$null,$null,"3PARdata")| Out-Null

$esxcli.storage.nmp.satp.rule.remove.Invoke($sRem) |Export-CSV -NoTypeInformation -Append -path c:\scripts\Remove-Rule.csv

$esxcli.storage.nmp.satp.rule.remove.Invoke($sAdd) | Export-CSV -NoTypeInformation -Append -path c:\scripts\Add-Rule.csv

}

0 Kudos
LucD
Leadership
Leadership
Jump to solution

No, like this

$sRem = $esxcli.storage.nmp.satp.rule.remove.CreateArgs()

$sRem['boot'] = $false

$sREm['claimoption'] = 'tpgs_on'

$sREm['description'] = 'HP 3PAR Custom Rule'

$sREm['model'] = 'VV'

$sREm['psp'] = 'VMW_PSP_RR'

$sREm['psoption'] = 'iops=1'

$sREm['satp'] = 'VMW_SATP_ALUA'

$sREm['vendor'] = '3PARdata'

$esxcli.storage.nmp.satp.rule.remove.Invoke($sRem)


$sAdd = $esxcli.storage.nmp.satp.rule.add.CreateArgs()

$sAdd['boot'] = $false

$sAdd['claimoption'] = 'tpgs_on'

$sAdd['description'] = 'HP 3PAR Custom Rule'

$sAdd['model'] = 'VV'

$sAdd['psp'] = 'VMW_PSP_RR'

$sAdd['psoption'] = 'iops=1'

$sAdd['satp'] = 'VMW_SATP_ALUA'

$sAdd['vendor'] = '3PARdata'

$esxcli.storage.nmp.satp.rule.add.Invoke($sAdd)


Blog: lucd.info  Twitter: @LucD22  Co-author PowerCLI Reference

0 Kudos
AnkurS11
Contributor
Contributor
Jump to solution

Hi LucD,

Thanks for your help when i ran the below.

#$VC = read-host "Please enter vCenter Name"

#connect-viserver $VC

$esxhosts = Get-Content -Path C:\Scripts\HostName.txt

$esxcli = Get-EsxCli -VMHost $esxhosts -V2

foreach($esx in $esxhosts)

{

$sRem = $esxcli.storage.nmp.satp.rule.remove.CreateArgs()

$sRem['boot'] = $false

$sREm['claimoption'] = 'tpgs_on'

$sREm['description'] = 'HP 3PAR Custom Rule'

$sREm['model'] = 'VV'

$sREm['psp'] = 'VMW_PSP_RR'

$sREm['psoption'] = 'iops=1'

$sREm['satp'] = 'VMW_SATP_ALUA'

$sREm['vendor'] = '3PARdata'

$esxcli.storage.nmp.satp.rule.remove.Invoke($sRem)

$sAdd = $esxcli.storage.nmp.satp.rule.add.CreateArgs()

$sAdd['boot'] = $false

$sAdd['claimoption'] = 'tpgs_on'

$sAdd['description'] = 'HP 3PAR Custom Rule'

$sAdd['model'] = 'VV'

$sAdd['psp'] = 'VMW_PSP_RR'

$sAdd['psoption'] = 'iops=1'

$sAdd['satp'] = 'VMW_SATP_ALUA'

$sAdd['vendor'] = '3PARdata'

$esxcli.storage.nmp.satp.rule.add.Invoke($sAdd)

}

Output Error: Am i missing something?

Index (zero based) must be greater than or equal to zero and less than the size of the argument list.

At line:21 char:1

+ $esxcli.storage.nmp.satp.rule.remove.Invoke($sRem)

+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    + CategoryInfo          : OperationStopped: (:) [], FormatException

    + FullyQualifiedErrorId : System.FormatException

Index (zero based) must be greater than or equal to zero and less than the size of the argument list.

At line:35 char:1

+ $esxcli.storage.nmp.satp.rule.add.Invoke($sAdd)

+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    + CategoryInfo          : OperationStopped: (:) [], FormatException

    + FullyQualifiedErrorId : System.FormatException

0 Kudos
LucD
Leadership
Leadership
Jump to solution

You have to assign the $esxcli for each ESXi node separately (see my earlier remark).

Move that assignment within the ForEach loop

$esxcli = Get-EsxCli -VMHost $esx -V2


Blog: lucd.info  Twitter: @LucD22  Co-author PowerCLI Reference

0 Kudos
AnkurS11
Contributor
Contributor
Jump to solution

Thanks you so much again for helping with this. Its giving the results as True and marked as green.  Smiley Happy

The last thing i wanted is the output in the below manner

Desired output in the CSV format :

Host Name            Remove_Rule                     ADD_Rule       

XYZ                              True                                   True

I tried below but did not gave desired result

Select @{N='VMHost';E={$esxcli.VMHost.Name}}, @{N='Remove_Rule';E={$esxcli.storage.nmp.satp.rule.remove.Invoke($sRem)}}

Select @{N='VMHost';E={$esxcli.VMHost.Name}}, @{N='Add Rule';E={$esxcli.storage.nmp.satp.rule.add.Invoke($sAdd)}}

Which did not result anything.

PS C:\Windows\system32>

#$VC = read-host "Please enter vCenter Name"

#connect-viserver $VC

$esxhosts = Get-Content -Path C:\Scripts\HostName.txt

foreach($esx in $esxhosts){

$esxcli = Get-EsxCli -VMHost $esxhosts -V2

$sRem = $esxcli.storage.nmp.satp.rule.remove.CreateArgs()

$sRem['boot'] = $false

$sREm['claimoption'] = 'tpgs_on'

$sREm['description'] = 'HP 3PAR Custom Rule'

$sREm['model'] = 'VV'

$sREm['psp'] = 'VMW_PSP_RR'

$sREm['pspoption'] = 'iops=1'

$sREm['satp'] = 'VMW_SATP_ALUA'

$sREm['vendor'] = '3PARdata'

$esxcli.storage.nmp.satp.rule.remove.Invoke($sRem)

$sAdd = $esxcli.storage.nmp.satp.rule.add.CreateArgs()

$sAdd['boot'] = $false

$sAdd['claimoption'] = 'tpgs_on'

$sAdd['description'] = 'HP 3PAR Custom Rule'

$sAdd['model'] = 'VV'

$sAdd['psp'] = 'VMW_PSP_RR'

$sAdd['pspoption'] = 'iops=1'

$sAdd['satp'] = 'VMW_SATP_ALUA'

$sAdd['vendor'] = '3PARdata'

$esxcli.storage.nmp.satp.rule.add.Invoke($sAdd)

}

true

true

PS C:\Windows\system32>

0 Kudos
LucD
Leadership
Leadership
Jump to solution

You had the incorrect variable in the VMHost parameter.

Try like this

$esxhosts = Get-Content -Path C:\Scripts\HostName.txt


foreach ($esx in $esxhosts) {

   $esxcli = Get-EsxCli -VMHost $esx -V2


   $sRem = $esxcli.storage.nmp.satp.rule.remove.CreateArgs()

   $sRem['boot'] = $false

   $sREm['claimoption'] = 'tpgs_on'

   $sREm['description'] = 'HP 3PAR Custom Rule'

   $sREm['model'] = 'VV'

   $sREm['psp'] = 'VMW_PSP_RR'

   $sREm['pspoption'] = 'iops=1'

   $sREm['satp'] = 'VMW_SATP_ALUA'

   $sREm['vendor'] = '3PARdata'


   $removeResult = $esxcli.storage.nmp.satp.rule.remove.Invoke($sRem)


   $sAdd = $esxcli.storage.nmp.satp.rule.add.CreateArgs()

   $sAdd['boot'] = $false

   $sAdd['claimoption'] = 'tpgs_on'

   $sAdd['description'] = 'HP 3PAR Custom Rule'

   $sAdd['model'] = 'VV'

   $sAdd['psp'] = 'VMW_PSP_RR'

   $sAdd['pspoption'] = 'iops=1'

   $sAdd['satp'] = 'VMW_SATP_ALUA'

   $sAdd['vendor'] = '3PARdata'


   $addResult = $esxcli.storage.nmp.satp.rule.add.Invoke($sAdd)


   "" | Select @{N='VMHost';E={$esxcli.VMHost.Name}},

   @{N='Remove_Rule';E={$removeResult}},

   @{N='Add_Rule';E={$addResult}}

}


Blog: lucd.info  Twitter: @LucD22  Co-author PowerCLI Reference

0 Kudos
AnkurS11
Contributor
Contributor
Jump to solution

You helped me alot and many many thanks for that. As i am still learning the art. plz help me with the correct format

below is the output

PS C:\Windows\system32> P:\Ankur\Ankur Scripts\Storage-SATP-Rule-Remove-Add-Multi.ps1

true

true

VMHost                        Remove_Rule Add_Rule

------                        ----------- --------

usnencpe101.nmcorp.nissan.biz                    

true

true

VMHost                        Remove_Rule Add_Rule

------                        ----------- --------

usnencpe102.nmcorp.nissan.biz             

I also tried with this

  "" | Select @{N='VMHost';E={$esxcli.VMHost.Name}}, @{N='Remove_Rule';E={$removeResult}},@{N='Add_Rule';E={$addResult}} |Export-Csv -Append  C:\Scripts\StorageRule-Remove-Add.csv

Its generating the csv and the host name are also visble but no data in Remoev_rule and Add_Rule column.

0 Kudos
LucD
Leadership
Leadership
Jump to solution

You were not using the last version of the script I included.

In there I intercept those $true values in 2 variables.

A ForEach does not place any thing on the pipeline, one solution is to capture the output of the Select-Object in an array.
And then export that array when the ForEach loop completes.

$esxhosts = Get-Content -Path C:\Scripts\HostName.txt


$report = foreach ($esx in $esxhosts) {

   $esxcli = Get-EsxCli -VMHost $esx -V2


   $sRem = $esxcli.storage.nmp.satp.rule.remove.CreateArgs()

   $sRem['boot'] = $false

   $sREm['claimoption'] = 'tpgs_on'

   $sREm['description'] = 'HP 3PAR Custom Rule'

   $sREm['model'] = 'VV'

   $sREm['psp'] = 'VMW_PSP_RR'

   $sREm['pspoption'] = 'iops=1'

   $sREm['satp'] = 'VMW_SATP_ALUA'

   $sREm['vendor'] = '3PARdata'


   $removeResult = $esxcli.storage.nmp.satp.rule.remove.Invoke($sRem)


   $sAdd = $esxcli.storage.nmp.satp.rule.add.CreateArgs()

   $sAdd['boot'] = $false

   $sAdd['claimoption'] = 'tpgs_on'

   $sAdd['description'] = 'HP 3PAR Custom Rule'

   $sAdd['model'] = 'VV'

   $sAdd['psp'] = 'VMW_PSP_RR'

   $sAdd['pspoption'] = 'iops=1'

   $sAdd['satp'] = 'VMW_SATP_ALUA'

   $sAdd['vendor'] = '3PARdata'


   $addResult = $esxcli.storage.nmp.satp.rule.add.Invoke($sAdd)


   "" | Select @{N = 'VMHost'; E = {$esxcli.VMHost.Name}},

   @{N = 'Remove_Rule'; E = {$removeResult}},

   @{N = 'Add_Rule'; E = {$addResult}}

}


$report | Export-Csv -Append C:\Scripts\StorageRule-Remove-Add.csv -NoTypeInformation -UseCulture


Blog: lucd.info  Twitter: @LucD22  Co-author PowerCLI Reference

AnkurS11
Contributor
Contributor
Jump to solution

My Bad i missed to add the $removeAdd = ,$removeResult =

Your script made my work easy. thanks a million.

I wanted to learn this scripting skills. do you suggest any proper channel for me , so that i can do at least good in this.I am really interested and eager to learn. Once again thanks.

0 Kudos
LucD
Leadership
Leadership
Jump to solution

There are some rather good posts by CRazyConsultant on how to learn PowerShell and PowerCLI.

PowerShell study guide – core concepts

PowerCLI study guide – core concepts


Blog: lucd.info  Twitter: @LucD22  Co-author PowerCLI Reference