如何在 chef guard 中添加多行语句?
How do I add multiline statement inside chef gaurd?
在我的食谱中,我有以下重新启动计算机的资源,但我想对此资源应用防护。
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
我试图在 guard 中添加此方法,但它不是 working.Is有什么方法可以在 chef guard 中编写多行语句?
厨师守卫收下一块,喜欢the first example here。块可以是多行的,但不能在其中声明方法。如果您复制找到的方法的内容并将它们放入应该有效的 only_if
中。
powershell_script "Restart Computer" do
...
only_if do
<contents of method here>
end
end
虽然这可行,但实现如此广泛的保护的更简洁的方法是将 reboot_pending
方法放在 library 中,然后从您的配方中调用该方法。
在我的食谱中,我有以下重新启动计算机的资源,但我想对此资源应用防护。
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
我试图在 guard 中添加此方法,但它不是 working.Is有什么方法可以在 chef guard 中编写多行语句?
厨师守卫收下一块,喜欢the first example here。块可以是多行的,但不能在其中声明方法。如果您复制找到的方法的内容并将它们放入应该有效的 only_if
中。
powershell_script "Restart Computer" do
...
only_if do
<contents of method here>
end
end
虽然这可行,但实现如此广泛的保护的更简洁的方法是将 reboot_pending
方法放在 library 中,然后从您的配方中调用该方法。