Как использовать ресурс перезагрузки Chef Windows для перезагрузки только один раз - PullRequest
0 голосов
/ 29 января 2020

В настоящее время я пытаюсь использовать ресурс перезагрузки в ресурсе chef:

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

Я получаю бесконечные l oop перезагрузок (клиентские перезагрузки -> запускается клиент chef -> chef client перезапускает run_list - клиент перезагружается -> ...). Как я могу просто перезагрузиться один раз?

Ответы [ 3 ]

0 голосов
/ 31 января 2020

из reboot ресурс шеф-повара:

Используйте ресурс перезагрузки, чтобы перезагрузить узел, необходимый шаг для некоторых установок на определенных платформах. Этот ресурс поддерживается для использования на платформах Microsoft Windows, macOS и Linux.

reboot 'name' do
  action :reboot_now
end
0 голосов
/ 03 февраля 2020

Ваш only_if сторож в ресурсе execute запускает ресурс выполнения, если ENV['JAVA_HOME'] не пусто . Весьма вероятно, что эта переменная окружения установлена, и поэтому ваш ресурс execute запускается каждый раз, когда запускается Chef и запускает перезагрузку.

Полагаю, вам просто нужно наоборот, запустите ресурс, только если переменная пуста . Для этого вы можете просто удалить ! из строки.

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

Если мое предыдущее предположение неверно, вам нужно изменить защиту only_if на что-то более надежное. Я понимаю, что из командной строки вы создаете некоторые файлы конфигурации, поэтому вам не нужно запускать ресурс execute, когда файлы конфигурации уже существуют:

not_if { ::File.exist?('/path/to/file/created/by/command') }
0 голосов
/ 29 января 2020

Вы можете добавить некоторую проверку, чтобы проверить, был ли компьютер один раз перезагружен.

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 НЕ СУЩЕСТВУЕТ. Если файл не существует, блок создаст файл и затем вызовет перезагрузку. При втором запуске шеф-повара файл будет существовать, поэтому перезагрузка не будет запущена.

Вот документация, касающаяся ruby_block

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...