工作中需要查看集群几百台服务器上某些文件的权限及配置文件中的参数,一台台看工作量太大,故写了个python脚本实现自动化获取,简单记录一下过程。

环境:python3.8+paramiko

准备:

选择一台机器安装paramiko即可,将集群的节点ip写入ip.txt文件中。

命令:pip3 install paramiko

步骤:

1、编写管理节点代码,代码实现如下:

#!coding:utf-8
from multiprocessing.managers import BaseManager
from multiprocessing import freeze_support
import queue, os,time,paramiko

task_queue = queue.Queue()
result_queue = queue.Queue()


def get_task():
    return task_queue


def get_result():
    return result_queue


# 创建类似的queueManager
class QueueManager(BaseManager):
    pass


def win_run():
    # 注册在网络上,callable 关联了Queue 对象
    # 将Queue对象在网络中暴露
    # window下绑定调用接口不能直接使用lambda,所以只能先定义函数再绑定
    QueueManager.register('get_task_queue', callable=get_task)
    QueueManager.register('get_result_queue', callable=get_result)
    # 绑定端口和设置验证口令
    manager = QueueManager(address=('0.0.0.0', 8001), authkey=b'qiye')

    # 启动管理,监听信息通道
    manager.start()

    # 通过网络获取任务队列和结果队列
    task = manager.get_task_queue()
    result = manager.get_result_queue()

    # 添加任务
    ip_file = open('./ip.txt')  # 打开要传输的服务器列表
    for ip in ip_file.readlines():
        f = open('./main.py')  # 打开要传输的文件
        for i in f.readlines():
            r = i.strip('\n')
            task.put(i)
        task.put('quit')
        print('send is done')
        f.close()

        ip_value = ip.strip('\n')
        # 分发worker文件到服务器
        sftp_file(ip_value, 22, 'root', 'F!829hgrbn9nax9H&QNP')
        print("已发送worker.py")
    print('try get result')
    ip_file = open('./ip.txt','r')  # 打开要传输的服务器列表
    for ip in ip_file.readlines():
        # 远程执行服务器脚本
        ssh_server(ip.strip('\n'), 22, 'root', 'your pass word')

        r = result.get()

        print(r)

        with open('result.txt','a') as txt:
            txt.write(r)

    manager.shutdown()
    print("写入结果result.txt")

def ssh_server(ip,port,username,passwd):
  '''远程执行服务器脚本函数'''
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(ip, port, username, passwd)
    stdin, stdout, stderr = ssh.exec_command('python3 ./worker.py')
    print(stdout.readlines())
    ssh.close()


def sftp_file(ip,port,username,passwd):
    t = paramiko.Transport((ip,port))
    t.connect(username=username, password=passwd)
    sftp = paramiko.SFTPClient.from_transport(t)
    sftp.put('./worker.py', './worker.py')
    t.close()


if __name__ == '__main__':
    # 多进程可能有问题,添加这句话缓解
    freeze_support()
    win_run()

2、编写worker节点代码:

# coding:utf-8
import os
import time
from multiprocessing.managers import BaseManager


# 创建类似的QueueManager:
class QueueManager(BaseManager):
    pass


# 实现第一步:使用QueueManager注册获取Queue的方法名称
QueueManager.register('get_task_queue')
QueueManager.register('get_result_queue')
# 实现第二步:连接到服务器:
server_addr = 'manager server ip'
print('Connect to server %s...' % server_addr)
# 端口和验证口令注意保持与服务进程设置的完全一致:
m = QueueManager(address=(server_addr, 8001), authkey=b'qiye')
# 从网络连接:
m.connect()
# 实现第三步:获取Queue的对象:
task = m.get_task_queue()
result = m.get_result_queue()
# 实现第四步:从task队列取任务,并把结果写入result队列:

# 获取发送的文件,写入task.py文件中。
with open('./task.py', 'w') as task_py:
    while True:
        r = task.get()
        if r == 'quit':
            break
        task_py.write(r)
# 执行task.py脚本
out = os.popen('python3 ./task.py')
exec_result = out.read()
result.put(exec_result)
print("服务器执行->" + exec_result)

# 处理结束:
print('worker exit.')

3、编写集群各节点需要执行的脚本,这里我用main.py。

import os

def get_local_ip():
  '''获取本机ip地址'''
    out = os.popen('ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk \'{print $2}\'|tr -d "addr:"')
    result = out.read()
    return result


def _1_chmod():
  '''修改某文件权限'''
    os.system('chmod 644 /home/test.txt')
    return "1、已修改/etc/passwd权限为644"


def _2_find_string():
  '''查找某文件是否存在目标字符串'''
    try:
        with open('/home/test.txt', 'r') as f:
            if 'targetString' in f.read():
                return "2、是"
            else:
                return "2、否"
    except:
        return "2、否"


if __name__ == '__main__':
    print(get_local_ip()+_1_chmod())
    print(_2_find_string())

4、编写ip.txt

127.0.0.1
127.0.0.1

5、使用

  • 上传文件
# 上传以下文件:
-rw-r--r-- 1 root root   32 Oct 27 23:33 ip.txt
-rw-r--r-- 1 root root 1333 Oct 27 23:26 main.py
-rw-r--r-- 1 root root 2712 Oct 27 23:33 manager.py
-rw-r--r-- 1 root root 1069 Oct 27 23:24 worker.py
# 结果存入result.txt中
-rw-r--r-- 1 root root  436 Oct 27 23:36 result.txt
  • 执行脚本
python manager.py
  • 下载结果
文章目录