ユーティリティ次元スクリプト
最近、いくつかのクラスタのメンテナンス作業を行い、いくつかの実用的なスクリプトを開発してクラスタの管理に協力するつもりです.
1、マルチマシン操作とファイルコピーを実現する
sshpassモジュールに基づくリモート操作と一括コピーを実現し、前駆体に依存してスクリプトを実行するマシンにsshpassコマンドをオフラインまたはオンラインでインストールする(Python 2と使用したモジュールはcentosシステムにデフォルトで統合されているようで、「yum install-y sshpass」を使用していない場合).また、クラスタのすべてのノードのパスワードを統一する必要があります.統一しないと、指定した異なるユーザーアカウントとパスワードを少し変更して統一制御を実現できます.
sshUtil.pyの内容は次のとおりです.
使用方法の説明は、-fで使用するプロファイルのパスを指定することもできます.
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]!!!!!!!!!!!!!!