saltstack的深入-管理python-pip
操作内容: 一、基础环境 1、使用tvm-saltmaster操作 2、网络: eth0:host-only(用于虚拟内网,手动固定IP,这样从宿主机可以直接连接到这个vm) eth1:NAT(用于上外网,动态IP) [root@tvm-zabbix ~]# cd /etc/sysconfig/network-scripts/ [root@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 [root@tvm-zabbix network-scripts]# cat ifcfg-eth1 DEVICE=eth1 TYPE=Ethernet ONBOOT=yes NM_CONTROLLED=yes BOOTPROTO=dhcp DNS1=192.168.56.254 二、配置 1、文件结构 [root@tvm-saltmaster base]# tree ops/ ops/ └── bin.sls 0 directories, 1 file [root@tvm-saltmaster base]# tree conf.d/ops/ conf.d/ops/ └── bin ├── pw ├── randchars.py └── sendEmail 1 directory, 3 files 2、sls配置 [root@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 三、执行 [root@tvm-saltmaster base]# salt 'tvm-*' state.sls ops.bin test=True [root@tvm-saltmaster base]# salt 'tvm-*' state.sls ops.bin 增加到top.sls中 [root@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这个工具 [root@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 自己写的一个小脚本,生成一些简单的字符 [root@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 其他人写的脚本 [root@tvm-test ~]# sendEmail -s smtp.company.com \ -xu [email protected] \ -xp mail_password \ -f [email protected] \ -t [email protected] \ -u 'msg title' \ -m 'msg body' \ -a /tmp/p_w_upload.txt Aug 14 17:00:10 tvm-test sendEmail[6319]: Email was sent successfully! ZYXW、参考 1、官网doc http://docs.saltstack.com/en/latest/ref/modules/all/salt.modules.pip.html#module-salt.modules.pip