如何使用Chef Windows重新启动资源仅重新启动一次

时间:2020-01-29 15:42:36

标签: windows chef-infra reboot

我当前正在尝试在厨师资源中使用重新启动资源:

reboot 'ADS Install Complete' do
  action :nothing
  reason 'Cannot continue Chef run without a reboot.'
  only_if {reboot_pending?}
end

...

execute 'Initialize ADS Configuration INI' do
  command "\"#{node["ads-tfs-ini"]["tfsconfig_path"]}\" unattend \/create \/type:#{node["ads-tfs-ini"]["Scenario"]} \/unattendfile:\"#{node["ads-tfs-ini"]["unattend_file_path"]}\""
  only_if { ! "#{ENV['JAVA_HOME']}".to_s.empty? }
  notifies :request_reboot, 'reboot[ADS Install Complete]', :delayed
end

我遇到了无休止的重启循环(客户端重新启动-> chef客户端运行-> chef客户端重新运行run_list--客户端重新启动-> ...)。我怎样才能重启一次?

3 个答案:

答案 0 :(得分:0)

您可以添加一些验证以检查计算机是否已重新启动一次。

ruby_block "reboot" do
  unless File.exist?("C:\reboot") do
    block do
      Chef::Util::FileEdit.new('C:\reboot').write_file
      Chef::ShellOut.new("shutdown /r").run_command
    end
  end
end

这种解决方案并不是很优雅,但是应该可以。重启位于ruby块内部,只有在C:\ reboot不存在的情况下才会运行。如果该文件不存在,那么该块将创建该文件,然后调用重新引导。在第二次运行Chef时,该文件将存在,因此不会触发重新启动。

Here is the documention regarding ruby_block

答案 1 :(得分:0)

来自reboot名厨师资源:

使用重新启动资源重新启动节点,这是某些平台上某些安装的必要步骤。支持在Microsoft Windows,macOS和Linux平台上使用此资源。

reboot 'name' do
  action :reboot_now
end

答案 2 :(得分:0)

如果only_if 不为空,则execute资源中的ENV['JAVA_HOME']防护将使执行资源运行。很可能已设置了此环境变量,这就是为什么每次Chef运行时都会运行execute资源并触发重新启动的原因。

我的猜测是,仅在变量为空的情况下,您实际上是否需要运行相反的资源?为此,您只需从行中删除!

only_if { ENV['JAVA_HOME'].to_s.empty? }

如果我先前的猜测是错误的,那么您需要将only_if保护措施更改为更可靠的方法。通过命令行,我了解您已创建了一些配置文件,因此当配置文件已存在时,您无需运行execute资源:

not_if { ::File.exist?('/path/to/file/created/by/command') }