ユーティリティ次元スクリプト

5141 ワード

最近、いくつかのクラスタのメンテナンス作業を行い、いくつかの実用的なスクリプトを開発してクラスタの管理に協力するつもりです.
1、マルチマシン操作とファイルコピーを実現する
sshpassモジュールに基づくリモート操作と一括コピーを実現し、前駆体に依存してスクリプトを実行するマシンにsshpassコマンドをオフラインまたはオンラインでインストールする(Python 2と使用したモジュールはcentosシステムにデフォルトで統合されているようで、「yum install-y sshpass」を使用していない場合).また、クラスタのすべてのノードのパスワードを統一する必要があります.統一しないと、指定した異なるユーザーアカウントとパスワードを少し変更して統一制御を実現できます.
sshUtil.pyの内容は次のとおりです.
#! /usr/bin/python
# -*- coding:UTF-8 -*-
import os
import sys
import commands
import datetime
import re
import argparse
class Run(object):
        def __init__(self,user,host,password):
                self.__host=host
                self.__password=password
                self.__user=user
        def sshdo(self, cmd):
                cmd = "sshpass -p'%s' ssh -o 'StrictHostKeyChecking=no' %s@%s '%s'" %(self.__password,self.__user,self.__host, cmd)
                if os.system(cmd)!=0:
                        print("[err]: "+cmd)
        def sshcopy(self, srcfile, destfile):
                cmd = "sshpass -p'%s' scp -r %s %s@%s:%s" % (self.__password, srcfile, self.__user, self.__host, destfile)
                (status, output) = commands.getstatusoutput(cmd)
                print("[status]"+str(status))
                return status
def runHosts(args):
        showArgs(args)
        user = "root"
        password = "root"
        for line in open(args.f):
                line=line.replace("
", "").replace("\r", "").strip() if not line.startswith("192"): continue host = re.split(" |\t",line)[-1] print("-----["+host+"]------") run = Run(user,host,password) if args.cmd=="run": run.sshdo(args.c) elif args.cmd=="cp": run.sshcopy(args.s, args.d) elif args.cmd=="chage_passwd_time": # , ( ) run.sshdo("chage -d %s %s" %(datetime.datetime.today().strftime('%Y-%m-%d'),user)) run.sshdo("chage -l %s| head -n 1" %(user)) else: print("error cmd!!!!!") def showArgs(args): if args.cmd=="run": print("[cmd]run:"+args.c) elif args.cmd=="cp": print("[cmd]cp:"+args.s +" to "+args.d) elif args.cmd=="chage_passwd_time": print("[cmd]chage_passwd_time") else: print("error cmd!!!!!") if __name__ == "__main__" : parser = argparse.ArgumentParser(description='run or cp for each node.') parser.add_argument('cmd',type=str,help='run cmd[run/cp/chage_passwd_time]') parser.add_argument('-s',type=str,help='srcFile [cp]') parser.add_argument('-d',type=str,help='destPath [cp]') parser.add_argument('-c',type=str,help='cmd [run]') parser.add_argument('-f',type=str,help='hosts file',default='/etc/hosts') args = parser.parse_args() print("[begin]...............") runHosts(args) print("[finish]!!!!!!!!!!!!!!")

使用方法の説明は、-fで使用するプロファイルのパスを指定することもできます.
[root@n101 python]# python sshUtil.py --help
usage: sshUtil.py [-h] [-s S] [-d D] [-c C] [-f F] cmd

run or cp for each node.

positional arguments:
  cmd         run cmd[run/cp/chage_passwd_time]

optional arguments:
  -h, --help  show this help message and exit
  -s S        srcFile [cp]
  -d D        destPath [cp]
  -c C        cmd [run]
  -f F        hosts file
[root@n101 python]# python sshUtil.py cp -s /root/shell/python/test -d /root
[begin]...............
[cmd]cp:/root/shell/python/test to /root
-----[n101]------
[status]0
-----[n102]------
[status]0
-----[n103]------
[status]0
[finish]!!!!!!!!!!!!!!
[root@n101 python]# python sshUtil.py run -c "ls -l /root"
[begin]...............
[cmd]run:ls -l /root
-----[n101]------
    171364
-rw-------.  1 root root      1231 6   16 09:43 anaconda-ks.cfg
drwxr-xr-x.  3 root root       134 7    9 23:09 shell
drwxr-xr-x.  2 root root        15 7   18 17:07 test
-----[n102]------
    4
-rw-------. 1 root root 1231 6   16 09:43 anaconda-ks.cfg
drwxr-xr-x. 2 root root   15 7   18 17:07 test
-----[n103]------
    4
-rw-------. 1 root root 1231 6   16 09:43 anaconda-ks.cfg
drwxr-xr-x. 2 root root   15 7   18 17:07 test
[finish]!!!!!!!!!!!!!!
[root@n101 python]# python sshUtil.py chage_passwd_time
[begin]...............
[cmd]chage_passwd_time
-----[n101]------
                                              :7  18, 2019
-----[n102]------
                                              :7  18, 2019
-----[n103]------
                                              :7  18, 2019
[finish]!!!!!!!!!!!!!!