是否可以使用单个 运行 列表动态构建 Elastic 集群?

Is it possible to dynamically build an Elastic cluster with a single run list?

我正在使用 Elasticsearch 说明书。

我的终极目标:

在我开始走这条路之前,我想知道这是否可能,或者是否有节点特定的配置使得无法使用单个 运行 列表完成此操作。

如果节点预先配置了我想要的主机名和 IP,我可以使用节点属性将此信息插入配置中。我可以让配方随机选择 4 个或更多节点中的 3 个成为主分片吗?

绝对有可能。可能有更好的做法(如果有请分享),但我能够使用 Chef search 和标签创建这样的动态集群(尽管我正在为 consul 而不是 ES 编写食谱)。

在 Chef 中搜索任何标记为主要 ES 主机的节点。如果没有找到,则将当前节点收敛为master。如果存在master,则收敛当前节点为slave。

您的Chef 搜索结果将包含ES master 的所有节点信息。与其维护预配置的 IP 和主机名,不如从搜索结果的节点对象中提取它(允许扩展)。

以下代码片段假设您有一个 master.rb 食谱和一个 slave.rb 食谱。

es_servers = search(
 :node, 
 "tags:elasticsearch AND chef_environment:#{node.chef_environment}"
)

if es_servers.length < 1 || tagged?('elasticsearch')

    # Configure this node with as ES master
    # ..  
    include_recipe 'es::master'

    # tag this node as a server
    tag('elasticsearch') unless tagged?('elasticsearch')

else

    # There are already 1 ES servers.
    include_recipe 'es::slave'

end

警告:* 如果将配方添加到 4 个节点并同时执行 chef-client,它们将全部旋转为主节点。对于集群的初始构建,请先构建您的主节点,然后再构建您的从节点。