SaltStack事件驱动(4) – event reactor

salt的reactor系统让你能够对任何事件作出响应。你不只能够在作业和任务完成时作出响应,也能够在服务下线,用户登录,文件被更改和在任何地方发送的自定义事件作出反应。

reactor配置

在/etc/salt/master或/etc/salt/master.d/reactor.conf中添加reactor区块来配置reactor(只允许添加一个reactor区块)。
下面的示例是配置一个匹配minion启动,云资源回收和自定义事件的reactor:

  1. reactor:                            # Salt master配置区块"reactor"
  2.  
  3.   - 'salt/minion/*/start':          # 匹配tag "salt/minion/*/start"
  4.     - /srv/reactor/start.sls        # minion启动时应用的一个state文件
  5.     - /srv/reactor/monitor.sls      # 另一个state文件
  6.  
  7.   - 'salt/cloud/*/destroyed':       # 可以使用通配符匹配tags
  8.     - /srv/reactor/destroy/*.sls    # 可以使用通配符匹配文件名
  9.  
  10.   - 'myco/custom/event/tag':         
  11.     - salt://reactor/mycustom.sls

reactor的配置非常简单;reactor区块唯一的作用是关联事件tag与要运行reactor SLS文件。reactor是一个独立的线程,所以可以在SLS文件里执行繁重的任务。
reactor SLS文件具体YAML和Jinja全部的功能,所以你可以使用事件标记和数据执行过滤和测试。
我们来尝试在demo环境中添加一个reactor来测试这个系统。打开salt-vagrant-demo/saltstack/etc/master文件,添加一个reactor区块:

  1. reactor:
  2.     - 'my/custom/event/tag':
  3.     - salt://reactor/customevent.sls

这个告诉salt master在任何时候一旦发现一个事件包含my/custom/event/tag,则马上调用customevent.sls文件。
我们学习reactor SLS文件后再创建customevent.sls文件。
现在先重启salt-master服务(service salt-master restart)使reactor生效。

reactor SLS文件

你已经对salt state SLS文件有所了解了,与salt reactor SLS有所以类似的地方。salt state和salt reator SLS文件都是使用YAML和Jinja写的,不过因为它们语法有些不同,且用作不同的目的,它们应该放在不同的目录中(如reactor是在/srv/salt/reactors目录)。

reactor的类型

salt reactor有如下几种类型:

  • 远程执行: 在目标minions运行一个执行模块。这个可以通过调用salt命令来完成(包括应用state或highstate)
  • Salt Runners: 通过使用salt-run调用的任务。如HTTP runnner可以触发webhook。
  • Wheel: Wheel命令管理你的salt环境,完成如接收密钥和更新配置设置的任务。
  • 远程执行

    这种类型的reactor是直接与salt执行模块连接。如果你考虑使用salt命令来运行一个远程执行模块,你应该知道salt命令必须包含三个信息:

  • 目标
  • 函数
  • 参数
  • salt reactor中的远程执行也同样需要这三个信息:

    1. <section id>:
    2.   local.<function>:
    3.     - tgt: <target>
    4.     - arg:
    5.         <arguments>

    注意执行模块必须以local为前缀。我们来看在命令行安装一个包是怎样的:

    1. salt 'myminion' pkg.install cowsay

    在reactor SLS文件中,应该是按如下配置:

    1. install cowsay on myminion:
    2.   local.pkg.install:
    3.     - tgt: 'myminion'
    4.     - arg:
    5.       - cowsay

    RUNNER和WHEEL模块

    在reactor中调用Runner模块和Wheel模块语法很简单,因为是在本地执行的函数,不是发送一个命令到远程系统。调用两个模块不需要arg或kwarg参数(除非Runner函数或Wheel函数接收参数)。

    1. clear_the_grains_cache_for_all_minions:
    2.   runner.cache.clear_grains
    1. spin_up_more_web_machines:
    2. runner.cloud.profile:
    3. - prof: centos_6
    4. - instances:
    5.   - web11       
    6.   - web12

    下面是一个wheel示例用来自动接受minion的密钥(在生产环境中你应该增加额外的检查来避免接受恶意minions)。

    1. accept_new_minion:
    2.   wheel.key.accept:
    3.     - match: {{ data['id'] }}

    更多的示例

    下面的reactor SLS用来对salt/cloud/*/created事件反应:

    1. new vm alert:
    2.   local.pagerduty.create_event:
    3.     - tgt: minion
    4.     - kwarg:
    5.         description: "New VM {{ data['name'] }}"
    6.         details: "New VM on {{ data['provider'] }}: {{ data['name'] }}"
    7.         service_key: 1162ee51ed6e46239265c969729c48eb
    8.         profile: my-pagerduty-account

    如果你配置了当构建系统完成后触发一个自定义事件,那么你可以使用slack来通知你:

    1. spam slack:
    2.   local.slack_notify.post_message
    3.     - tgt: buildserver
    4.     - kwarg:
    5.         channel: "Development"
    6.         api_key: peWcBiMOS9HrZG15peWcBiMOS9HrZG15"
    7.         message: "Build {{ data['build_id'] }} finished with status: {{ data['status'] }}"

    salt state

    state执行模块可以用在reactor SLS文件来应用一个salt state,或者触发一个highstate。

    1. {% if data['id'] == 'mysql1' %}
    2. highstate_run:
    3.   local.state.highstate:
    4.     - tgt: mysql1
    5. {% endif %}
    标签:SaltStack 发布于:2019-11-20 11:10:54