[ Python - 13 ] 批量管理主机必备模块

批量管理程序必备模块

  1. optparse
  2. configparser
  3. paramiko

optparse模块

简介:
        optparse模块主要用来为脚本传递命令参数功能

使用步骤:

        1. import optparse
        2. parser = optparse.OptionParser()
        3. parser.add_option()
        4. options, args = parser.parse_args(command) # command 为 list 类型

方法add_option()中参数:
        action: 验证输入数据类型是否和type匹配,并将符合要求的这个参数存储到dest变量中
        store 默认值
            store_true
            store_false
                标记而已,辅助流程控制。
        
        type: 指定是对应于参数类型,如-f,-n 接下来参数的数据类型,可以为int, string, float等
        dest: 用于保存临时变量,其值可以作为options的属性进行访问,很方便。
        help: 提供帮助解释
        default: 为dest设置默认值

#!_*_coding:utf-8_*_
# Author: hkey
import optparse
parser = optparse.OptionParser()
cmd = [‘--cmd‘, ‘du -sh‘, ‘/‘] # 命令必须通过split方法转换为list类型
parser.add_option(‘--cmd‘, action=‘store‘, type=‘string‘, dest=‘command‘, help=‘command‘)
options, args = parser.parse_args(cmd)
print(‘options:‘, options)
print(‘args:‘, args)
print(‘command:‘, options.command)        

输出信息:
options: {‘command‘: ‘du -sh‘}
args: [‘/‘]
command: du -sh

使用default默认值:

import optparse
parser = optparse.OptionParser()
cmd = [‘--cmd‘, ‘du -sh‘, ‘/‘]
parser.add_option(‘--cmd‘, action=‘store‘, type=‘string‘, dest=‘command‘, default=‘abc‘, help=‘command‘) # 为dest添加默认值
options, args = parser.parse_args()  # 没有传入cmd参数
print(‘options:‘, options)
print(‘args:‘, args)
print(‘command:‘, options.command)

输出信息:
options: {‘command‘: ‘abc‘}
args: []
command: abc

configparser模块

简介:
        读写ini格式的配置文件

使用步骤:

        1. import configparser
        2. config = configparser.ConfigParser()
        3. config.read(‘配置文件‘)
        4. config (get or set)

hosts.cfg

#hosts.cfg

[host1]
ip = 192.168.118.10
port = 22
username = user
password = 123456

[host2]
ip = 192.168.118.11
port = 22
username = root
password = 123456

[group]
server = host1,host2

[host3]
ip = 192.168.118.12
#!_*_coding:utf-8_*_
# Author: hkey
import configparser
config = configparser.ConfigParser()

# 读取配置文件
config.read(‘hosts.cfg‘)
sections = config.sections() # 获取配置文件所有的sections
options = config.options(‘host1‘)   # 获取host1下所有的key值
values = config[‘host1‘][‘username‘] # 通过sections和key获取values
print(sections)
print(options)
print(values)
# 写入配置文件
config.set("host1", "username", "user") # 将sections为‘host1‘且key为‘username‘的值修改为user
config.add_section(‘host3‘)     # 新增一个sections
config.set(‘host3‘, ‘ip‘,‘192.168.118.12‘) # 在sections为host3下面增加key为host3,值为‘192.168.118.12‘
config.write(open(‘hosts.cfg‘, ‘w‘))    # 写回配置文件

paramiko模块

简介:
        提供了ssh及sftp进行远程登录服务器执行命令和上传下载文件的功能,这是第三方包,使用前需要安装.
        安装 pip install paramiko

远程ssh使用步骤:

        1. import paramiko
        2. ssh = paramiko.SSHClient()
        3. ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())  # 允许将信任的主机自动加入到host_allow列表,此方法必须放在connect方法的前面
        4. ssh.connect(hostname=‘ip‘, port=22, username=‘root‘, password=‘123456‘) # 连接远程主机
        5. stdin, stdout, stderr = ssh.exec_command(‘df -Th‘)    # 在远程主机执行命令
        6. res, err = stdout.read(), stderr.read()    # 执行成功,stdout接收,错误, stderr接收
        7. result = res if res else err     # 三元运算判断
#!_*_coding:utf-8_*_
# Author: hkey
import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname=‘192.168.118.10‘, port=22, username=‘root‘, password=‘123456‘)
stdin, stdout, stderr = ssh.exec_command(‘df -Th‘)
res, err = stdout.read(), stderr.read()
result = res if res else err
print(result.decode())    # 输出信息是二进制格式需要转换

输出结果:
Filesystem               Type      Size  Used Avail Use% Mounted on
/dev/mapper/vg00-lv_root xfs        92G  2.6G   89G   3% /
devtmpfs                 devtmpfs  3.9G     0  3.9G   0% /dev
tmpfs                    tmpfs     3.9G     0  3.9G   0% /dev/shm
tmpfs                    tmpfs     3.9G   17M  3.9G   1% /run
tmpfs                    tmpfs     3.9G     0  3.9G   0% /sys/fs/cgroup
/dev/vda1                xfs       497M  125M  373M  25% /boot
tmpfs                    tmpfs     783M     0  783M   0% /run/user/0

sftp上传下载使用步骤:

        1. import paramiko
        2. transport = paramiko.Transport((‘ip‘, 22))
        3. transport.connect(username=‘root‘, password=‘123456‘)
        4. sftp = paramiko.SFTPClient.from_transport(transport)
        5. sftp.put(‘abc.txt‘, ‘/tmp/abc.txt‘)     # 将本地abc.txt 上传至 /tmp/abc.txt 这里要注意必须要写文件名,不然会报错。
        6. transport.close()
#!_*_coding:utf-8_*_
# Author: hkey
import paramiko
transport = paramiko.Transport((‘192.168.118.10‘, 22))
transport.connect(username=‘root‘, password=‘123456‘)
sftp = paramiko.SFTPClient.from_transport(transport)
sftp.put(‘abc.txt‘, ‘/tmp/abc.txt‘)
transport.close()

最后一个完整的例子,使用到上面三个模块实现一个批量执行命令的脚本:

#!_*_coding:utf-8_*_
# Author: hkey

import optparse, configparser, paramiko
cmd = [‘batch_run‘, ‘-H‘, ‘h1,h2‘, ‘-g‘, ‘server,g1‘, ‘--cmd‘, ‘df -Th /‘]
parser = optparse.OptionParser()
parser.add_option(‘-H‘, dest=‘host‘, help=‘host‘)
parser.add_option(‘-g‘, dest=‘group‘, help=‘group‘)
parser.add_option(‘--cmd‘, dest=‘cmd‘, help=‘cmd‘)

options, args = parser.parse_args(cmd)

if args or args[0] == ‘batch_run‘:
    if options.host is not None or options.group is not None or options.cmd is not None:
        host = options.host.split(‘,‘)
        # print(host)
        group = options.group.split(‘,‘)
        # print(group)
        config = configparser.ConfigParser()
        config.read(‘hosts.cfg‘)
        for i in group:
            if i not in config[‘group‘]:
                print(‘未找到[%s]‘ %i)
                group.remove(i)
        host_list = []
        host_list1 = []
        for i in group:
            s = config[‘group‘][i]
            s = s.split(‘,‘)
        host_list = host + s
        sections = config.sections()
        del sections[-1]
        for i in host_list:
            if i in sections:
                host_list1.append(i)
            else:
                print(‘找不到主机[%s]‘ %i)
                continue
        host_dict = {}
        for i in host_list1:
            host_dict[i] = {
                ‘ip‘: config[i][‘ip‘],
                ‘port‘: config[i][‘port‘],
                ‘username‘: config[i][‘username‘],
                ‘password‘: config[i][‘password‘],
            }

        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        for i in host_dict:

            ssh.connect(hostname=host_dict[i][‘ip‘], port=int(host_dict[i][‘port‘]),
                        username=host_dict[i][‘username‘], password=host_dict[i][‘password‘])
            stdin, stdout, stderr = ssh.exec_command(options.cmd)
            res, err = stdout.read(), stderr.read()
            result = res if res else err
            print(‘[%s]‘.center(50, ‘-‘) % host_dict[i][‘ip‘])
            print(result.decode())
    else:
        print(‘找不到命令:[%s]‘ % args)
时间: 2024-10-16 23:26:03

[ Python - 13 ] 批量管理主机必备模块的相关文章

python 学习笔记 13 -- 常用的时间模块之time

Python 没有包含对应日期和时间的内置类型,不过提供了3个相应的模块,可以采用多种表示管理日期和时间值: *    time 模块由底层C库提供与时间相关的函数.它包含一些函数用于获取时钟时间和处理器的运行时间,还提供了基本解析和字符串格式化工具 *    datetime 模块为日期.时间以及日期时间值提供一个更高层接口.datetime 中的类支持算术.比较和时区配置. *    calendar 模块可以创建周.月和年的格式化表示.它还可以用来计算重复事件.给定日期是星期几,以及其他基

python小白-day6 time&datetime模块

time&datetime ?一.time模块 time模块提供各种操作时间的函数 说明:一般有两种表示时间的方式:       第一种是时间戳的方式(相对于1970.1.1 00:00:00以秒计算的偏移量),时间戳是惟一的       第二种以数组的形式表示即(struct_time),共有九个元素,分别表示,同一个时间戳的struct_time会因为时区不同而不同 1 2 3 4 5 6 7 8 9 10 11 12 import time print('clock():',time.cl

python基础-常用内建模块

一.collections:内建集合模块. 1.namedtuple:创建一个自定义的tuple对象 2.deque:为了高效实现插入和删除操作的双向列表,适合用于队列和栈 3.defaultdict:Key不存在时返回默认值 4.OrderedDict:保持Key的顺序 5.Counter:一个简单的计数器 二.base64 : 一种用64个字符来表示任意二进制数据的方法 三.struct : str和其他二进制数据类型的转换 四.hashlib : 提供常见的摘要算法,如MD5,SHA1 五

第六章:Python基础の反射与常用模块解密

本課主題 反射 Mapping 介绍和操作实战 模块介绍和操作实战 random 模块 time 和 datetime 模块 logging 模块 sys 模块 os 模块 hashlib 模块 re 模块 本周作业 反射 Mapping 介绍和操作实战 反射是利用字符串的形式去对象 (模块) 中操作 (寻找/检查) 成员 案例例子 假设创建了一个common.py 程序里而有3个功能,比如网站里的登录页面.主页页面还有登出页面都是不同的页面,要显示的内容都不一样. def login(): p

python下的web服务器模块

python下的web服务模块有三种: BaseHTTPServer: 提供基本的Web服务和处理器类,分别是HTTPServer和BaseHTTPRequestHandler SimpleHTTPServer: 包含执行GET和HEAD请求的SimpleHTTPRequestHandler类 CGIHTTPServer: 包含处理POST请求和执行CGIHTTPRequestHandler类. 下面是CGIHTTPServer类示例: 1 [email protected]:~/cp# tre

Python操作数据库及hashlib模块

一.hashlib模块 hashlib模块,主要用于加密相关的操作,在python3的版本里,代替了md5和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法 import hashlib #导入模块 ######## md5 ########### m = hashlib.md5() #创建一个对象 m.update(b"hhf") #加密字符串 b代表byte,是把字符串转换成byte类型,也可以用bytes()强制转换

Python 学习笔记(6)--常用模块(2)

一.下载安装 下载安装有两种方式: yum\pip\apt-get 或者源码 下载源码 解压源码 进入目录 编译源码 python setup.py build 安装源码 python setup.py install 注:在使用源码安装时,需要使用到gcc编译和python开发环境,所以,需要先执行: yum install gcc python-devel 安装成功后,模块会自动安装到 sys.path 中的某个目录中,如: /usr/lib/python2.7/site-packages/

Python学习之路12?模块与包

一 模块 1.1 什么是模块? 一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 1.2 为何要使用模块? 如果你退出python解释器然后重新进入,那么你之前定义的函数或者变量都将丢失,因此我们通常将程序写到文件中以便永久保存下来,需要时就通过python test.py方式去执行,此时test.py被称为脚本script. 随着程序的发展,功能越来越多,为了方便管理,我们通常将程序分成一个个的文件,这样做程序的结构更清晰,方便管理.这时我们不仅仅可以把

python学习笔记day5——常用模块学习

一.主要内容 模块介绍 time &datetime模块 random os sys shutil json & picle shelve xml处理 yaml处理 configparser hashlib subprocess logging模块 re正则表达式 二.具体内容 1.模块 a.定义:本质就是.py结尾的python文件,逻辑上组织python代码,实现某种功能.例:文件名test.py-->模块名test. b.导入方法:imort moduname from mdn