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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
来源 SALTSTACK技术入门与实战
 
1.扩展grains
通过Python脚本定义grains
http://www.xiaomastack.com/2014/10/31/saltstack-grains/
file_roots:
  base:
    - /srv/salt/
/srv/salt/_grains/example.py
#!/usr/bin/python
def grains():
    local={}
    test={'key''vaule','key1''vaule1','key2''vaule2'}
    local['list']= [1,2,3,4]
    local['string'= 'str'
    local['dict'= test
    return local
salt 'Minion' saltutil.sync_grains
 
 
2.扩展Module
当前Python版本的site-packages/salt/modules/
脚本里面的一个函数就是Module的一个方法
def A(host, nameserver=None)
dig = ['dig''+short'str(host), 'A']
dig.append('@{0}'.format(nameserver))
__salt__['cmd.run_all']
 
__virtualname__是定义module名称
__virtual__函数的作用主要是在Module的时候需要判断dig命令是否存在
 
 
puppet.py
def setmaster
def service(signal=None):
def master(config_file='/etc/puppet/puppet.conf'):
setmaster函数主要指定puppetserver地址
version函数是查看minion上puppet的版本
service函数是去管理puppet的服务状态
master函数是查看目前puppet配置文件里面定义的server地址
使用salt 'Minion' puppet.version
 
意思就是说在site-packages/salt/modules里面写一个py,然后写很多函数,最后salt就可以像这样puppet.version调用了。
 
下面这个表明只是在客户端执行,这就是模块的作用。
 
代码 
saltstack之远程触发文件备份、回滚
mkdir /srv/salt/_modules   默认没有此文件,自己生成一个
 
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys,string,shutil
import os,tarfile
import datetime,time
 
tn=datetime.datetime.today()
time_now=tn.strftime("%Y-%m-%d")
data_bak='/data/databak'
data_tmp='/data/databak/tmp/%s' % time_now
com_f="%s/%s" % (data_bak,time_now)
if not os.path.exists(com_f):
     os.makedirs(com_f)
 
def CpFile():
     id = sys.argv[1]
     dir = sys.argv[2]            #传入两个变量,任务自动生成的id与要替换的文件
     filename = '%s/%s.tar' % (com_f, id)
     mode = 'w:tar'
     os.chdir(data_bak)                                                                                                                                                
     w_file=open("/tmp/tmp.list",'w')      
     w_file.write(id+" "+dir)              #记录每次备份的id与相对应的备份目录或文件的路径
     w_file.close()
     file = tarfile.open( filename, mode )
     file.add( '/tmp/tmp.list' )
     file.add( dir )    
     file.close()
     return 'ok'       #测试过程,就先让返回ok吧,之后再做判断
 
                                                                                           
def RollBack():
     id = sys.argv[1]        #想要回滚到的版本id
     if not os.path.exists(data_tmp):
          os.makedirs(data_tmp)
     filename = '%s/%s.tar' % (com_f, id)
     tar = tarfile.open("%s" % filename)
     for in tar:
          tar.extract(b,path="%s" % data_tmp)
     tar.close()
     for line in open('%s/tmp/tmp.list' % data_tmp):
          id = line.split(" ")[:1][0]
          dir = line.split(" ")[1:][0]       #读取备份时的路径
          backup_dir='%s/%s' % (data_tmp,dir)
          os.system('\cp -rp %s %s' % (backup_dir,dir))
          return 'ok'
 
 
 
3.扩展state
 
state 说白就是调用已经存在的各种modules,具体salt官网很多。
 
默认SaltStack的state脚本都是在当前Python版本的site-packages/salt/states/
SaltStack没有一个比较合适的state的话,我们还可以通过Python语言去定义一个state
 
3.1 __salt__['rabbitmq.user_exists']
def absent(name,runas=None):
result = __salt__['rabbitmq.delete_user']()
 
最终return ret,返回一个字典
 
3.2 cat /srv/salt/_states/ansible.py
def files(name='/etc/ansible/ansible.cfg',inventory=None,forks=None,module_lang=None,
host_key_checking=None,timeout=None)
file=__salt__['file.file_exists'](name)
__opts__['test']:
接下来我们编写一个简单的state来验证一下:
SaltStack@Master: cat /srv/salt/ansible.sls
'/etc/ansible/ansible.cfg':
  ansible.files:  #这里的files就是py脚本定义的files函数
    - inventory: /etc/host
    - timeout: 88
    - forks: 8
 
使用saltutil.sync_states命令同步即可。脚本会同步到
Minion定义的cachedir目录下的extmods/states下。
运行一次 salt 'Minion' state.sls ansible
 
我们编写state其实大量的工作就是把想要完成的需求,通过state YAML形式定义
出来。然后我们编写的state脚本去真正去完成我们想要的结果
 
4.ext_pillar与ext_nodes
 
4.1.1 ext_pillar 写过  245
官网一个Hiera例子
data = yaml.safe_load(__salt__['cmd.run']()
 
4.1.2 自己编写一个ext_pillar接口
extension_modules: /srv/salt/modules/
ext_pillar:
- salt: []
这里ext_pillar接口的脚本就叫做salt.py,脚本的路径是在/srv/salt/modules/pillar/目录下
 
脚本返回字典就行。
 
 
4.2 理解ext_nodes流程和案例  238
平常使用SaltStack的state的时候 top.sls入口文件
top.sls作用是指定Minion与state.sls文件的对应关系
目的top.sls能做到动态
 
四种形式:
1)通过从MongoDB里面获取Minion与state.sls文件的对应关系:
2)通过ext_nodes的形式:
3)通过reclass_adapter的形式:
4)通过从cobbler直接获取的形式:
 
ext_nodes支持通过脚本的形式
脚本返回的字典
base:
'Minion':
- cpis
stage:
'Minion01':
- sshd
 
master_tops:
ext_nodes: /srv/salt/saltbook.py
 
最后我们来运行state.highstate查看运行结果
 
4.3 SaltStack git文件服务器  这块可以看做state的扩展
 
SaltStack除了支持默认roots fileserver以外,还支持git fileserver
salt '*' pillar.get master:environment(这点是至关重要的)
 
修改master配置文件
fileserver_backend:
- git
gitfs_remotes:
- https://github.com/shencan/saltstates.git
gitfs_root: states
 
使用salt-run fileserver.update命令更新state文件


本文转自 liqius 51CTO博客,原文链接:http://blog.51cto.com/szgb17/1961469,如需转载请自行联系原作者