管理swarm(7) – swarm实践 – 查看服务详细信息

本文介绍如何查看运行在swarm中的服务的详情。
1.登录manager1机器。
2.运行docker service inspect –pretty 以便于阅读的格式显示服务的详细信息。
查看helloworld服务的详细信息:

  1. $ docker service inspect –pretty helloworld
  2.  
  3. ID:     9uk4639qpg7npwf3fn2aasksr
  4. Name:       helloworld
  5. Mode:       REPLICATED
  6.  Replicas:      1
  7. Placement:
  8. UpdateConfig:
  9.  Parallelism:   1
  10. ContainerSpec:
  11.  Image:     alpine
  12.  Args:  ping docker.com

要以json格式返回服务详细信息的,不带–pretty参数执行相同的命令。

  1. $ docker service inspect helloworld
  2. [
  3. {
  4.     "ID": "9uk4639qpg7npwf3fn2aasksr",
  5.     "Version": {
  6.         "Index": 418
  7.     },
  8.     "CreatedAt": "2016-06-16T21:57:11.622222327Z",
  9.     "UpdatedAt": "2016-06-16T21:57:11.622222327Z",
  10.     "Spec": {
  11.         "Name": "helloworld",
  12.         "TaskTemplate": {
  13.             "ContainerSpec": {
  14.                 "Image": "alpine",
  15.                 "Args": [
  16.                     "ping",
  17.                     "docker.com"
  18.                 ]
  19.             },
  20.             "Resources": {
  21.                 "Limits": {},
  22.                 "Reservations": {}
  23.             },
  24.             "RestartPolicy": {
  25.                 "Condition": "any",
  26.                 "MaxAttempts": 0
  27.             },
  28.             "Placement": {}
  29.         },
  30.         "Mode": {
  31.             "Replicated": {
  32.                 "Replicas": 1
  33.             }
  34.         },
  35.         "UpdateConfig": {
  36.             "Parallelism": 1
  37.         },
  38.         "EndpointSpec": {
  39.             "Mode": "vip"
  40.         }
  41.     },
  42.     "Endpoint": {
  43.         "Spec": {}
  44.     }
  45. }
  46. ]

3.执行docker service ps 来查看哪个节点运行这个服务:
$ docker service ps helloworld

  1. ID                         NAME          SERVICE     IMAGE   LAST STATE         DESIRED STATE  NODE
  2. 8p1vev3fq5zm0mi8g0as41w35  helloworld.1  helloworld  alpine  Running 3 minutes  Running        worker2

在这个例子中,worker2节点运行着helloworld服务。不过你可能会看到服务运行在管理节点上。默认下,swarm中的管理节点能像worker节点一样执行任务。
4.在运行这个服务的节点上执行docker ps来查看运行任务的容器。

  1. $docker ps
  2.  
  3. CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
  4. e609dde94e47        alpine:latest       "ping docker.com"   3 minutes ago       Up 3 minutes                            helloworld.1.8p1vev3fq5zm0mi8g0as41w35

提高在国内安装Docker和拉取镜像的速度

最近在测试docker的各种功能,发现由于国内连接Docker相关服务的网速非常的慢,甚至是无法联通,体验非常的差。要想在国内使用docker,需要设置两步来提高使用体验。
下面以Ubuntu 14.04为例进行设置。

更换docker apt源

安装docker也异常的慢,我们把docker的apt源更换为daocloud的。

  1. echo ‘deb [arch=amd64] https://get.daocloud.io/docker/apt-repo ubuntu-trusty main’ > /etc/apt/sources.list.d/docker.list
  2. apt-get update
  3. apt-get install docker-engine

更换docker register mirror

首先到https://www.daocloud.io/注册一个帐号(注册帐号居然要手机。。。),然后申请docker加速器。
比如申请到的地址为http://xxx.m.daocloud.io
打开/etc/default/docker,添加如下行:

  1. DOCKER_OPTS="$DOCKER_OPTS –registry-mirror=http://xxx.m.daocloud.io"

然后重启docker。
这里感谢daocloud为我们提高加速服务。

管理swarm(6) – swarm实践 – 部署服务

本文尝试在swarm中部署一个服务。
1.登录到manager1机器。
2.执行如下命令来部署服务:

  1. $ docker service create –replicas 1 –name helloworld alpine ping docker.com
  2.  
  3. 9uk4639qpg7npwf3fn2aasksr
  • docker service create命令创建服务
  • –name参数设置服务名称
  • –replicas 1指定运行一个实例
  • alpine ping docker.com参数定义alpine容器运行ping docker.com命令的服务
  • 3.执行docker service ls查看运行中的服务列表:

    1. $ docker service ls
    2.  
    3. ID            NAME        SCALE  IMAGE   COMMAND
    4. 9uk4639qpg7n  helloworld  1/1    alpine  ping docker.com

    管理swarm(5) – swarm实践 – 添加节点到swarm

    一旦你创建好带一个管理节点的swarm后,你就可以往swarm添加worker节点了。
    1.登录worker1机器。
    2.运行由前文创建swarm输出的把worker节点加入到swarm的命令:

    1. $ docker swarm join
    2.   –token  SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c
    3.   192.168.99.100:2377
    4.  
    5. This node joined a swarm as a worker.

    如果你找不到之前添加节点的命令了,可以执行如下命令来查询:

    1. $ docker swarm join-token worker
    2.  
    3. To add a worker to this swarm, run the following command:
    4.  
    5.     docker swarm join
    6.     –token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c
    7.     192.168.99.100:2377

    3.登录worker2机器。
    4.执行与第2步相同的命令把worker2添加到swarm中:

    1. $ docker swarm join
    2.   –token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c
    3.   192.168.99.100:2377
    4.  
    5. This node joined a swarm as a worker.

    5.登录manage1机器,执行docker node ls命令来查询worker节点:

    1. ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
    2. 03g1y59jwfg7cf99w4lt0f662    worker2   Ready   Active
    3. 9j68exjopxe7wfl6yuxml7a7j    worker1   Ready   Active
    4. dxn1zf6l61qsb1josjja83ngz *  manager1  Ready   Active        Leader

    管理swarm(4) – swarm实践 – 创建一个swarm

    完成上一篇文章的环境准备后,我们准备演示如何创建一个swarm。确保你主机的Docker Engine daemon运行状态。
    1.登录manager1机器
    2.运行如下命令来创建一个新的swarm:

    1. docker swarm init –advertise-addr <MANAGER-IP>

    在本实践我们在manager1来创建一个swarm:

    1. $ docker swarm init –advertise-addr 192.168.99.100
    2. Swarm initialized: current node (dxn1zf6l61qsb1josjja83ngz) is now a manager.
    3.  
    4. To add a worker to this swarm, run the following command:
    5.  
    6.     docker swarm join
    7.     –token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c
    8.     192.168.99.100:2377
    9.  
    10. To add a manager to this swarm, run ‘docker swarm join-token manager’ and follow the instructions.

    –advertise-addr参数配置管理节点发布它的IP地址192.168.99.100。其它的节点必须能通过此IP来连接管理节点。
    上面命令的输出包含了加入新节点到swarm的命令。节点将作为manager或worker加入,具体取决于–token标志的值。
    3.运行docker info来查看目前swarm的状态:

    1. $ docker info
    2.  
    3. Containers: 2
    4. Running: 0
    5. Paused: 0
    6. Stopped: 2
    7.   …snip…
    8. Swarm: active
    9.   NodeID: dxn1zf6l61qsb1josjja83ngz
    10.   Is Manager: true
    11.   Managers: 1
    12.   Nodes: 1
    13.   …snip…

    4.执行docker node ls命令来查看节点的相关信息:

    1. $ docker node ls
    2.  
    3. ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
    4. dxn1zf6l61qsb1josjja83ngz *  manager1  Ready   Active        Leader

    管理swarm(3) – swarm实践 – 环境准备

    在我们开始试验swarm的功能时,先来搭建所需的环境。

    三个联网的主机

    swarm实践我们使用三台联网的主机来作为swarm的节点。这三台主机可以是你PC,数据中心或云服务提供商的三台虚拟机。本实践使用如下机器名:

  • manager1
  • worker1
  • worker2
  • Docker Engine 1.12或更高版本

    本实践需要每台主机的Docker Engine的版本为1.12或更高版本。
    在每台运行的主机上安装Docker Engine并验证其版本。你可以按照如下方法来获取最新版本的Docker Engine。

    在Linux主机安装Docker Engine

    如果你正在使用的是基于Linux系统的物理主机或者云提供商的主机,可以按照官方提供的Linux安装说明来安装最新版本的Docker Engine。

    在Mac或Windows主机安装Docker Engine

    或者,在一台Mac安装Docker或在一台Windows安装Docker。你可以在这台机器上测试单节点和多节点的swarm,不过你需要使用Docker Machine来测试多节点的swarm。

  • 你可以使用Docker for Mac或Docker for Windows测试swarm模式单节点的功能,包括初始化单节点的swarm,创建服务和缩放服务。
  • 目前你不能单独使用Docker for Mac或Docker for Windows测试多节点的swarm。不过你可以使用Docker Machine来创建swarm节点。
  • 管理器机器的IP地址

    必须为管理器主机的可用网卡分配一个IP地址。所有的swarm节点必须能够通过这个IP地址与管理器主机连接。
    由于其它节点通过这个IP地址与管理器节点通信,所以你应该使用固定的IP地址。
    你可以在Linux或macOS在使用ifconfig命令来查看可用的网卡列表。
    如果你用的是Docker Machine,你可以通过docker-machine ls或docker-machine ip 命令来获取管理器主机的IP。例如docker-machine ip manager1.
    本实践使用manager1 IP为192.168.99.100。

    主机间开放的端口

    主机间必须开放如下端口:

  • TCP端口2377 – 用于集群管理通信
  • TCP和UDP端口7946 – 用于各节点之间的通信
  • TCP和UDP端口4789 – 覆盖网络流量
  • 管理swarm(2) – swarm模式关键概念

    本文介绍Docker Engine 1.12的集群管理和编排功能唯一的一些概念。

    Swarm

    使用Swarmkit嵌入Docker Engine中的集群管理和编排功能。Docker Engine参与到集群时是运行在swarm模式下。你可以通过初始化一个swarm或加入一个已存在的swarm来激活Docker Engine进入swarm模式。
    一个swarm是用来部署服务的Docker Engine集群。Docker Engine CLI包括了管理swarm的命令,例如增加和删除节点。CLI也包括你部署服务到swarm和管理服务编排的命令。
    当你在swarm模式外运行Docker Engine,你执行的是容器命令。当你以swarm模式运行Engine,你执行的是编排服务的命令。

    节点

    一个节点是Docker Engine参与到swarm中的一个实例。
    为了部署你的应用到swarm,你需要提交一个服务定义到管理器节点。管理器节点将称为任务的工作单元分派给worker节点。
    管理器节点也完成编排和集群管理功能以维护swarm的期望状态。管理器节点选择单个领导节点来执行编排任务。
    Worker节点接收和执行来自管理器节点分派的任务。默认下管理器节点也是worker节点,不过你可以配置管理器节点为只管理节点。
    agent将其分配的任务的当前状态通知给管理器节点,使得管理器能够维护期望的状态。

    服务和任务

    一个服务是在worker节点执行任务的定义。它是swarm系统的中心结构和用户与swarm交互的主要根源。
    创建服务时,你可以指定要使用的容器映像以及在运行容器中执行的命令。在复制服务模型中,swarm管理器根据你在期望状态中设置的比例在节点之间分发特定数量的副本任务。对于全局服务,swarm在集群中每个可用节点上为该服务运行一个任务。一个任务携带一个Docker容器和在容器内运行的命令。它是swarm的原子调度单位。管理器节点根据服务规模中设置的副本数量将任务分配给worker节点。一旦一个任务分配给一个节点,它就不能移动到其它节点了。它只能在分配的节点上运行。

    负载均衡

    swarm管理器在入口使用负载均衡来连接你的服务。swarm管理器可以自动为服务分配一个PublishedPort或者你为服务配置一个PublishedPort。你可以指定任意可用的端口。如果你不指定,swarm管理器会在30000-32767范围为你的服务分配一个端口。外部组件(如云负载均衡器)可以访问集群中任何节点的PublishedPort上的服务,无论该节点当前是否正在运行任务。Swarm模式有一个内部DNS组件,它自动为每个服务分配一个DNS名称。swarm管理器使用内部负载均衡器,根据服务的DNS名称在集群内的服务之间分配请求。

    管理swarm(1) – swarm模式概述

    要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行为。

    主要功能

  • 集群管理与Docker Engine集成:使用Docker Engine CLI来创建一个你能部署应用服务到Docker Engine的swarm。你不需要其他编排软件来创建或管理swarm。
  • 分散式设计:Docker Engine不是在部署时处理节点角色之间的差异,而是在运行时扮演自己角色。你可以使用Docker Engine部署两种类型的节点,管理器和worker。这意味着你可以从单个磁盘映像构建整个swarm。
  • 声明性服务模型: Docker Engine使用声明性方法来定义应用程序堆栈中各种服务的所需状态。例如,你可以描述由消息队列服务和数据库后端的Web前端服务组成的应用程序。
  • 伸缩性:对于每个服务,你可以声明要运行的任务数。当你向上或向下缩放时,swarm管理器通过添加或删除任务来自动适应,以保持所需状态。
  • 期望的状态协调:swarm管理器节点持续监控群集状态,并调整你描述的期望状态与实际状态之间的任何差异。 例如,如果设置运行一个10个副本容器的服务,这时worker机器托管其中的两个副本崩溃,管理器则将创建两个新副本以替换已崩溃的副本。 swarm管理器将新副本分配给正在运行和可用的worker。
  • 多主机网络:你可以为服务指定覆盖网络(overlay network)。 当swarm管理器初始化或更新应用程序时,它会自动为容器在覆盖网络(overlay network)上分配地址。
  • 服务发现:Swarm管理器节点为swarm中的每个服务分配唯一的DNS名称,并负载平衡运行中的容器。 你可以通过嵌入在swarm中的DNS服务器查询在swarm中运行中的每个容器。
  • 负载平衡:你可以将服务的端口暴露给外部的负载均衡器。 在内部,swarm允许你指定如何在节点之间分发服务容器。
  • 安全通信:swarm中的每个节点强制执行TLS相互验证和加密,以保护其自身与所有其他节点之间的通信。 你可以选择使用自签名根证书或来自自定义根CA的证书。
  • 滚动更新:在上线新功能期间,你可以增量地应用服务更新到节点。 swarm管理器允许你控制将服务部署到不同节点集之间的延迟。 如果出现任何问题,你可以将任务回滚到服务的先前版本。
  • 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事件驱动(3) – BEACONS

    到目前为止我们已经学习如何通过事件总线监控与salt相关的事件,以及激活一些其它的事件。这时候你可能会想“既然我已经设置了一个能监控和实时反馈事件的动态通信设施,那么我肯定可以利用它来监听其它事情,如系统登录,硬盘使用和数据库服务”。而beacons就是用来做这样的事情的。
    beacons让你能够监控与salt无关的事情以及触发事件。beacon系统允许minion与各种系统进程挂钩并持续监控进程。当监控的系统进程活动发生时,minion就发送一个事件到salt事件总线。
    salt beacons目前能对许多系统活动进行监控和发送事件,包括:

  • 文件系统变动
  • 系统负载
  • 服务状态
  • shell活动,如用户登录
  • 网络和硬盘使用情况
  • 激活一个beacon

    salt beacons的激活不需要对监控的系统进程进行任何更改,一切配置都可以使用salt来做。
    在minion的配置文件中增加如下配置:

    1. beacons:
    2.   inotify:
    3.     home/user/importantfile:
    4.       mask:
    5.         – modify

    beacon监控间隔

    beacons默认以1秒的间隔监控。可以增加一个interval参数来设置一个不同的间隔。如下是设置了5和10秒的间隔:

    1. beacons:
    2.   inotify:
    3.     /etc/httpd/conf.d: {}
    4.     /opt: {}
    5.     interval: 5
    6.   load:
    7.     – 1m:
    8.       – 0.0
    9.       – 2.0
    10.     – 5m:
    11.       – 0.0
    12.       – 1.5
    13.     – 15m:
    14.       – 0.1
    15.       – 1.0
    16.     – 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:

    1. vagrant ssh master

    在minion1安装python-pyinotify:

    1. sudo salt ‘minion1’ pkg.install python-pyinotify

    输出类似如下:

    1. vagrant@saltmaster:~$ sudo salt ‘minion1’ pkg.install python-pyinotify
    2. minion1:
    3.     ———-
    4.     python-pyinotify:
    5.         ———-
    6.         new:
    7.             0.9.4-1build1
    8.         old:
    9.     python2.7-pyinotify:
    10.         ———-
    11.         new:
    12.             1
    13.         old:

    我们很快就会生成一个事件,在master启动一个event runner并保持登录:

    1. salt-run state.event pretty=True

    让它在终端中运行并继续。

    设置一个beacon

    打开另一个终端进入salt-vagrant-demo目录,ssh进minion1:

    1. vagrant ssh minion1

    编辑minion1的/etc/salt/minion文件,在底部添加如下内容:

    1. beacons:
    2.   inotify:
    3.     /home/vagrant/importantfile:
    4.       mask:
    5.         – modify

    保存文件重启salt minion服务:

    1. sudo service salt-minion restart

    现在beacon已经激活。下面我们创建将要监控的文件。在/home/vagrant/目录创建importantfile:

    1. touch importantfile
    2. echo "some content" > importantfile

    回到salt master刚才运行event runnner的终端,你应该会看到如下输出:

    1. salt/beacon/minion1/inotify//home/vagrant/importantfile {
    2.     "_stamp": "2016-02-03T22:32:09.592113",
    3.     "data": {
    4.         "change": "IN_MODIFY",
    5.         "id": "minion1",
    6.         "path": "/home/vagrant/importantfile"
    7.     },
    8.     "tag": "salt/beacon/minion1/inotify//home/vagrant/importantfile"
    9. }

    记得event runner必须在文件被更改前启动,否则你不会看到事件。