在 salt 模块中获取 jid
chenzuoqing Lv3

在 salt 模块中获取任务 jid

在自定义的模块中获取 jid,以实现一些需求(客户端主动的方式,触发最新步骤的结果)

需要自定义 salt 模块,并且接收 kwargs 参数(必须),在kwargs中会有一个 __pub_jid 的参数,是当前运行 job 的 id。

监听事件命令,方便观察,主要看事件输出的 jid 和我们后面模块写入的 jid (__pub_jid)是否一致,对比 minion 日志中我们打的日志。

1
salt-run state.event 'salt/job/*/prog/*/0'

自定义测试模块

console.log
用 state.sls 在 sls 中跑是无效的,kwargs 中会没有 jid

接收 **kwargs 参数,其中包含 __pub_jid 就是 jid 了,注意如果没接收参数就无了。

另外值的注意的是,在自定义模块中如果再调用其他模块(__salt__ 方式),子 job 运行时,事件监听获取不到该调用的 jid,这时候需要在调用时传入 __pub_jid,最好是把 **kwargs 传入,这样会使用当前的 jid。

模块代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# /srv/salt/_modules/console.py
import logging
import requests

logger = logging.getLogger(__name__)

def __virtual__():
""""""
return 'console'

def _get_sls():
"""测试的从接口获取 sls 名称,可以去掉"""
req = requests.get("http://172.16.6.239:5000/api/v1/asset/sls_name/")
logger.info("=====> %s" % req.content)
return req.json()


def log(value=None, **kwargs):
"""console.log"""

sls_name = _get_sls()

# __pub_jid是一个字符串,如果写死,从此处调用的job都将是同一个jid
# 最好传入 **kwargs 里面包含 __pub_jid
__salt__["state.sls"](sls_name, **kwargs)
#__salt__["state.sls"](sls_name, __pub_jid="aaaaaaaaaaaaaa")

ret = {}
ret['sls_name'] = sls_name
ret['msg'] = value
ret['kwargs'] = kwargs
logger.info("++++> ")
logger.info("++++> %s" % ret)
logger.info("++++> ")
return ret

同步模块(修改 _modules 下的文件需要同步)

1
salt '*' saltutil.sync_all

调用的命令,执行 console.log 模块,输出的 kwargs 中含有 jid
(用 state.sls 在 sls 中跑是无效的,kwargs 中没有 jid)

1
salt "*"  console.log "hello world"

无效的方式

(在 sls 中无法获取到)

测试用 state.sls 方式运行下面的状态文件 salt "*" state.sls console,会看到 console.log 模块中是没有 jid 数据的,这点差异需要注意

1
2
3
4
5
6
7
8
9
10
11
# /srv/states/console.sls 
test echo test:
cmd.run:
- name: echo "111"
- cwd: /tmp
- stateful: False

console.log:
module.run:
- console.log:
- value: "console.log.message"

pillar schedule

如果在 pillar 的 http_json 中有 schedule,也必须直接跑模块才生效,如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# http://xxxx.com/xxx/${minion_id}/
{
"schedule": {
# 如下为刷新pillar,自动请求本接口
"job_refresh": {
"function": "saltutil.refresh_pillar",
"seconds": 60,
},
"an00_test_job": {
"function": "console.log",
"args": [],
"kwargs": {
"value": "xxxx",
},
"seconds": 20,
"once": None
# "once": "2022-01-07T11:35:00"
}
}
}
 Comments