Chef - 如何重新启动 VM 并继续执行操作

Posted

技术标签:

【中文标题】Chef - 如何重新启动 VM 并继续执行操作【英文标题】:Chef - How Reboot VM and continue performing actions 【发布时间】:2014-08-21 06:43:12 【问题描述】:

在 Chef 食谱中,我需要在执行一些操作后在节点上执行重启, 重启完成后,我需要继续执行其他操作:

食谱: -行动1 -行动2 -重启 -action3 -action4....

我检查了社区中的一些现有食谱:reboot-handler、chef-reboot、chef-restart、chef-dominous,但我无法让它们中的任何一个工作。

Chef 有什么方法可以得到我需要的东西吗? 请提供详细示例。

非常感谢您的帮助。

【问题讨论】:

抱歉没有说明,是Linux:Centos 6.5 and Redhat 6.x 我发现的类似概念是 chef-restart cookbook 提出的,它也有一个很好的重启登录 shell 的方法:github.com/keenlabs/chef-restart 但是它抛出了很多错误,似乎它没有更新一段时间和现在与最新版本的 Chef 或其他一些库不兼容。 【参考方案1】:

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

【讨论】:

请解释一下你的答案【参考方案2】:
This is a recipe of mine you can try.
# Cookbook Name:: reboot-test
# Recipe:: default

bash 'reboot' do
     cwd '/tmp'
      code <<-EOH
      touch reboot.lock
      chmod +x /etc/rc.d/rc.local
#     echo "/usr/local/bin/chef-client" >> /etc/rc.d/rc.local
      cp /etc/rc.d/rc.local /etc/rc.d/rc.local_bkp
      echo "/bin/chef-client" >> /etc/rc.d/rc.local
      reboot
      EOH
      ignore_failure true
      not_if do ::File.exists?('/tmp/reboot.lock') end
      not_if 'ls -lrth /tmp/reboot.lock'
     end

#This is where you need to code for the config automation like the execute #resource but before the bash resource "CHEF-CLIENT-#EXIT"

execute 'touch' do
     command '/bin/touch /tmp/suman.test'
     end

bash 'chef_client_exit' do
      code <<-EOH
      rm -rf /tmp/reboot.lock
#     sed -i '/\/usr\/local\/bin\/chef-client/d' /etc/rc.d/rc.local
#     sed -e '/^\/bin\/chef-client/d' -i /etc/rc.d/rc.local
#     sed -e '\|^/bin/chef-client|d' -i /etc/rc.d/rc.local
      cp /etc/rc.d/rc.local_bkp /etc/rc.d/rc.local
      rm -rf /etc/rc.d/rc.local_bkp
      EOH
      only_if 'grep -i chef-client /etc/rc.d/rc.local'
     end

【讨论】:

请解释一下你的答案。【参考方案3】:

使用chef tags 来实现一系列的状态转换怎么样?这种方法可以与reboot-handlercookbook 结合使用来管理实际的重启。

示例

default.rb

#
# Action recipes
#
include_recipe "mycookbook::action1"
include_recipe "mycookbook::action2"

#
# State transitions
#
if tagged?("doAction1")

  untag("doAction1")
  tag("doAction2")

elsif tagged?("doAction2")

  untag("doAction2")

end    

action1.rb

if tagged?("doAction1")

  ..
  ..

end

action2.rb

include_recipe "reboot-handler"

if tagged?("doAction2")

  ..
  ..

  # Trigger reboot at end of chef run
  node.run_state['reboot'] = true
end

【讨论】:

感谢您的回复。我看到的示例是在 Chef 运行结束时重新启动,但我需要在重新启动后添加另一个操作,我的意思是我需要在执行过程中重新启动,而 Chef 不需要“切断运行”并在重新启动下一个动作后继续运行。 reboot-handler 的问题在于它会在最后安排重启。我发现的最相似的概念是 chef-restart 食谱:github.com/keenlabs/chef-restart,但它似乎很旧,不能与较新的 Chef 版本一起使用,并且不支持 Centos/Redhat SO。 @user2620348 这就是使用标签的目的。 “doAction1”标签允许在重启前应用功能,“doAction2”标签允许在重启后应用功能。 “doAction1”标签首先应用在哪里?我可以看到 doAction2 在您的示例中应用的位置,但我看不到 doAction2 的设置位置。 @StefanoRicciardi 您已经指出需要触发工作流。提问者没有具体说明标准。设置标签(从而触发某些东西)的最简单方法是使用“刀标签”命令。 docs.chef.io/knife_tag.html

以上是关于Chef - 如何重新启动 VM 并继续执行操作的主要内容,如果未能解决你的问题,请参考以下文章

如何控制 Vagrant 用于配置 VM 的 Chef 版本?

苹果电脑重装系统

如何停止 gcloud 容器引擎集群

Apache 继续存在于 chef 实例中

我在vm中装的centos6.0,升级重装了openssl和sasl后重启,不能进入系统,启动时有三个服务失败,见图。

当应用程序关闭并重新启动时,如何继续上一个活动?