我正在研究盐状态,将多个应用程序从一个产品集群转移到另一个产品集群。我想运行 2 个盐状态(
stop_service
和 iisreset
)。 stop_service
将仅在 clusterA 和 clusterB 上的服务器上运行,iisreset
将在 clusterA、clusterB 和 clusterC 中的所有服务器上运行,但取决于 stop_service
在 clusterA 和 clusterB 中成功完成。如何为不同服务器上运行的状态创建这种依赖关系。
注意:我知道“salt Orchestrate”可以做到这一点,但在我们的 salt 环境中,我们没有任何访问 salt master 的权限(我们只能在 minions 上运行 state.apply 或 salt-call)。所以看一些“hacky”替代方法来实现这一点。
{% set cluster = grains['prodcluster'] %}
{% if cluster in ["clusterA","clusterB"] %}
stop_service:
service.dead:
- name: my_service
{% endif %}
reset iis: # this needs to run on all 3 clusters only after the above state has completed successfully.
cmd.run:
- name: iisreset
如何让集群 C 在 clusterA 和 clusterB 服务停止之前不运行 iisreset?
如果无法访问 Salt master,则无法执行此操作(正如您所说,这将使用编排)。
“黑客”可能是使用 SSH 或类似方法而不是 Salt 进行远程调用。
{% for cluster in ["clusterA", "clusterB"] %}
stop service on {{ cluster }}:
cmd.run:
- name: ssh root@{{ cluster }} salt-call service.stop my_service
- require_in:
- reset iis
{% endfor %}
reset iis:
cmd.run:
- name: iisreset
您还可以使用 Salt 来设置 ssh 密钥身份验证,但您需要编排以确保它第一次以正确的顺序工作。
更糟糕的黑客是使用支柱模板来调用编排,但您可能很难控制它何时发生。
{% do salt["saltutil.runner"]("state.orchestrate", arg=["_orch.my_service"]) %}