说明:
适用于大量服务器root密码各不相同的情况,密码相同的情况直接用ansible修改就可以了。
本博客hosts.csv文件中写的密码是相同的,使用时只需要准备好同样格式的csv文件即可。
1. 脚本(python2)
from multiprocessing import Process
from multiprocessing import Pool
from multiprocessing import Manager
import multiprocessing
import paramiko
import csv
import logging
hosts_file = "/root/hosts.csv"
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
logging.basicConfig(level=logging.INFO, format='%(asctime)s %(process)d %(message)s',datefmt='%Y-%m-%d %I:%M:%S %p')
queue = Manager().Queue()
def logger(queue):
try:
while True:
content = queue.get()
if content:
level = content['level']
message = content['message']
if level == logging.INFO:
logging.info(message)
except Exception,e:
logging.info(str(e))
def send_log(queue, level, message):
queue.put({"level": level, "message": message})
def change_password(record,queue):
try:
ssh.connect(hostname=record['hostname'], port=record['port'], username=record['user'], password=record['password'], allow_agent=False)
stdin, stdout, stderr = ssh.exec_command("echo %s | passwd --stdin root" % record['new_password'])
out = stdout.readlines()
send_log(queue, logging.INFO, record['hostname'] + ": " + str(out))
except Exception, e:
send_log(queue, logging.INFO, record['hostname'] + ": " + str(out))
p = Process(target=logger, args=(queue,))
p.start()
pool = multiprocessing.Pool(processes=4)
with open(hosts_file) as f:
content = csv.DictReader(f)
for row in content:
pool.apply_async(change_password, (row,queue))
pool.close()
pool.join()
2. hosts.csv
hostname,port,user,password,new_password
10.1.20.53,22,root,abcdef,123456
10.1.20.74,22,root,abcdef,123456
10.1.20.85,22,root,abcdef,123456
10.1.20.102,22,root,abcdef,123456
10.1.20.111,22,root,abcdef,123456