OK,上一篇总结了execution modules的用法。这一篇准备总结一下state modules该怎么写。
顺便把上一篇execution modules遗留下来的那个装饰器给写一下。
看一下写的这个模块 root@salt-master:~# cat /srv/salt/_modules/liss.py import salt.utils.decorators as decorators import os @decorators.depends(‘os‘) def cheng(): return "chengge" 同步一下 root@salt-master:~# salt ‘*‘ saltutil.sync_modules salt-minion: - modules.liss 看一下执行结果 root@salt-master:~# salt ‘*‘ liss.cheng salt-minion: chengge 然后修改一下liss.py这个模块,把import os这一行给注释掉 root@salt-master:~# cat /srv/salt/_modules/liss.py import salt.utils.decorators as decorators #import os @decorators.depends(‘os‘) def cheng(): return "chengge" 同步一下 root@salt-master:~# salt ‘*‘ saltutil.sync_modules salt-minion: - modules.liss 看一下执行结果 root@salt-master:~# salt ‘*‘ liss.cheng salt-minion: ‘liss.cheng‘ is not available.
看到了吧,其实depends这个函数,当我们传进去的参数"os",os这个模块加载的到的时候,我们定义的
函数cheng()可以正常工作。
但是当我们把import os 注释掉,depends检测加载不到os这个模块了。就会把我们定义的函数cheng()给删除掉,所以我们可以看到执行的结果为不可用。
depends还有另外一种用法:
先看一下,写的模块 root@salt-master:~# cat /srv/salt/_modules/liss.py import salt.utils.decorators as decorators import os def _fallback(): return "lisisi" @decorators.depends(‘os‘,fallback_function = _fallback) def cheng(): return "chengge" 同步一下 root@salt-master:~# salt ‘*‘ saltutil.sync_modules salt-minion: - modules.liss 执行看一下结果 root@salt-master:~# salt ‘*‘ liss.cheng salt-minion: chengge 修改一下模块,把import os注释掉 root@salt-master:~# cat /srv/salt/_modules/liss.py import salt.utils.decorators as decorators #import os def _fallback(): return "lisisi" @decorators.depends(‘os‘,fallback_function = _fallback) def cheng(): return "chengge" 同步一下 root@salt-master:~# salt ‘*‘ saltutil.sync_modules salt-minion: - modules.liss 执行一下 root@salt-master:~# salt ‘*‘ liss.cheng salt-minion: lisisi
这是depends的另外一种用法,咋用的呢?也就是说,当os这个模块加载正常的时候,则调用depends装饰的cheng()这个函数,否则则调用fallback_function = 的这个函数
OK,depends就写到这里了。
装饰器还有一个which和memoize,都比较简单就不写了。
下面总结一下state modules该怎么写?
看看楼主,定义的state module root@salt-master:~# cat -n /srv/salt/_states/cheng.py 1 def __virtual__(): 2 if ‘foo.foo‘ in __salt__: 3 return True 4 else: 5 return False 6 7 def cheng(name,user): 8 9 ret = {‘name‘: name, ‘changes‘: {},‘result‘: True,‘comment‘: ‘‘} 10 11 if __opts__[‘test‘]: 12 ret[‘result‘] = None 13 ret[‘comment‘] = ‘liss‘ 14 return ret 15 16 ret[‘changes‘] = {name:__grains__[‘liss‘]} 17 ret[‘comment‘] = ‘%s‘ % __pillar__[‘group‘] 18 return ret root@salt-master:~#
简单解释一下,1-5行,定义__virtual__,判断foo.foo是否在__salt__之中,在的话继续,不在的话,下面定义的cheng()函数就无效了。
9行,定义返回值的格式。
11-14行,测试返回值能否正确的返回,一般我们在return值之前,都要这么测试一下,如果
if __opts__[‘test‘] == False,就无法正确返回了。
好,看一下state是怎么定义的 root@salt-master:~# cat /srv/salt/foo.sls lisisi: cheng: - cheng - name: chengge - user: lixc 同步一下states root@salt-master:~# salt ‘*‘ saltutil.sync_states salt-minion: - states.cheng 执行一下,看一下啊结果 root@salt-master:~# salt ‘*‘ state.sls foo salt-minion: ---------- ID: lisisi Function: cheng.cheng Name: chengge Result: True Comment: lixc Changes: ---------- chengge: lisisi Summary ------------ Succeeded: 1 Failed: 0 ------------ Total: 1 root@salt-master:~#
OK,官网上还介绍,states里面的watcher函数,mod_init函数,不过应用范围不是很多。
楼主就不研究了。
本文出自 “西风” 博客,请务必保留此出处http://lixcto.blog.51cto.com/4834175/1429943
saltstack(七)modules(二),布布扣,bubuko.com
原文:http://lixcto.blog.51cto.com/4834175/1429943