我正在编写 chef 脚本来设置 etcd 集群。节点列表(包括它们的 IP)将硬编码在 chef 脚本中(作为属性),并使用静态引导将它们传递给 etcd--初始集群和--initial-cluster-state 新参数。因此 chef 脚本使用这些参数调用 etcd,它们将设置集群,并在将来的运行(例如重新启动)中忽略这些--初始集群参数。
对于首次设置,这很好用。现在假设我稍后想向 etcd 集群添加一个新节点。我首先将另一个节点添加到 chef 属性中的硬编码列表中,然后引导新节点。当脚本调用 etcd 时,--初始集群参数还将包含附加节点,但 etcd 要求使用以下命令调用它--initial-cluster-state 现有代替--initial-cluster-state 新。因此,我需要一个单独的 chef 脚本来添加新节点,而不是启动前几个节点。这对我来说似乎不是一个好的解决方案。
第一个解决方案是在 chef 脚本中区分大小写。我们保留一个单独的初始节点 IP 硬编码列表。如果引导节点属于初始集,它将使用--initial-cluster-state 新如果没有,它将使用--initial-cluster-state 现有。但是,当其中一个初始节点死亡时,此方法不起作用。删除并重新启动它时,它将获得与之前相同的 IP(这使它有资格成为初始节点),并将尝试使用--initial-cluster-state 新。
如果 etcd 中有某种自动识别功能,可以选择--初始集群状态自动参数,那就太好了。但据我所知,etcd 不提供此功能。
使用 chef 设置 etcd 集群的推荐方法是什么?