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函数,不过应用范围不是很多。

楼主就不研究了。