powershell - 将 IP 分配给多个虚拟机
问题描述
我一直在编写脚本,该脚本从 csv 文件中定义的某些 vlan 中获取虚拟机,并从所选 IP 范围内为其分配随机 IP 地址。
对于 IP 范围,我使用可从 powershell 库下载的函数 Get-IPrange。
我找不到解决方案的问题是将我的 IP 范围中的随机 IP 地址分配给多个虚拟机。
- 当我的数组 $iparrays 包含一个 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.
#>
推荐阅读
- hibernate - 尝试在 Spring Boot 自动配置的 DataJpaTest 中使用 entityManagerFactory 时获取对 entityManagerFactory 的循环引用
- javascript - XML 的 UI5 屏幕尺寸相关属性
- php - PHP:如何按键合并两个嵌套数组
- android - 寻求帮助,让机器人通过听取用户输入在活动之间移动
- arrays - 当我尝试对阵列进行泛洪填充时,为什么我的物理内存没有达到 100% 的容量?
- javascript - 为什么我的 ajax 请求 form_with 被页面上的另一个 rails 表单阻止?
- d3.js - 在 d3 中动态附加形状
- sql - 带有 LIKE '%?%' 的 SQL 准备语句
- javascript - Angular:如何处理变量的异步集
- powershell - Powershell 和 Jenkins - 以另一个用户身份执行 Powershell 脚本