Ruby “if file not found do” 在脚本的顶部

Ruby "if file not found do" at the top of the script

提问人:Keith 提问时间:11/2/2023 更新时间:11/2/2023 访问量:45

问:

我有一些 rubys 文件,我正在尝试减少重复代码。下面是一个更大的文件的片段,其中包含大量重复代码。是否可以将 添加到该部分,这样我就不必在每次注册表更改下单独列出它?类似的东西if node['platform_version'] =~ /10.0.14393/not_if { ::File.exist?('C:/programdata/habitat/chef-base/files/missing_GPO_entries_from_patching.flg') }if node = this and flg file not found, then

# If OS is 2016
if node['platform_version'] =~ /10.0.14393/
  registry_key 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\DataCollection' do
    values [
      { name: 'AllowTelemetry', type: :dword, data: 0x00000000 },
    ]
    action :create_if_missing
    not_if { ::File.exist?('C:/programdata/habitat/chef-base/files/missing_GPO_entries_from_patching.flg') }
  end
end
Ruby Chef-基础设施

评论

1赞 Stefan 11/2/2023
关于 – 请注意,在正则表达式中匹配任何字符。要匹配文字点,请使用 或/10.0.14393/.\.node['platform_version'].include?('10.0.14393')

答:

2赞 spickermann 11/2/2023 #1

你是这个意思吗?

if node['platform_version'] =~ /10.0.14393/ && !File.exist?('C:/programdata/habitat/chef-base/files/missing_GPO_entries_from_patching.flg')
  # ...
end
1赞 seshadri_c 11/2/2023 #2

可以在同一资源块中同时使用和条件。资源将根据这两个条件进行更新。not_ifonly_if

例如:

registry_key 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\DataCollection' do
  values [
    { name: 'AllowTelemetry', type: :dword, data: 0x00000000 },
  ]
  action :create_if_missing
  not_if { ::File.exist?('C:/programdata/habitat/chef-base/files/missing_GPO_entries_from_patching.flg') }
  # you can also use .include? method as suggested by Stefan in his comment
  only_if { node['platform_version'] == '10.0.19045' }
end

由于您有更多代码需要有条件地运行,因此一种选择是将它们移动到单独的配方中(最简单),并有条件地调用该配方。例如,您可以创建一个 ,并从中调用它:registry.rbdefault.rb

default.rb 示例

include_recipe 'mycookbook::registry' if node['platform_version'] == '10.0.19045'