1. 程式人生 > >[ Python - 13 ] 批量管理主機必備模塊

[ Python - 13 ] 批量管理主機必備模塊

oot 信息 imp group 接收 shc ring mount rgs

批量管理程序必備模塊

  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)

[ Python - 13 ] 批量管理主機必備模塊