Powershell: как постепенно увеличивать переменные в цикле? - PullRequest
0 голосов
/ 17 февраля 2019

Я начинающий автор сценариев / PowerShell / PowerCLI.Мне поручено выяснить, как лучше всего выполнить масштабирование некоторых из наших существующих сценариев.

Сценарии, которые мы имеем, принимают данные YAML от наших конечных пользователей и строят кластеры VMware ESXi в соответствии с их спецификациями.Мы пытаемся расширить сценарии, чтобы мы могли применять различные конфигурации в зависимости от типа кластера, который пользователь указывает в YAML.Мы хотим, чтобы конечный пользователь мог расширить это, создавая столько кластеров, сколько необходимо.Все время применяя различные конфигурации в зависимости от типа кластера, который они вводят.Мы также хотим иметь возможность легко расширять тип кластера «X» в будущем для других типов, которые мы в конечном итоге определим.

Примеры ввода YAML:

Cluster1: <Name>
Cluster1Type: <Basic, DR, or Replicate>
Cluster2: <Name>
Cluster2Type: <Basic, DR, or Replicate>

Я знаю, что мог бы сделать этов довольно нечистой манере жесткого кодирования очень длинного оператора if и.Что-то вроде:

If ($Cluster1Type -eq 'DR') {<Code to execute on $Cluster1>}
ElseIf ($Cluster1Type -eq 'Replicate') {<Code to execute on $Cluster1>}
Else {<Code to execute on $Cluster1>}

If ($Cluster2Type -eq 'DR') {<Code to execute on $Cluster2>}
ElseIf ($Cluster2Type -eq 'Replicate') {<Code to execute on $Cluster2>}
Else {<Code to execute on $Cluster2>}

Я знаю, что должен быть лучший способ сделать это.vSphere 6.5 может иметь до 64 кластеров на vCenter, если я правильно помню, определенно, я не хочу жестко кодировать 64, если операторы else каждый раз нам нужно проверять, какой тип кластера назначил конечный пользователь конкретному имени кластера.Я искал чистое решение, но моя неопытность затрудняет поиск ответа самостоятельно.

Я также думал, что возможно будет использовать массив переменных для имен кластеров, а затем предложить пользователю, выполняющему наши скрипты PowerShell, ввести тип кластера для каждого имени кластера, которое они вводят в массив.Я все еще думаю, что может быть даже лучший способ, чем этот, хотя?Возможно, метод запуска цикла для каждой переменной ClusterX и ClusterXType в инкрементном методе?

Ответы [ 3 ]

0 голосов
/ 17 февраля 2019

Ты говоришь что-то подобное?Это предполагает, что пользователю разрешено вводить только один тип кластера за раз.

# Specify the number of cluster nodes to create
$ClusterCount = Read-Host -Prompt 'Enter the number of guests to create'

# Enter a cluster type to create
$ClusterType = Read-Host -Prompt 'Enter the type - Basic, DR, Replicate'

1..$ClusterCount | 
ForEach{
    "Working cluster type $ClusterType on new node name Cluster$PSITEM"
    <#
    If ($ClusterType -eq 'DR') {"Code to execute on Cluster$PSItem"}
    ElseIf ($ClusterType -eq 'Replicate') {"Code to execute on Cluster$PSItem"}
    Else {<Code to execute on $Cluster1>}
    #>
}

# Results

Enter the number of guests to create: 3
Enter the type - Basic, DR, Replicate: Basic
Working cluster type Basic on new node name Cluster1
Working cluster type Basic on new node name Cluster2
Working cluster type Basic on new node name Cluster3
0 голосов
/ 23 февраля 2019

Вместо этого мы создали массив объектов в YAML.Затем импортируем YAML в наши скрипты и вызываем каждый из них по Clusters.Name / Clusters.Type.Спасибо за помощь, что каждый определенно научил меня различным способам выполнения этой или подобных задач.

Кластеры: - Имя: XXXXX Тип: XXXXX

0 голосов
/ 17 февраля 2019

Команду New-Variable можно использовать для создания переменной, в которой для имени используется другая переменная

$iteration = 1
New-Variable -Name Cluster$iteration

. При этом создается переменная с именем $Cluster1

Get-Variable C*

Name          Value
----          ----
Cluster1
...