给Linux进行批量部署

一早上,说什么前阵子装的很多agent,没有发现连接到服务器,可能有些人安装的不对,要重新装一下。

自己以前写过个shell,用于批量配置,这不刚好改改就能用了。

情况是,各个linux的主机有不同的密码,账户都是root,那就需要建立一个账户文件,包含远端机器的IP地址,root,还有密码。

然后逐行读取这三个信息,用来ssh连接远端机器,连接完成后,提前将要执行的动作写入一个shell文件,然后sftp到远端机器去,再进行执行,执行后将输出写入当前的目录的log.txt文件中。

目录结构如下:

├── account.csv
├── command.py
├── install.sh
└── log.txt

其中install.sh是要执行的shell文件,log.txt是执行后生成的日志。

account.csv的格式如下: 用空格隔开,IP地址,账户名和密码​

10.1.2.3 root password
10.1.2.5 root newpass

下面是python的代码:

import csv
import paramiko


def ssh_command(ip, username, password):
    ssh_client = paramiko.SSHClient()
    ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

    try:
        ssh_client.connect(ip, username=username, password=password)

        sftp = ssh_client.open_sftp()
        local_sh = "install.sh"
        remote_path = '/tmp/install.sh'
        sftp.put(local_sh, remote_path)
        sftp.close()

        stdin, stdout, stderr = ssh_client.exec_command(
            'chmod +x {} && {}'.format(remote_path, remote_path))

        # stdin, stdout, stderr = ssh_client.exec_command('/tmp/install.sh')
        # 等待命令执行完成
        exit_status = stdout.channel.recv_exit_status()
        # 处理命令执行结果并记录到 log.txt 文件中
        with open('log.txt', 'a') as log_file:
            log_file.write(f"=== Output for {ip} ===\n")
            log_file.write(stdout.read().decode("utf-8"))
            log_file.write(f"Exit status: {exit_status}\n")
    except paramiko.AuthenticationException:
        print(f"Failed to log in to {ip} with provided credentials.")
    finally:
        ssh_client.close()


with open('account.csv', 'r') as csvfile:
    csv_reader = csv.reader(csvfile, delimiter=' ')
    # next(csv_reader)  # 跳过标题行
    for row in csv_reader:
        ip = row[0]
        username = row[1]
        password = row[2]
        # command_to_run = "install.sh"  # 替换为要执行的脚本命令
        ssh_command(ip, username, password)

通过测试,可以实现效果。后面也可以用os.remove删掉上传到远端的shell文件。

| 访问量:
Table of Contents