Проблема в том, что шаблон поиска текста для замены заменяется в первом проходе l oop, и больше не существует во вторых двух циклах. Давайте упростим это и просто l oop для одного файла:
foreach ($a in $azs)
{
#Write-Host $a
## REPLACE AVAILABILITY ZONES IN TEMPLATE ##
(Get-Content "$($infrawindowsbasefolder)\dev\params_DVW$i.json") | foreach-object { $_ -replace "availability-zone", "us-east-1$($a)" } | Set-Content "$($infrawindowsbasefolder)\dev\params_DVW$i.json"
}
Предположим, что файл params_DVWTEST01.json
содержит текст:
<region>
availability-zone
<region>
Теперь ваш l oop запускается первый раз, где $a = 'a'
. Внутри l oop вы получаете содержимое файла, выполняете замену строки и используете Set-Content
для сохранения обновленного файла. Конечный продукт, этот файл теперь содержит:
<region>
us-east-1a
<region>
Второй l oop начинается, на этот раз $a = 'b'
. Внутри вашего l oop вы получаете содержимое файла, он пытается выполнить замену строки, но «зоны доступности» нигде нет в заменяемом файле, поэтому он сохраняет файл таким, какой он есть.
Третий l oop, где $a = 'c'
выполняется точно так же, как второй l oop. Он загружает файл, не находит ничего для замены и сохраняет файл таким, каким он был. Если вы хотите, чтобы он содержал все три элемента в $azs
, вам нужно будет соединить строки в одну строку и использовать ее в качестве замены.
$AllZones = ($azs|ForEach{"us-east-1$_"}) -join ", "
Now $AllZones = "us-east-1a, us-east-1b, us-east-1c"
. Затем используйте его в качестве строки замены, и внутренний l oop не требуется.
$AllZones = ($azs|ForEach{"us-east-1$_"}) -join ", "
## REPLACE AVAILABILITY ZONES IN TEMPLATE ##
(Get-Content "$($infrawindowsbasefolder)\dev\params_DVW$i.json") | foreach-object { $_ -replace "availability-zone", $AllZones } | Set-Content "$($infrawindowsbasefolder)\dev\params_DVW$i.json"
Редактировать: Похоже, что вы хотите циклически перемещаться по местоположениям при циклическом переключении между серверами, чтобы каждый сервер имел свое местоположение или, по крайней мере, чтобы серверы были распределены по местам. Есть несколько способов сделать это. Самое простое, если у вас такое же количество серверов, как и у вас. В этом случае вы переключаетесь на использование For()
l oop вместо ForEach()
l oop. Тогда все начинает выглядеть так:
$is = "TEST01","TEST02","TEST03"
#Write-Host $is
$azs = "a","b","c"
#Write-Host $azs
for ($y=0; $y -lt $is.count; $y++)
{
$i = $is[$y]
Затем, когда вы делаете замену, вы ссылаетесь на $azs[$y]
как:
(Get-Content "$($infrawindowsbasefolder)\dev\params_DVW$i.json") | foreach-object { $_ -replace "availability-zone", "us-east-1$($azs[$y])" } | Set-Content "$($infrawindowsbasefolder)\dev\params_DVW$i.json"
Затем TEST01 получает "us-east-1a" TEST02 получает «us-east-1b», а TEST03 получает «us-east-1 c». Довольно просто, если ваше количество серверов и количество местоположений равны.
Давайте рассмотрим другой подход, когда у вас может быть разное количество серверов и местоположений, и вы хотите распределить серверы по ограниченному количеству местоположений. , Это была бы похожая ситуация, но нам пришлось бы немного подсчитать, чтобы просмотреть список мест. Начнем с настройки большего количества серверов, мы расширим до 5.
$is = "TEST01","TEST02","TEST03","TEST04","TEST05"
Мы оставим регионы одинаковыми, a, b и c. Теперь для простоты мы просто выведем, какую область мы назначаем каждому серверу на экран:
For($y=0; $y -lt $is.count; $y++){
"Assigning server '$($is[$y])' to region 'us-east-1$($azs[$y%$azs.count])'"
}
Вывод этого будет:
Assigning server 'TEST01' to region 'us-east-1a'
Assigning server 'TEST02' to region 'us-east-1b'
Assigning server 'TEST03' to region 'us-east-1c'
Assigning server 'TEST04' to region 'us-east-1a'
Assigning server 'TEST05' to region 'us-east-1b'
Волхвы c в этом $y%$azs.count
. То, что это делает, дает вам остаток после деления текущей итерации $y
на $azs.count
(то есть 3). Таким образом, в первый раз через l oop это 0, деленное на 3, что является 0 с остатком 0. $azs[0] = 'a'
. Следующая итерация - 1, деленная на 3, которая равна 0 с остатком 1. $azs[1] = 'b'
. Итерация 3 очень похожа, производя 'c'. Итерация 4 более интересна, когда она 3 делится на 3, то есть 1 с остатком 0, что заставляет нас вернуться к началу $azs[0] = 'a'
.