Powershell 将IP分配给多个虚拟机

Powershell 将IP分配给多个虚拟机,powershell,vmware,powercli,Powershell,Vmware,Powercli,我一直在编写脚本,该脚本从csv文件中定义的特定vlan中获取虚拟机,并从选定的IP范围中为它们分配随机IP地址 对于IP范围,我正在使用可从powershell gallery下载的Get-IPrange函数 我找不到解决方案的问题是将随机IP地址从我的IP范围分配到多个虚拟机 当我的数组$iParray包含一个ip地址时,它会工作 如果我有更多的机器,因此阵列中有更多的IP地址,它会尝试为每个虚拟机分配相同的IP地址,错误如下 错误: VM : test-automa

我一直在编写脚本,该脚本从csv文件中定义的特定vlan中获取虚拟机,并从选定的IP范围中为它们分配随机IP地址

  • 对于IP范围,我正在使用可从powershell gallery下载的Get-IPrange函数

  • 我找不到解决方案的问题是将随机IP地址从我的IP范围分配到多个虚拟机

  • 当我的数组$iParray包含一个ip地址时,它会工作
  • 如果我有更多的机器,因此阵列中有更多的IP地址,它会尝试为每个虚拟机分配相同的IP地址,错误如下
错误:

VM           : test-automata-01
ExitCode     : 0
ScriptOutput :
               Invalid mask parameter (10.84.64.203).



VM           : test-automata-02
ExitCode     : 0
ScriptOutput :
               Invalid mask parameter (10.84.64.203).
我的剧本:

#Loading CSV with vlan list
$vlans = Import-CSV -Path "C:\scripts\Automata\ipchange-vlan.csv"

#IP range for cloned virtual machines
$iprange = Get-IPrange -start 10.84.64.200 -end 10.84.64.254

#Fetching vlans that are supposed to be cloned based on determined clone day (determined in CSV)
$vms = @()
foreach ($vlan in $vlans) 
   {
     #Acquiring list of vlans
     $vms += Get-VDPortgroup $vlan.vlan | Get-VM
   }
$vms

#Count of filtered virtual machines
$ipcount = ($vms).count

#Randomizing IP address
$iparrays = $iprange | Get-Random -Count $ipcount

#Static ip config
$ipmask = "255.255.255.192"
$dgw = "10.84.64.193"
$netcard = "Ethernet0"

foreach ($vm in $vms)
{
    $vmip = Get-VM -Name $vm.Name

foreach ($iparray in $iparrays)
{
$cmd=@"
c:\windows\system32\netsh.exe interface ip set address $netcard static $iparray "255.255.255.192" "10.84.64.193"
c:\windows\system32\netsh.exe interface ipv4 set dns name=$netcard static 8.8.8.8 primary
"@    

Invoke-VMScript -VM $vmip.Name -GuestUser "Administrator" -GuestPassword "Admin123" -ScriptType bat -ScriptText $cmd -Verbose
}   
}

在循环中,一旦有了一个,就需要从传入的可用IPA列表中删除它

例如(当然有更优雅的方法来执行X或Y,但这只是一个想法,而且未经测试,因为我没有执行此用例的环境):

这是一个循环

# Set the Ipa range
([System.Collections.ArrayList]$IpaRange = 200..254 | 
ForEach{"10.84.64.$PSItem"})

# Results
<#
10.84.64.200
10.84.64.201
10.84.64.202
...
#>

$IpaRange.Count 

# Results 
<#
55
#>

$TargetIpa = ''

# Get the first IPA to use
($TargetIpa = Get-Random $IpaRange -Count 1)

# Results
<#
10.84.64.242
#>

If ($IpaRange -contains $TargetIpa)
{
    $IpaRange.Remove("$TargetIpa")
    ($TargetIpa = Get-Random $IpaRange -Count 1)
    $IpaRange.Count
}

# Results
<#
10.84.64.231
54
#>

# Or 
# Set the Ipa range
[System.Collections.ArrayList]$IpaRange = 200..254 | 
ForEach{"10.84.64.$PSItem"}

# First IPA to use
$TargetIpa = Get-Random $IpaRange -Count 1
<#
# First VM IPA 
#Static ip config
$ipmask = $TargetIpa
$dgw = "10.84.64.193"
$netcard = "Ethernet0"
#>

Try
{
    do
    {
        If ($IpaRange -contains $TargetIpa)
        {
            $IpaRange.Remove("$TargetIpa")
            ($TargetIpa = Get-Random $IpaRange -Count 1)

            <#
            #Static ip config
            $ipmask = $TargetIpa 
            $dgw = "10.84.64.193"
            $netcard = "Ethernet0"
            #>

            $IpaRange.Count
        }    
    }
    while ($IpaRange.Count -ne 0)
}
Catch
{Write-Warning -Message 'IP address assignments complete.'}

# Results
<#
10.84.64.233
54
10.84.64.205
53
10.84.64.241
52
...
10.84.64.235
3
10.84.64.214
2
10.84.64.231
1
WARNING: IP address assignments complete.
#>
#设置Ipa范围
([System.Collections.ArrayList]$IpaRange=200..254|
ForEach{“10.84.64.$PSItem”})
#结果
$iparrange.Count
#结果
$TargetIpa=''
#获取要使用的第一个IPA
($TargetIpa=获取随机$IpaRange-计数1)
#结果
If($IpaRange-包含$TargetIpa)
{
$IpaRange.Remove(“$TargetIpa”)
($TargetIpa=获取随机$IpaRange-计数1)
$iparrange.Count
}
#结果
#或
#设置Ipa范围
[System.Collections.ArrayList]$IpaRange=200..254|
ForEach{“10.84.64.$PSItem”}
#首次使用IPA
$TargetIpa=获取随机$IpaRange-计数1
尝试
{
做
{
If($IpaRange-包含$TargetIpa)
{
$IpaRange.Remove(“$TargetIpa”)
($TargetIpa=获取随机$IpaRange-计数1)
$iparrange.Count
}    
}
而($IpaRange.Count-ne 0)
}
抓住
{写入警告消息“IP地址分配完成”。}
#结果

在循环中,一旦有了循环,就需要从传入的可用IPA列表中删除该循环

例如(当然有更优雅的方法来执行X或Y,但这只是一个想法,而且未经测试,因为我没有执行此用例的环境):

这是一个循环

# Set the Ipa range
([System.Collections.ArrayList]$IpaRange = 200..254 | 
ForEach{"10.84.64.$PSItem"})

# Results
<#
10.84.64.200
10.84.64.201
10.84.64.202
...
#>

$IpaRange.Count 

# Results 
<#
55
#>

$TargetIpa = ''

# Get the first IPA to use
($TargetIpa = Get-Random $IpaRange -Count 1)

# Results
<#
10.84.64.242
#>

If ($IpaRange -contains $TargetIpa)
{
    $IpaRange.Remove("$TargetIpa")
    ($TargetIpa = Get-Random $IpaRange -Count 1)
    $IpaRange.Count
}

# Results
<#
10.84.64.231
54
#>

# Or 
# Set the Ipa range
[System.Collections.ArrayList]$IpaRange = 200..254 | 
ForEach{"10.84.64.$PSItem"}

# First IPA to use
$TargetIpa = Get-Random $IpaRange -Count 1
<#
# First VM IPA 
#Static ip config
$ipmask = $TargetIpa
$dgw = "10.84.64.193"
$netcard = "Ethernet0"
#>

Try
{
    do
    {
        If ($IpaRange -contains $TargetIpa)
        {
            $IpaRange.Remove("$TargetIpa")
            ($TargetIpa = Get-Random $IpaRange -Count 1)

            <#
            #Static ip config
            $ipmask = $TargetIpa 
            $dgw = "10.84.64.193"
            $netcard = "Ethernet0"
            #>

            $IpaRange.Count
        }    
    }
    while ($IpaRange.Count -ne 0)
}
Catch
{Write-Warning -Message 'IP address assignments complete.'}

# Results
<#
10.84.64.233
54
10.84.64.205
53
10.84.64.241
52
...
10.84.64.235
3
10.84.64.214
2
10.84.64.231
1
WARNING: IP address assignments complete.
#>
#设置Ipa范围
([System.Collections.ArrayList]$IpaRange=200..254|
ForEach{“10.84.64.$PSItem”})
#结果
$iparrange.Count
#结果
$TargetIpa=''
#获取要使用的第一个IPA
($TargetIpa=获取随机$IpaRange-计数1)
#结果
If($IpaRange-包含$TargetIpa)
{
$IpaRange.Remove(“$TargetIpa”)
($TargetIpa=获取随机$IpaRange-计数1)
$iparrange.Count
}
#结果
#或
#设置Ipa范围
[System.Collections.ArrayList]$IpaRange=200..254|
ForEach{“10.84.64.$PSItem”}
#首次使用IPA
$TargetIpa=获取随机$IpaRange-计数1
尝试
{
做
{
If($IpaRange-包含$TargetIpa)
{
$IpaRange.Remove(“$TargetIpa”)
($TargetIpa=获取随机$IpaRange-计数1)
$iparrange.Count
}    
}
而($IpaRange.Count-ne 0)
}
抓住
{写入警告消息“IP地址分配完成”。}
#结果