【问题标题】:How do I add multiline statement inside chef gaurd?如何在 Chef Guard 中添加多行语句?
【发布时间】:2015-02-19 20:53:53
【问题描述】:

在我的食谱中,我有以下资源可以重新启动计算机,但我想对该资源应用保护。

powershell_script "Restart Computer" do
code <<-EOH

    $computer_name=$env:COMPUTERNAME
    Restart-Computer -ComputerName $computer_name
    EOH
    guard_interpreter :powershell_script
    only_if reboot_pending?
end

我用谷歌搜索,发现以下 ruby​​ 脚本用于检查机器是否需要重新启动

def reboot_pending?

  # don't break when used as a mixin in contexts without #node (e.g. specs).
  if self.respond_to?(:node, true) && node.run_context.reboot_requested?
    true
  elsif platform?("windows")
    # PendingFileRenameOperations contains pairs (REG_MULTI_SZ) of filenames that cannot be updated
    # due to a file being in use (usually a temporary file and a system file)
    # \??\c:\temp\test.sys!\??\c:\winnt\system32\test.sys
    # http://technet.microsoft.com/en-us/library/cc960241.aspx
    registry_value_exists?('HKLM\SYSTEM\CurrentControlSet\Control\Session Manager', { :name => 'PendingFileRenameOperations' }) ||

    # RebootRequired key contains Update IDs with a value of 1 if they require a reboot.
    # The existence of RebootRequired alone is sufficient on my Windows 8.1 workstation in Windows Update
    registry_key_exists?('HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired') ||

    # Vista + Server 2008 and newer may have reboots pending from CBS
    registry_key_exists?('HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootRequired') ||

    # The mere existence of the UpdateExeVolatile key should indicate a pending restart for certain updates
    # http://support.microsoft.com/kb/832475
    (registry_key_exists?('HKLM\SOFTWARE\Microsoft\Updates\UpdateExeVolatile') &&
          !registry_get_values('HKLM\SOFTWARE\Microsoft\Updates\UpdateExeVolatile').select { |v| v[:name] == "Flags" }[0].nil? &&
          [1,2,3].include?(registry_get_values('HKLM\SOFTWARE\Microsoft\Updates\UpdateExeVolatile').select { |v| v[:name] == "Flags" }[0][:data]))
  elsif platform?("ubuntu")
    # This should work for Debian as well if update-notifier-common happens to be installed. We need an API for that.
    File.exists?('/var/run/reboot-required')
  else
    false
  end
end

我尝试在守卫中添加此方法,但它不起作用。有没有办法在厨师守卫中编写多行语句?

【问题讨论】:

    标签: ruby chef-infra chef-recipe


    【解决方案1】:

    厨师守卫在一个街区,比如the first example here。块可以是多行的,但不能在其中声明方法。如果您复制找到的方法的内容并将它们放在应该可以工作的only_if 中。

    powershell_script "Restart Computer" do
      ...
      only_if do
        <contents of method here>
      end
    end
    

    虽然这可行,但实现如此广泛的保护的更简洁方法是将 reboot_pending 方法放入 library 并从您的配方中调用该方法。

    【讨论】:

      猜你喜欢
      • 2016-09-17
      • 2012-02-13
      • 2015-03-07
      • 2021-12-21
      • 2018-01-30
      • 1970-01-01
      • 1970-01-01
      • 2010-10-25
      • 2021-12-15
      相关资源
      最近更新 更多