如何要求 State 在单独的 Minion 上运行而无需编排?

问题描述 投票:0回答:1

我正在研究盐状态,将多个应用程序从一个产品集群转移到另一个产品集群。我想运行 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-stack
1个回答
0
投票

如果无法访问 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"]) %}

如果您的主机配置不安全,您还可以使用相同的技巧编辑配置来设置reactor或启用对等通信

© www.soinside.com 2019 - 2024. All rights reserved.