【问题标题】:Is there a way for a Chef recipe to continue after a reboot (Windows)?有没有办法让厨师食谱在重新启动后继续(Windows)?
【发布时间】:2015-09-12 13:28:58
【问题描述】:

我正在尝试使用 Chef 自动安装/部署旧版本的 Windows 产品(特别是 Sharepoint 2007),而且我几乎可以让它工作,但是在安装过程中的某个时刻,安装程序遇到“应用程序兼容性”问题,并弹出一个窗口询问是否继续。如果我点击继续,安装会一直持续到最后,并且可以正常运行。

我找到了一种避免弹出窗口的方法,方法是在 Windows 注册表中添加“Appcompat”键,但如果我在 Chef 运行期间使用 regedit 添加键,我必须让 Chef 重新启动机器,然后之后继续进行其余的安装。

我尝试过类似以下的食谱:

reboot 'Restart Computer' do
  action :nothing
end


powershell_script "install-Sharepoint2007-PREREQUISITES" do
code <<-EOH

regedit /s .\appcompat.reg

EOH

notifies :reboot_now, 'reboot[Restart Computer]', :immediately

end


powershell_script "install-Sharepoint2007" do
code <<-EOH

... the rest of the installation....

EOH

notifies :reboot_now, 'reboot[Restart Computer]', :immediately

end

但在设置注册表项后重新启动后,处理基本上停止了。

所以我想知道:有没有办法用 Chef 做到这一点?

谢谢, 吉姆

编辑:

由于缺少格式,我发现仅使用 cmets 很难,因此我在此处添加有关我迄今为止尝试过的信息。

基本上,到目前为止,我可以让厨师客户端在计划任务中运行的唯一方法是执行“ONCE”计划任务,设置任务运行的时间(到目前为止,我手动设置我的 schtasks 命令中的时间,只是为了测试)。

当我这样做并将“/RU”设置为 SYSTEM 时,我可以看到“chef-client -o”开始运行并且它实际上似乎已完成,但我在 Sharepoint 安装程序日志中看到错误,并且特别是,psconfig(Sharepoint 命令行配置工具)中的某些步骤似乎失败了。

我认为/猜测这些失败的原因是 schtasks 以错误的 Windows 用户身份运行“chef-client -o”。

问题是,如果我“手动”运行第二部分食谱中的“chef-client -o”,即,如果我登录到 Windows 机器并输入:

chef-client -o install-SHAREPOINT-PART2

然后,Sharepoint 会被正确安装和配置。

所以,我现在遇到的问题是,当我通过 schtasks 执行相同的“chef-client -o”命令时,我应该将什么用作 schtasks 命令的“/RU”和“/RP”?

谢谢, 吉姆

编辑 2:抱歉,我忘记在第一个食谱/食谱中包含 schtasks 行,它为第二个食谱/食谱厨师运行设置任务:

schtasks /create /tn Task_Name /tr "chef-client -o install-SHAREPOINT2007FULL-PART2" /sc once /RU "SYSTEM" /SD 06/27/2015 /ST 12:30

编辑 3:我正在研究这个问题的最初原因(让 Chef “通过”重新启动工作)是作为安装 Sharepoint 的一部分,我必须设置一个 Windows 注册表项,我认为我必须重新启动使该注册表更改对安装过程的其余部分有效。

但是,我昨天做了一些测试,看来情况并非如此。我可以更改注册表,然后进行其余的安装,而无需在其间重新启动。

所以,最重要的是我根本不需要在重启后处理。

但无论如何,希望这里的一些信息可以帮助以后的人。我发现的主要问题是我无法使用 ONSTART 和 /Z /V1 让它工作......我必须使用 ONCE 并且必须在我的 Chef 食谱中添加代码来确定日期和时间触发 ONCE 任务。

【问题讨论】:

标签: windows scheduled-tasks chef-infra chef-recipe


【解决方案1】:

总而言之,我会说不是原样。

你必须通过两次运行来调整一些东西才能在那里工作。

您的第一遍将添加注册表信息,如果未将 chef 安装为服务,则计划在几分钟内运行 chef-run(目标在重新启动后),然后重新启动。

第二遍应该检查注册表部分并完成其余的安装。

根据您的代码并假设 Chef 作为自动启动服务安装在节点上,您可以像这样向您的 powershell 资源添加一个保护:

powershell_script "install-Sharepoint2007-PREREQUISITES" do
  code <<-EOH
    regedit /s .\appcompat.reg
  EOH
  notifies :reboot_now, 'reboot[Restart Computer]', :immediately
  not_if registry_data_exists?(
              KEY_PATH,
              { :name => "NAME", :type => TYPE, :data => VALUE },
              ARCHITECTURE
         )
end

关于守卫here 和注册表配方助手here 的文档

【讨论】:

  • 您能详细解释一下您所说的“在几分钟内计划一个厨师运行”是什么意思吗?谢谢,吉姆
  • 我的意思是一个调用at的执行资源在重启完成后启动一个新的厨师运行,时间取决于你的机器启动需要多长时间......
  • 啊!好的,让我试试类似的方法。
  • 我一直在为此苦苦挣扎,使用 schtasks。我可以使第二次运行工作,但不能让它只运行一次。建议使用 /Z 删除计划任务,但在 win2008 上无效。
  • 所以我尝试了/Z /V1,但是计划任务永远不会运行。我还尝试在我的第二部分食谱中添加代码以删除计划任务,但这会导致 Chef 运行过早完成。
【解决方案2】:

您可以让厨师在启动时运行计划任务以运行厨师。

windows_task 'Chef client' do
  user 'SYSTEM'
  command 'chef-client -L C:\chef\chef-client.log'
  run_level :highest
  frequency :onstart
  frequency_modifier 30
  action :create
end

然后当节点重新启动时,厨师将再次运行。

考虑以下配方,它将 Windows 计算机加入域,重新启动,运行 chef(作为计划任务),然后删除计划任务。

https://github.com/NetDocuments/ad-join-cookbook/blob/master/resources/domain_join.rb

更新 有一个 RFC 提议更改 chef 的退出代码以允许智能处理重启。

CHEF RFC #62

【讨论】:

    【解决方案3】:

    使用 rakefile 触发收敛。在 Windows 重新启动并再次重新收敛后,您还应该给一些睡眠时间:这是和示例。

    sh 'bundle exec kitchen converge'
          sleep 120
          sh 'bundle exec kitchen verify'
    

    【讨论】:

      【解决方案4】:

      我已经使用 FLAG 文件方法完成了它,示例如下。 域加入示例-

      ---------------------------Script Start------------------------
      
          powershell_script 'Domain_Join' do
          guard_interpreter :powershell_script
          code -domainJoin
          $currentTime = Get-Date
          $currentTimeString = $currentTime.ToString()
      
        $systemDomain = (Get-WmiObject Win32_ComputerSystem).Domain
        If (($systemDomain) -eq 'domainName')
        { 
          Try {
        write-host "$env:computerName is DOMAIN MEMBER"
        Remove-Item C:\\DomainJoinFlag.txt -ErrorAction Stop
        Unregister-ScheduledTask -TaskName "Chef client schedule_DJ" -Confirm:$false
        } # end of Try
                Catch [System.Management.Automation.ItemNotFoundException]
                  { write-host "Server is already domain member, Or Exception raised due to either missing FLAG file or Server startup schedule task configuration." 
                    eventcreate /t INFORMATION /ID 0909 /L APPLICATION /SO "ChefClient_$env:computerName" /D "Server is already domain member, Or Exception raised due to either missing FLAG file or Server startup schedule task configuration. Refer to the CHEF reciepie for DomainJoin or check Administrative credentials for creting schedule task"}
                  }
          else { write-host "$env:computerName is NOT domain member, joining the server to the domain. Server will be rebooting in a while..."
                  eventcreate /t INFORMATION /ID 0909 /L APPLICATION /SO "ChefClient_$env:computerName" /D "Joining the server : $env:ComputerName to the domain ININLAB.COM (Server Time): $currentTimeString"
                  New-Item C:\\DomainJoinFlag.txt -type file -force
                  write-host "$env:computerName DOMAIN JOIN INITIATED for the server"
                  $cred = New-Object System.Management.Automation.PsCredential("domain\\domain_user", (ConvertTo-SecureString "Password" -AsPlainText -Force))
                  Add-Computer -DomainName "domainName" -Credential $cred -OUPath "OU=HyperV,OU=Infrastructure,OU=Servers,DC=domain,DC=name"
                  shutdown -r -t 120
                  } #end_of_else
                  domainJoin
        notifies :run, 'windows_task[Chef client schedule_DJ]', :immediately
      end
      
      windows_task 'Chef client schedule_DJ' do
        user 'SYSTEM'
        command 'chef-client -L C:\chef\chef-client_after_reboot_domainJoin.log'
        run_level :highest
        frequency :onstart
        frequency_modifier 30
        action :create
        only_if { ::File.exist?('C:\\DomainJoinFlag.txt') }
      end
      
      ---------------------------Script Ends------------------------
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-29
        相关资源
        最近更新 更多