设为首页 收藏本站
查看: 1119|回复: 0

[经验分享] saltstack 事件

[复制链接]

尚未签到

发表于 2018-7-31 08:22:11 | 显示全部楼层 |阅读模式
  https://docs.saltstack.com/en/latest/topics/event/index.html
  salt的内部组件之间的通信是通过发送和监听事件实现的。在salt中,几乎所有的变动都会产生事件,如:
  salt minion连接salt master
  密钥被接受或拒绝
  发送作业
  从minion返回作业结果
  在线心跳(默认情况下已关闭)
  甚至是salt命令行接口使用事件系统都会产生事件。当一个命令发送到salt master后,salt CLI仅仅需要监视事件总线来获取从目标minion返回的作业结果。
  监视事件
  salt提供了一个runner来在salt master上实时显示事件。
  salt-run state.event pretty=True
  事件格式
  事件由两个主要部分组成:标识事件的tag和事件的详细信息。
  事件标记

  所有的salt事件的前缀是salt/,加上基于事件类型的额外级别(level)。例如,作业事件前缀为salt/job/。每个事件部分使用/分隔提供简单的命名空间。这个标识符称为事件标记(event tag),通常包含具体的详细信息,如作业ID或minion>  除了事件标记外,每个事件还包括特定的事件数据。
  事件数据
  每一个事件包括一个timestamp和该特定事件唯一的键和值。
  除了内置事件,你可以在Salt系统中启用一些其他事件,以及生成你自己的事件。
  presence事件
  激活presence事件会使master定期地查找主动连接的minions。presence事件以一定的间隔在事件总线上触发,事件包含已连接minions列表,以及新连接或已断开的minions列表。
  在salt master配置文件中激活:
  presence_events: True
  salt state事件
  激活salt state事件会使在salt state完成每一个函数时发送进度事件。
  在salt master配置文件中激活:
  state_events: True
  完成一个state后触发事件
  如果你的作业配置包含多个salt state,你可以增加fire_event参数以使每一个salt state完成后触发一个事件:
  nano installed:
  pkg.installed:


  • name: nano
  • fire_event: True  或者你可以将True替换为自定义事件字符串,该字符串将附加到触发的事件:

  nano installed:
  pkg.installed:


  • name: nano
  • fire_event: nano/installed
  触发一个自定义事件 (minion端执行)
  你也可以直接在命令行指定一个自定义事件tag和事件数据直接触发一个事件。在你的其中一个salt minions运行如下命令:
  salt-call event.send /my/test/event '{"data": "my event test"}'
  我的是master-------------------syndic-----------------minion 集群,所以会有syndic到master    minion到syndic   以及所有job信息
  #############################################################################################################################################
  salt/auth    {
  "_stamp": "2017-12-06T06:49:03.953439",
  "act": "accept",
  "id": "192.168.90.179",
  "pub": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs7VDHzCJ8950PJIBilFH\nERwCFz3mBXw6vEG98UkVyAe8dQSAJRwYXyxNgIUTCyFJSpdFNPuYEDeLj1f/4Ubx\n+yMa/Xz06PyFLZbK20FIqH4sepnGrfZYw8R7HRV6mdFOCjiSGHDGoB+gMbddCkb1\nML+Vgy42I31eADJI8Cf/1B9PSxOzySMWOHY2Yp4PNogDP8Xv6kV5rxzINK2y1m9a\njHIsb/4G1Lm8xi9JPst/y2X4Z+FKfZp4AWF1d3jmcmc10dByQ5iQlsNhLSjnYbiQ\n4TaxALOqzCoVlfJyMa2bBGfq2RjS2bG6fwjLKgDxKKppkSN3rgvMcXCaYctopEOa\niQIDAQAB\n-----END PUBLIC KEY-----",
  "result": true
  }
  syndic/jy-KVM2/salt/auth    {
  "_stamp": "2017-12-06T06:49:03.955292",
  "act": "accept",
  "id": "192.168.90.179",
  "pub": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs7VDHzCJ8950PJIBilFH\nERwCFz3mBXw6vEG98UkVyAe8dQSAJRwYXyxNgIUTCyFJSpdFNPuYEDeLj1f/4Ubx\n+yMa/Xz06PyFLZbK20FIqH4sepnGrfZYw8R7HRV6mdFOCjiSGHDGoB+gMbddCkb1\nML+Vgy42I31eADJI8Cf/1B9PSxOzySMWOHY2Yp4PNogDP8Xv6kV5rxzINK2y1m9a\njHIsb/4G1Lm8xi9JPst/y2X4Z+FKfZp4AWF1d3jmcmc10dByQ5iQlsNhLSjnYbiQ\n4TaxALOqzCoVlfJyMa2bBGfq2RjS2bG6fwjLKgDxKKppkSN3rgvMcXCaYctopEOa\niQIDAQAB\n-----END PUBLIC KEY-----",
  "result": true
  }
  /my/test/event    {
  "_stamp": "2017-12-06T06:49:03.956857",
  "cmd": "_minion_event",
  "data": {
  "pub_fun": "event.send",
  "__pub_jid": "20171206144903777457",
  "pub_pid": 12248,
  "pub_tgt": "salt-call",
  "data": "my event test"
  },
  "id": "192.168.90.179",
  "tag": "/my/test/event"                                  -------------------------minion自定义事件
  }
  syndic/jy-KVM2//my/test/event    {
  "_stamp": "2017-12-06T06:49:03.958386",
  "cmd": "_minion_event",
  "data": {
  "pub_fun": "event.send",
  "pub_jid": "20171206144903777457",
  "__pub_pid": 12248,
  "pub_tgt": "salt-call",
  "data": "my event test"
  },
  "id": "192.168.90.179",
  "tag": "/my/test/event"
  }
  salt/job/20171206144903833771/ret/192.168.90.179    {
  "_stamp": "2017-12-06T06:49:03.972055",
  "fun": "event.send",
  "fun_args": null,
  "id": "192.168.90.179",
  "jid": "20171206144903833771",
  "retcode": 0,
  "return": true
  }
  ###########################################################################
  可以利用它来监听其它事情,如系统登录,硬盘使用和数据库服务”。
  而beacons就是用来做这样的事情的。
  beacons让你能够监控与salt无关的事情以及触发事件。beacon系统允许minion与各种系统进程挂钩并持续监控进程。当监控的系统进程活动发生时,minion就发送一个事件到salt事件总线。
  salt beacons目前能对许多系统活动进行监控和发送事件,包括:
  1.文件系统变动
  2.系统负载
  3.服务状态
  4.shell活动,如用户登录
  5.网络和硬盘使用情况
  激活一个beacon
  salt beacons的激活不需要对监控的系统进程进行任何更改,一切配置都可以使用salt来做。
  在minion的配置文件中增加如下配置:
  beacons:
  inotify:
  home/user/importantfile:
  mask:


  •   modify
      

    beacon监控间隔  


  beacons默认以1秒的间隔监控。可以增加一个interval参数来设置一个不同的间隔。如下是设置了5和10秒的间隔:
  beacons:
  inotify:
  /etc/httpd/conf.d: {}
  /opt: {}
  interval: 5
  load:


  • 1m:

    • 0.0
    • 2.0

  • 5m:

    • 0.0
    • 1.5

  • 15m:

    • 0.1
    • 1.0

  • interval: 10  如果一个beacon的更改可能引起重新触发这个beacon的话,设置disable_during_state_run为True以避免循环事件发生。
      增加beacon

  我们准备增加一个beacon来监控一个文件的更改。要配置这个,需要使用inotify beacon和安装python-pyinotify包。因为salt minions没有这个包,首先我们使用salt来安装它。
  salt 'minion1' pkg.install python-pyinotify
  salt-run state.event pretty=True
  让它在终端中运行并继续。
  设置一个beacon
  编辑minion1的/etc/salt/minion文件,在底部添加如下内容:
  beacons:
  inotify:
  /home/vagrant/importantfile:
  mask:


  • modify  保存文件重启salt minion服务:

  在/home/vagrant/目录创建importantfile:
  touch importantfile
  echo "some content" > importantfile
  回到salt master刚才运行event runnner的终端,你应该会看到如下输出:
  salt/beacon/minion1/inotify//home/vagrant/importantfile {
  "_stamp": "2016-02-03T22:32:09.592113",
  "data": {
  "change": "IN_MODIFY",
  "id": "minion1",
  "path": "/home/vagrant/importantfile"
  },
  "tag": "salt/beacon/minion1/inotify//home/vagrant/importantfile"
  }
  salt的reactor系统让你能够对任何事件作出响应。你不只能够在作业和任务完成时作出响应,也能够在服务下线,用户登录,文件被更改和在任何地方发送的自定义事件作出反应。
  reactor配置
  在/etc/salt/master或/etc/salt/master.d/reactor.conf中添加reactor区块来配置reactor(只允许添加一个reactor区块)。
  下面的示例是配置一个匹配minion启动,云资源回收和自定义事件的reactor:
  reactor:                            # Salt master配置区块"reactor"


  •   'salt/minion//start':          # 匹配tag "salt/minion//start"

    • /srv/reactor/start.sls        # minion启动时应用的一个state文件
    • /srv/reactor/monitor.sls      # 另一个state文件

  •   'salt/cloud/*/destroyed':       # 可以使用通配符匹配tags

    • /srv/reactor/destroy/*.sls    # 可以使用通配符匹配文件名

  • 'myco/custom/event/tag':

    • salt://reactor/mycustom.sls

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


  • 'my/custom/event/tag':
  • 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中的远程执行也同样需要这三个信息:

  <section>  local.<function>:


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

  salt 'myminion' pkg.install cowsay
  在reactor SLS文件中,应该是按如下配置:
  install cowsay on myminion:
  local.pkg.install:


  • tgt: 'myminion'
  • arg:

    • cowsay  RUNNER和WHEEL模块


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


  • prof: centos_6
  • instances:

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


  accept_new_minion:
  wheel.key.accept:


  • match: {{ data['id'] }}  更多的示例

  下面的reactor SLS用来对salt/cloud/*/created事件反应:
  new vm alert:
  local.pagerduty.create_event:


  • tgt: minion
  • kwarg:  description: &quot;New VM {{ data['name'] }}&quot;
      details: &quot;New VM on {{ data['provider'] }}: {{ data['name'] }}&quot;
      service_key: 1162ee51ed6e46239265c969729c48eb
      profile: my-pagerduty-account
      如果你配置了当构建系统完成后触发一个自定义事件,那么你可以使用slack来通知你:

  spam slack:
  local.slack_notify.post_message


  • tgt: buildserver
  • kwarg:  channel: &quot;Development&quot;
      api_key: peWcBiMOS9HrZG15peWcBiMOS9HrZG15&quot;
      message: &quot;Build {{ data['build_id'] }} finished with status: {{ data['status'] }}&quot;
      salt state

  state执行模块可以用在reactor SLS文件来应用一个salt state,或者触发一个highstate。
  {% if data['id'] == 'mysql1' %}
  highstate_run:
  local.state.highstate:


  • tgt: mysql1  {% endif %}

  reactor配置测试
  master----------------------------syndic--------------------------------------minion
  master
  root@jy-KVM1:/etc/salt# cat master
  ipv6: False
  interface: 192.168.90.177
  auto_accept: True
  state_top: top.sls
  order_masters: True
  return: mysql
  event_return: mysql                   -------------------------------返回到mysql
  file_roots:
  base:


  • /etc/salt/base  prod:

  • /etc/salt/prod
  state_events: True
  mysql.host: '192.168.90.177'
  mysql.user: 'salt'
  mysql.pass: 'salt'
  mysql.db: 'salt'
  mysql.port: 3306
  syndic
  root@jy-KVM2:/etc/salt# cat master
  ipv6: False
  auto_accept: True
  file_roots:
  base:


  • /etc/salt/base  prod:

  • /etc/salt/prod  syndic_master: 192.168.90.177

  default_include: master.d/*.conf                  ---------------------需要配置
  root@jy-KVM2:/etc/salt/master.d# cat reactor.conf ----------------- 编写reactor文件
  reactor:


  • 'salt/minion/*/start':

    • salt://a.sls

  root@jy-KVM2:/etc/salt/base# cat a.sls      -----------------------编写 reactor的sls文件
  install cowsay on myminion:
  local.cmd.run:


  • tgt: '*'
  • arg:

    • /bin/echo 123 >> /tmp/haha.log

  minion
  root@jy-KVM3:~# cat /etc/salt/minion|grep -v &quot;#&quot; |grep -v &quot;^ *$&quot;
  master: 192.168.90.178
  id: 192.168.90.179
  mysql.host: '192.168.90.177'
  mysql.user: 'salt'
  mysql.pass: 'salt'
  mysql.db: 'salt'
  mysql.port: 3306
  root@jy-KVM3:~#
  以上是定义minion 启动 触发执行a.sls  执行echo语句
  会发现minion的tmp下生成这个文件。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-543858-1-1.html 上篇帖子: saltstack runner控制不同minion执行顺序 下篇帖子: Saltstack-8:状态管理
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表