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
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
| 操作内容:
一、基础环境
1、使用tvm-saltmaster操作
2、网络:
eth0:host-only(用于虚拟内网,手动固定IP,这样从宿主机可以直接连接到这个vm)
eth1:NAT(用于上外网,动态IP)
[iyunv@tvm-zabbix ~]# cd /etc/sysconfig/network-scripts/
[iyunv@tvm-zabbix network-scripts]# cat ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
IPADDR=192.168.56.253
PREFIX=24
GATEWAY=192.168.56.1
DNS1=192.168.56.254
[iyunv@tvm-zabbix network-scripts]# cat ifcfg-eth1
DEVICE=eth1
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=dhcp
DNS1=192.168.56.254
二、配置
1、文件结构
[iyunv@tvm-saltmaster base]# tree ops/
ops/
└── bin.sls
0 directories, 1 file
[iyunv@tvm-saltmaster base]# tree conf.d/ops/
conf.d/ops/
└── bin
├── pw
├── randchars.py
└── sendEmail
1 directory, 3 files
2、sls配置
[iyunv@tvm-saltmaster base]# cat ops/bin.sls
## 此处列出需要的软件包
#
python-pip:
pkg.installed:
- name: python-pip
- require_in:
-file: pip-pkgs
pip-pkgs:
pip.installed:
- names:
- virtualenvwrapper
- pwgen
/usr/bin/sendEmail:
file.managed:
- source: salt://conf.d/ops/bin/sendEmail
- mode: 755
/usr/bin/pw:
file.managed:
- source: salt://conf.d/ops/bin/pw
- mode: 755
/usr/bin/randchars:
file.managed:
- source: salt://conf.d/ops/bin/randchars.py
- mode: 755
三、执行
[iyunv@tvm-saltmaster base]# salt 'tvm-*' state.sls ops.bin test=True
[iyunv@tvm-saltmaster base]# salt 'tvm-*' state.sls ops.bin
增加到top.sls中
[iyunv@tvm-saltmaster base]# cat top.sls
base:
'tvm-yum':
- dnsmasq
- crontab
- web
'tvm-zabbix':
- mysql.server
- zabbix.server
- zabbix.web
'*':
- abc
- monit
- postfix
- salt.minion
- ssh
- vim
- zabbix.agent
- ops.bin
四、总结
此处使用到:
pip.installed
使用时,需确保安装了python-pip这个包,否则会提示异常。
且pip安装包时,对应的主机可以连接到外网,如果没联网,有如下报错:
----------
ID: pip-pkgs
Function: pip.installed
Name: virtualenvwrapper
Result: False
Comment: Failed to install packages: virtualenvwrapper. Error: Collecting virtualenvwrapper Retrying (Retry(total=4, connect=None, read=None, redirect=None)) after connection broken by 'ProtocolError('Connection aborted.', error(101, 'Network is unreachable'))': /simple/virtualenvwrapper/
Retrying (Retry(total=3, connect=None, read=None, redirect=None)) after connection broken by 'ProtocolError('Connection aborted.', error(101, 'Network is unreachable'))': /simple/virtualenvwrapper/
Retrying (Retry(total=2, connect=None, read=None, redirect=None)) after connection broken by 'ProtocolError('Connection aborted.', error(101, 'Network is unreachable'))': /simple/virtualenvwrapper/
Retrying (Retry(total=1, connect=None, read=None, redirect=None)) after connection broken by 'ProtocolError('Connection aborted.', error(101, 'Network is unreachable'))': /simple/virtualenvwrapper/
Retrying (Retry(total=0, connect=None, read=None, redirect=None)) after connection broken by 'ProtocolError('Connection aborted.', error(101, 'Network is unreachable'))': /simple/virtualenvwrapper/
Retrying (Retry(total=4, connect=None, read=None, redirect=None)) after connection broken by 'ProtocolError('Connection aborted.', error(101, 'Network is unreachable'))': /simple/virtualenvwrapper/
Retrying (Retry(total=3, connect=None, read=None, redirect=None)) after connection broken by 'ProtocolError('Connection aborted.', error(101, 'Network is unreachable'))': /simple/virtualenvwrapper/
Retrying (Retry(total=2, connect=None, read=None, redirect=None)) after connection broken by 'ProtocolError('Connection aborted.', error(101, 'Network is unreachable'))': /simple/virtualenvwrapper/
Retrying (Retry(total=1, connect=None, read=None, redirect=None)) after connection broken by 'ProtocolError('Connection aborted.', error(101, 'Network is unreachable'))': /simple/virtualenvwrapper/
Retrying (Retry(total=0, connect=None, read=None, redirect=None)) after connection broken by 'ProtocolError('Connection aborted.', error(101, 'Network is unreachable'))': /simple/virtualenvwrapper/
Could not find a version that satisfies the requirement virtualenvwrapper (from versions: )
No matching distribution found for virtualenvwrapper
Started: 16:30:04.360978
Duration: 15536.139 ms
Changes:
----------
五、附上几个小工具的用法
1、乱序输出字符 pw
其他人写的一个小脚本,调用的是pip安装的pwgen这个工具
[iyunv@tvm-test ~]# cat /usr/bin/pw
#!/usr/bin/python
#
# 2015/8/14
import os
import sys
def gen_pw():
# yum -y install python-pip
# pip install pwgen
p = os.popen('/usr/bin/pwgen -1 -B -n 10')
p = p.read().strip('\n')
p = p[:5].upper() + p[5:].lower()
return p
def print_msg():
p1 = gen_pw()
p2 = gen_pw()
#msg = 'root:{0} root1:{1}'.format(p1,p2)
msg = '{0} {1}'.format(p1,p2)
print msg
if __name__ == '__main__':
print_msg()
2、乱序输出字符 randchar
自己写的一个小脚本,生成一些简单的字符
[iyunv@tvm-test ~]# cat /usr/bin/randchars
#!/bin/env python
#
# 2015/08/10
import random
class RandChars(object):
'''
RandChars(24).generate()
'''
# char pools
pools = '23456789'
pools += 'abcdefghijkmnpqrstuvwxyz'
pools += 'ABCDEFGHIJKMNPQRSTUVWXYZ'
pools += '~!@#$%^&*()_+'
# pool size
pool_size = len(pools)
def __init__(self, length=12):
self.length = length
# get a char from pool
def fetch_one(self):
rnd_index = random.randint(0, self.pool_size-1)
return self.pools[rnd_index]
# map the password by index
def generate(self):
rnd_chars = ''
i = 0
while i < self.length:
rnd_chars += self.fetch_one()
i += 1
return rnd_chars
if __name__ == '__main__':
try:
while True:
print('[-] [press `Ctrl+C` to cancel], default=24: ')
length = raw_input('Length to generate: ')
# python3
#length = input('Length: ')
if not length:
length = '24'
if length.isdigit():
print('\n\n{0}\n\n'.format(RandChars(int(length)).generate()))
else:
print('\n[WARNING] hi, length is digit.\n')
except KeyboardInterrupt:
print('\n\n[NOTICE] You cancelled the operation.\n')
except Exception as err:
print('\n[ERROR]: {0}\n'.format(err))
3、sendEmail
其他人写的脚本
[iyunv@tvm-test ~]# sendEmail -s smtp.company.com \
-xu mail_username@company.com \
-xp mail_password \
-f mail_from@company.com \
-t mail_to@client.com \
-u 'msg title' \
-m 'msg body' \
-a /tmp/attachment.txt
Aug 14 17:00:10 tvm-test sendEmail[6319]: Email was sent successfully!
ZYXW、参考
1、官网doc
http://docs.saltstack.com/en/lat ... le-salt.modules.pip
|