条件盐状态

时间:2017-12-08 20:34:26

标签: salt-stack

我有一个场景,如果另一个服务已在运行,我需要采取行动。具体来说,我想安装snmp监控,例如,如果mysql已经在运行。

我知道"对"这样做的方法是安装mysql及其监控基于支柱数据,谷物数据或其他一些顶级文件过滤。但是,在这种情况下,mysql正在配置管理之外安装(例如,MSP具有安装mysql但后来依赖托管提供商配置监视的客户端)。

在这种情况下,最佳做法是什么?

我想到的一些解决方案:

  1. 创建一个列出正在运行的服务的自定义谷物。
  2. 使用unless / only if(以及不同OS分发的映射文件)
  3. Beacon(声明服务正在运行)和reactor(部署)
  4. 在状态文件中调用jinja中的service.status执行模块,例如:
  5. {% set mysqlrunning = salt['service.status'](mysql_service) %} {% if mysqlrunning %} <rest of state file> {% endif %}

    虽然#4看起来很简单,但我担心它会很慢并且在大型部署(1000多台服务器)中使用大量系统资源。

    在这种情况下,最佳做法是什么?

2 个答案:

答案 0 :(得分:1)

通常情况下,在州使用Jinja的人比较容易,但是使用Jinja maps

在您的示例案例中,我将使用require

mysqld:
  service.running

insert_sql:
  cmd.run:
    - name: mysql < /tmp/src.sql
    - require:
      - service: mysqld 

答案 1 :(得分:0)

我的SLS文件中有类似的情况:

ipa-client-automount:
  cmd.run:
    - names: 
      {% if salt['cmd.run']('hostname -f | grep domain1') %}
      - ipa-client-automount --location=domain1 -U
      {% elif salt['cmd.run']('hostname -f | grep domain2') %}
      - ipa-client-automount --location=domain2 -U
      {% endif %}
    - unless: ipa-client-automount 2>&1 | grep already

您可以执行相同的结构,但条件是grep服务的状态:

{% if salt['cmd.run']('systemctl status mysql | grep active'%}