[ Python - 13 ] 批量管理主機必備模塊
阿新 • • 發佈:2017-08-02
oot 信息 imp group 接收 shc ring mount rgs
批量管理程序必備模塊
- optparse
- configparser
- 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)
[ Python - 13 ] 批量管理主機必備模塊