pennate 发表于 2018-8-1 07:20:07

saltstack的深入-管理python-pip

操作内容:  
一、基础环境
  
1、使用tvm-saltmaster操作
  
2、网络:
  
eth0:host-only(用于虚拟内网,手动固定IP,这样从宿主机可以直接连接到这个vm)
  
eth1:NAT(用于上外网,动态IP)
  
# cd /etc/sysconfig/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
  

  
# cat ifcfg-eth1
  
DEVICE=eth1
  
TYPE=Ethernet
  
ONBOOT=yes
  
NM_CONTROLLED=yes
  
BOOTPROTO=dhcp
  
DNS1=192.168.56.254
  

  

  
二、配置
  
1、文件结构
  
# tree ops/
  
ops/
  
└── bin.sls
  

  
0 directories, 1 file
  
# tree conf.d/ops/
  
conf.d/ops/
  
└── bin
  
    ├── pw
  
    ├── randchars.py
  
    └── sendEmail
  

  
1 directory, 3 files
  

  
2、sls配置
  
# 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
  

  

  
三、执行
  
# salt 'tvm-*' state.sls ops.bin test=True
  
# salt 'tvm-*' state.sls ops.bin
  

  
增加到top.sls中
  
# 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这个工具
  
# 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.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
  
自己写的一个小脚本,生成一些简单的字符
  
# 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
  

  
    # 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('[-] , 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 hi, length is digit.\n')
  
    except KeyboardInterrupt:
  
      print('\n\n You cancelled the operation.\n')
  
    except Exception as err:
  
      print('\n: {0}\n'.format(err))
  

  

  
3、sendEmail
  
其他人写的脚本
  
# 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: Email was sent successfully!
  

  

  
ZYXW、参考
  
1、官网doc
  
http://docs.saltstack.com/en/latest/ref/modules/all/salt.modules.pip.html#module-salt.modules.pip
页: [1]
查看完整版本: saltstack的深入-管理python-pip