@ Джон Боллинджер - Puppet и PowerShell = PuppetHell!:)
Мне, наконец, удалось решить эту проблему, но я чувствую, что мои блоки кода слишком длинные с большим количеством замен.Я пробовал более короткие методы безрезультатно, поэтому, если кто-нибудь может предложить работать с более коротким кодом, который будет оценен по достоинству.
Короче говоря, мне пришлось получить
getключи хешей (заголовки) в подходящем синтаксисе массива для сравнения Powershell:
a.добавление одинарных кавычек и запятых в качестве разделителей
b.добавление одинарной и двойной кавычек в начале и конце массива
c.удаление круглых скобок из любой точки массива, когда PowerShell выплюнул их
$firewall_hiera = regsubst(regsubst(regsubst(join(keys($firewall_rules), "', '"), '^', '"\''), '$', '\'"'), '[\(\)]', '', 'G')
, производит
"'Core Networking - DNS UDP-Out', 'Core Networking - Dynamic Host Configuration Protocol DHCP-Out', 'File and Printer Sharing Echo Request - ICMPv4-Out', 'Internet Browsing HTTP-Out', 'Internet Browsing HTTPS-Out'"
…
Используйте exec Powershell для очистки Брандмауэра, если он не определен в Puppet hiera с помощью:
a.использование команды exec для очистки правил брандмауэра хоста с помощью:
command => 'netsh advfirewall firewall delete rule name=all; reg delete "HKLM\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\FirewallRules" /f',
b.обеспечение идемпотентности с очень длинным оператором разве что:
unless => "if (@(Compare-Object((Get-NetFirewallRule | foreach {\"'\"+\$_.DisplayName+\"'\"}) -join ', ' -replace '[()]') $firewall_hiera).length -eq 0) {exit 0} else {exit 1}",
, который приводит к следующему объекту сравнения с созданным выше $ firewall_hiera
'Core Networking - DNS UDP-Out', 'Core Networking - Dynamic Host Configuration Protocol DHCP-Out', 'File and Printer Sharing Echo Request - ICMPv4-Out', 'Internet Browsing HTTP-Out', 'Internet Browsing HTTPS-Out'
Желаемые правилазатем воссоздаются (если происходит очистка) с помощью модуля thoward-windows_firewall, который выполняет итерацию по той же исходной иерархии.Этот модуль НАДЕЖНО лучше, чем довольно старый модуль puppetlabs-windows_firewall, но не может обрабатывать ужасные добавки брандмауэра Windows 10 после входа пользователя.
Интересно, что только массив, созданный марионеткой, нуждается во внешних двойных кавычках.Поскольку модуль puppetlabs-powershell не отображает файлы .ps1 на диск, мне пришлось выводить их вручную, чтобы получить представление о том, что на самом деле создавалось, и протестировать их в Powershell ISE (более ранний модуль PowerShell Джоша Купера действительно создал временный файл.PS1, что было удобно, хотя и менее безопасно)
Мне удалось поместить в массивы некоторую regsubst или заменить символы, но ^ и $ не очень хорошо работают в массиве.
Все это нужно было решитьНепрерывное создание в Windows 10 дополнительных бессмысленных правил брандмауэра только после входа пользователя.Это продолжается с перерывами в течение 6 пробегов кукол и, наконец, останавливается.Например, никогда не было этой проблемы с Server 2012 R2.
Удаление следующего раздела реестра (при условии, что модуль реестра Puppetlabs обеспечивает => отсутствует) обеспечивает некоторое дополнительное успокоение, но не самоцель:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\RestrictedServices\AppIso\FirewallRules
Опять же, ЛЮБАЯ помощь в сокращении приведенного выше кода, особенно в отношении команд regsubst и -replace.Имейте в виду, что полученные массивы должны быть сопоставимы с помощью функции Powershell «сравнить объект» или аналогичной.
Спасибо @ John-Bollinger за то, что я начал создавать массив из хеша hiera с использованием ключей ифункции соединения.