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函数,不过应用范围不是很多。
楼主就不研究了。
转载于:https://blog.51cto.com/lixcto/1429943