要Docker Engine在swarm模式下使用,需要从https://github.com/docker/docker/releases安装Docker Engine v1.12.0或更高的版本。或者安装最新版本的Docker for Mac或Docker for Windows Beta。
Docker Engine 1.12引入了本地管理Docker Engines集群的swarm模式,称为swarm。使用Docker CLI创建一个swarm,部署应用服务到swarm和管理swarm行为。
月份:2016年12月
SaltStack事件驱动(4) – event reactor
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有如下几种类型:
远程执行
这种类型的reactor是直接与salt执行模块连接。如果你考虑使用salt命令来运行一个远程执行模块,你应该知道salt命令必须包含三个信息:
salt reactor中的远程执行也同样需要这三个信息:
- <section id>:
- 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: "New VM {{ data[‘name’] }}"
- details: "New VM on {{ data[‘provider’] }}: {{ data[‘name’] }}"
- service_key: 1162ee51ed6e46239265c969729c48eb
- profile: my-pagerduty-account
如果你配置了当构建系统完成后触发一个自定义事件,那么你可以使用slack来通知你:
- spam slack:
- local.slack_notify.post_message
- – tgt: buildserver
- – kwarg:
- channel: "Development"
- api_key: peWcBiMOS9HrZG15peWcBiMOS9HrZG15"
- message: "Build {{ data[‘build_id’] }} finished with status: {{ data[‘status’] }}"
salt state
state执行模块可以用在reactor SLS文件来应用一个salt state,或者触发一个highstate。
- {% if data[‘id’] == ‘mysql1’ %}
- highstate_run:
- local.state.highstate:
- – tgt: mysql1
- {% endif %}
SaltStack事件驱动(3) – BEACONS
到目前为止我们已经学习如何通过事件总线监控与salt相关的事件,以及激活一些其它的事件。这时候你可能会想“既然我已经设置了一个能监控和实时反馈事件的动态通信设施,那么我肯定可以利用它来监听其它事情,如系统登录,硬盘使用和数据库服务”。而beacons就是用来做这样的事情的。
beacons让你能够监控与salt无关的事情以及触发事件。beacon系统允许minion与各种系统进程挂钩并持续监控进程。当监控的系统进程活动发生时,minion就发送一个事件到salt事件总线。
salt beacons目前能对许多系统活动进行监控和发送事件,包括:
激活一个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来安装它。
安装pyinotify和启动event runner
增加命令行终端进入salt-vagrant-demo目录,ssh到master:
- vagrant ssh master
在minion1安装python-pyinotify:
- sudo salt ‘minion1’ pkg.install python-pyinotify
输出类似如下:
- vagrant@saltmaster:~$ sudo salt ‘minion1’ pkg.install python-pyinotify
- minion1:
- ———-
- python-pyinotify:
- ———-
- new:
- 0.9.4-1build1
- old:
- python2.7-pyinotify:
- ———-
- new:
- 1
- old:
我们很快就会生成一个事件,在master启动一个event runner并保持登录:
- salt-run state.event pretty=True
让它在终端中运行并继续。
设置一个beacon
打开另一个终端进入salt-vagrant-demo目录,ssh进minion1:
- vagrant ssh minion1
编辑minion1的/etc/salt/minion文件,在底部添加如下内容:
- beacons:
- inotify:
- /home/vagrant/importantfile:
- mask:
- – modify
保存文件重启salt minion服务:
- sudo service salt-minion restart
现在beacon已经激活。下面我们创建将要监控的文件。在/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"
- }
记得event runner必须在文件被更改前启动,否则你不会看到事件。
SaltStack事件驱动(2) – 自定义事件
除了内置事件,你可以在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
触发一个自定义事件
你也可以直接在命令行指定一个自定义事件tag和事件数据直接触发一个事件。在你的其中一个salt minions运行如下命令:
- salt-call event.send /my/test/event ‘{"data": "my event test"}’
输出类似如下:
- /my/test/event {
- "_stamp": "2016-02-05T18:24:47.001310",
- "cmd": "_minion_event",
- "data": {
- "__pub_fun": "event.send",
- "__pub_jid": "20160205182446924651",
- "__pub_pid": 1933,
- "__pub_tgt": "salt-call",
- "data": "my event test"
- },
- "id": "minion1",
- "tag": "/my/test/event"
- }
SaltStack事件驱动(1) – 监视事件
salt的内部组件之间的通信是通过发送和监听事件实现的。在salt中,几乎所有的变动都会产生事件,如:
甚至是salt命令行接口使用事件系统都会产生事件。当一个命令发送到salt master后,salt CLI仅仅需要监视事件总线来获取从目标minion返回的作业结果。
监视事件
salt提供了一个runner来在salt master上实时显示事件。
- salt-run state.event pretty=True
如果你使用的是demo环境,你的事件总线可能是安静的,所以尝试打开另一个终端,发送一条salt ‘*’ test.ping命令或者重启salt-minion服务。
下面是几条在salt master上获取到的事件:
- salt/job/20150923203228234305/new {
- "_stamp": "2016-12-01T08:11:28.235712",
- "arg": [],
- "fun": "test.ping",
- "jid": "20161201081128234305",
- "minions": [
- "minion2"
- ],
- "tgt": "*",
- "tgt_type": "glob",
- "user": "sudo_vagrant"
- }
- salt/job/20161201081128234305/ret/minion2 {
- "_stamp": "2016-12-01T08:11:28.291789",
- "cmd": "_return",
- "fun": "test.ping",
- "fun_args": [],
- "id": "minion2",
- "jid": "20161201081128234305",
- "retcode": 0,
- "return": true,
- "success": true
- }
- salt/auth {
- "_stamp": "2016-12-01T08:11:02.998305",
- "act": "pend",
- "id": "minion1",
- "pub": "—–BEGIN PUBLIC KEY—–…n—–END PUBLIC KEY—–n",
- "result": true
- }
事件格式
事件由两个主要部分组成:标识事件的tag和事件的详细信息。
事件标记
所有的salt事件的前缀是salt/,加上基于事件类型的额外级别(level)。例如,作业事件前缀为salt/job/。每个事件部分使用/分隔提供简单的命名空间。这个标识符称为事件标记(event tag),通常包含具体的详细信息,如作业ID或minion ID。
除了事件标记外,每个事件还包括特定的事件数据。
事件数据
每一个事件包括一个timestamp和该特定事件唯一的键和值。