Брандмауэр Chef Guard для Windows с пользовательским идентификатором GUID

#chef-infra #chef-recipe

#шеф-инфра #шеф-повар-рецепт

Вопрос:

Я могу создать пользовательское правило брандмауэра Windows с помощью Chef и Powershell. У меня проблема с not_if.

Я использовал методы раздела реестра отсюда: http://docs.opscode.com/resource_registry_key.html

Пользовательское правило брандмауэра создает раздел реестра со случайным идентификатором GUID. Я не могу использовать методы, потому что не знаю имени ключа. Значение ключа будет одинаковым на каждом узле, но не имя ключа.

Работает следующее. Но пользовательский ключ имеет идентификатор GUID для имени ключа

 execute "enableMSDTCFirewall" do
        command "netsh advfirewall firewall set rule group="Distributed Transaction Coordinator" new enable=yes"
        action :run
        not_if { registry_data_exists?("HKLM\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\FirewallRules", {:name => 'MSDTC-In-TCP', :type => :string, :data => "v2.20|Action=Allow|Active=TRUE|Dir=In|Protocol=6|App=%SystemRoot%\system32\msdtc.exe|Name=@FirewallAPI.dll,-33503|Desc=@FirewallAPI.dll,-33506|EmbedCtxt=@FirewallAPI.dll,-33502|"})}
end
  

Кроме флага, я не могу найти другой способ проверить, существует ли правило, и не запускать скрипт во время каждого запуска клиента. Есть идеи?

В итоге это сработало

 execute "enableFirewallRuleNameOutbound" do
    command "powershell.exe New-NetFirewallRule -DisplayName "RuleName" -Direction Outbound -LocalPort 20000 -Protocol TCP -Action Allow"
    action :run
    not_if 'netsh advfirewall firewall show rule name="RuleName" > nul'
  

завершение

Ответ №1:

Я предполагаю, что у правила есть имя, которое вы не используете и / или могли бы использовать, чтобы помочь. Должно работать что-то вроде следующего.

При добавлении правила присвойте ему имя:

 netsh advfirewall firewall add rule name=enableMSDTCFirewall ...
  

Проверка правила в вашем not_if:

 not_if 'netsh advfirewall firewall show rule name=enableMSDTCFirewall > nul'
  

show Команда должна возвращать ERRORLEVEL значение 0, если правило уже существует.

Комментарии:

1. Вокруг строки «netsh …» должны быть одинарные кавычки, а не фигурные скобки.