2015-06-25 93 views
0

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

我发现了一种避免弹出窗口的方法,在Windows注册表中添加了“Appcompat”键,但如果我在厨师运行期间使用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 

但加工基本停止,设置注册表项后,重新启动后。

所以我想知道:有没有办法与厨师做到这一点?

感谢, 吉姆

编辑:

我觉得很难使用,因为缺乏的格式,所以我加什么我就此试图远远这里的信息只是意见。

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

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

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

的事情是,如果我运行的第二部分菜谱的“厨师客户-o”,“手动”,也就是说,如果我登录到Windows机器和类型:

厨师的客户端安装-o -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:我正在研究这个问题(通过“重新启动主厨”工作)的原始原因是,作为安装Sharepoint的一部分,我必须设置Windows注册表项,并且我认为必须重新启动使该注册表更改对其余的安装过程有效。

不过,我昨天做了一些测试,看来事实并非如此。我可以更改注册表,然后执行安装的其余部分,而不必在两者之间重新启动。

因此,底线是,我不需要毕竟在重新启动后进行处理。

但无论如何,希望这里的一些信息可能会在稍后帮助别人。我发现的主要原因是我无法使用带有/ Z/V1的ONSTART使其工作......我不得不使用ONCE,并且必须在我的Chef配方中有代码来计算日期和时间触发一次性任务。

+0

RFC 62提出了厨师重新启动问题的解决方案。 https://github.com/chef/chef-rfc/blob/master/rfc062-exit-status.md – spuder

回答

1

总而言之,我会说不是现在。

你必须调整的事情做两遍运行那里工作。

你第一遍会添加注册表信息,计划在几分钟厨师运行(在重新启动后靶向),如果厨师不作为服务,并重新启动安装。

第二遍应该通过注册表部分,并执行安装的其余部分。

根据你的代码,并假设厨师安装的节点上。自动启动的服务,你可以只保护添加到您的PowerShell的资源是这样的:在警卫here

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

+0

你能解释一下更多关于你的意思吗?“在几分钟内计划厨师跑步”?谢谢,吉姆 – user555303

+0

我的意思是执行资源调用[at](https://support.microsoft.com/en-us/kb/313565)启动一个新的厨师运行后重新启动完成,时间取决于如何您的机器需要长时间启动... – Tensibai

+0

啊!好吧,让我试试这样的事情。 – user555303

1

你可以有厨师运行在启动时运行的厨师计划的任务。

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的计算机到一个域,重新启动,运行的厨师(作为计划任务),然后删除计划任务。

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

更新有一个RFC建议改为厨师的退出代码,允许intellegently处理重新启动。

CHEF RFC#62

-1

使用Rake文件触发收敛。您应该在Windows重新启动并重新收敛后给出一些休眠时间:以下是示例。

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

我已经使用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------------------------