我们一直在使用厨师进行部署,并且它可以很好地用于简单的场景。但是,我们现在想要在VM基础架构上编写冗余架构。几个盒子聚集在一起,但过早运行厨师脚本将导致它们失败。例如,我们想要配置Windows群集。服务器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
或者,可以编写一个协调器脚本,以便它调用“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
已经开发出一种不同的框架或技术来处理这个问题?
在这些解决方案中,我们通向3(或4,如果它存在)。这似乎是组织部署的最简洁方法,因为意图将存在于更高的抽象层。
处理这些方案的最佳做法或常用方法是什么?
答案 0 :(得分:1)
我建议使用Chef Search来做这件事。这是逻辑工作流程。
我称之为高级节点部署。首先部署一台服务器,然后部署所有其他服务器。
该手册将具有搜索属性的代码,根据结果查找或设置该属性。见下文:
myclusternodes = search(:node, "cluster_name:clusterb")
if myclusternodes != nil
master = myclusternodes.count == 0 ? node[:ipaddress] : myclusternodes[0].ipaddress
end
node.set[:clusterb][:master] = master