如何使用厨师协调服务器依赖?

时间:2013-11-16 04:47:18

标签: chef configuration-management knife

我们一直在使用厨师进行部署,并且它可以很好地用于简单的场景。但是,我们现在想要在VM基础架构上编写冗余架构。几个盒子聚集在一起,但过早运行厨师脚本将导致它们失败。例如,我们想要配置Windows群集。服务器1可以配置故障转移群集功能,然后尝试构建群集,但由于尚未配置服务器2,因此运行将失败。

应该怎么做?以下是我们提出的一些想法:

  1. 设计厨师跑步,知道他们会失败,但最终会在不断重新运行时通过。
    • 从自动化的角度来看,这并不理想,因为反馈会变得模棱两可。运行是否以预期的方式失败,或者是否由于未知原因而失败?这可能需要人来设置它。

  2. 在服务器1上运行配方时,从自定义配方中调用“knife ssh”来配置服务器2.例如:

    windows_feature "FailoverClusters" do
        action: install
    end
    
    # ensure server 2 has the cluster feature enabled 
    # (this would likely be implemented as a LWRP using the  the Knife::Chef::Ssh class rather than the execute LWRP)
    execute 'knife ssh "name:Server2" "recipe[windows_cluster::secondary]"'
        action :run
    end
    
    # join the second server to this cluster (semi-pseudo code)
    windows_cluster 'server2' do
        action :join
    end
    
  3. 或者,可以编写一个协调器脚本,以便它调用“knife” ssh“按正确的顺序。脚本将从构建机器或开发人员框中运行:

    # ensure the failover cluster feature is enabled on the secondary server
    execute 'knife ssh "name:Server2" "recipe[windows_cluster::secondary]"'
        action :run
    end
    
    # install the failover cluster feature on the primary box and have it configure the cluster
    execute 'knife ssh "name:Server1" "recipe[windows_cluster::primary]"'
        action :run
    end
    
  4. 已经开发出一种不同的框架或技术来处理这个问题?

  5. 在这些解决方案中,我们通向3(或4,如果它存在)。这似乎是组织部署的最简洁方法,因为意图将存在于更高的抽象层。

    处理这些方案的最佳做法或常用方法是什么?

1 个答案:

答案 0 :(得分:1)

我建议使用Chef Search来做这件事。这是逻辑工作流程。

  1. 在第一台服务器上运行Chef,允许cookbook将其设置为主厨节点属性中的“主”
  2. 在所有其他服务器上运行Chef,允许他们查看“master”
  3. 我称之为高级节点部署。首先部署一台服务器,然后部署所有其他服务器。

    该手册将具有搜索属性的代码,根据结果查找或设置该属性。见下文:

    myclusternodes = search(:node, "cluster_name:clusterb")
    
    if myclusternodes != nil
      master = myclusternodes.count == 0 ? node[:ipaddress] : myclusternodes[0].ipaddress
    end
    
    node.set[:clusterb][:master] = master