Linux运维:批量处理远程主机

简介: Linux运维:批量处理远程主机

1. 概述

在Linux运维中,批量处理远程主机是一个常见且必要的任务。随着服务器数量的增加,手动管理每台服务器变得不切实际且容易出错。通过批量处理,可以提高工作效率、减少人为错误,并确保配置的一致性。


在Linux环境中,有多种工具可以用于批量处理远程主机。常见的工具包括SSH、Ansible、Puppet、Chef、SaltStack等。这些工具各有优缺点,适用于不同的场景和需求。本文主要介绍的是直接使用SSH以及使用Parallel-SSH这两种方法。

2. 使用SSH进行批量处理

2.1 SSH基础

SSHSecure Shell)是一个用于安全远程登录和其他安全网络服务的协议。它是批量处理远程主机的基础工具之一。

2.1.1 SSH安装与配置

在大多数Linux发行版中,SSH客户端和服务器通常已经预装。如果没有,可以通过包管理器安装:

sudo apt-get install openssh-client openssh-server  # Debian/Ubuntu
sudo yum install openssh-clients openssh-server     # CentOS/RHEL

2.1.2 SSH密钥认证

使用SSH密钥认证可以避免每次登录时输入密码,提高安全性和自动化程度。生成SSH密钥对:

ssh-keygen -t rsa -b 2048

将公钥复制到远程主机:

ssh-copy-id user@remote_host

2.2 使用SSH批量执行命令

2.2.1 使用for循环批量执行命令

可以使用Bash脚本和for循环在多台主机上批量执行命令:

#!/bin/bash
hosts=("host1" "host2" "host3")
for host in "${hosts[@]}"; do
    ssh user@$host "uptime"
done

2.2.2 使用Parallel-SSH

Parallel-SSH是一个用于并行执行SSH命令的工具。安装Parallel-SSH

sudo apt-get install pssh  # Debian/Ubuntu
sudo yum install pssh      # CentOS/RHEL

使用Parallel-SSH批量执行命令:

pssh -h hosts.txt -l user -A -i "uptime"

2.3 使用SSH批量传输文件

2.3.1 使用scp批量传输文件

可以使用scp命令在多台主机之间批量传输文件:

#!/bin/bash
hosts=("host1" "host2" "host3")
for host in "${hosts[@]}"; do
    scp /path/to/local/file user@$host:/path/to/remote/directory
done

2.3.2 使用rsync批量同步文件

rsync是一个高效的文件同步工具,适用于批量传输和同步文件:

#!/bin/bash
hosts=("host1" "host2" "host3")
for host in "${hosts[@]}"; do
    rsync -avz /path/to/local/directory user@$host:/path/to/remote/directory
done

好的,我们可以将第3节替换为使用Parallel-SSHpssh)进行批量处理。以下是更新后的内容:

3. 使用Parallel-SSH进行批量处理

3.1 Parallel-SSH简介

Parallel-SSH(pssh)是一个用于并行执行SSH命令的工具。它允许我们在多台远程主机上同时执行命令,从而大大提高了批量处理的效率。pssh还支持并行文件传输和并行scp操作。


3.2 安装与配置Parallel-SSH

3.2.1 安装Parallel-SSH

在大多数Linux发行版中,可以通过包管理器安装pssh

sudo apt-get install pssh  # Debian/Ubuntu
sudo yum install pssh      # CentOS/RHEL

3.2.2 配置主机列表文件

pssh使用一个主机列表文件来定义需要管理的远程主机。创建一个名为hosts.txt的文件,并在其中列出所有目标主机的IP地址或主机名:

host1
host2
host3

3.3 使用Parallel-SSH执行命令

3.3.1 pssh基本命令执行

使用pssh在多台主机上并行执行命令。例如,检查所有主机的uptime

pssh -h hosts.txt -l user -A -i "uptime"

在这个命令中:

  • -h hosts.txt 指定主机列表文件。
  • -l user 指定远程主机的用户名。
  • -A 启用密码提示。
  • -i 使输出显示在标准输出中。

3.3.2 使用密钥认证

为了避免每次执行命令时输入密码,可以使用SSH密钥认证。首先,确保所有目标主机都配置了SSH密钥认证(参考2.1.2节)。然后,使用pssh执行命令时指定密钥文件:

pssh -h hosts.txt -l user -i -x "-i /path/to/private_key" "uptime"

3.3.3 并行度控制

pssh允许我们控制并行执行的任务数量。使用-p选项可以指定并行任务的数量。例如,限制并行任务数量为5:

pssh -h hosts.txt -l user -p 5 -i "uptime"

3.4 使用Parallel-SSH传输文件

3.4.1 使用pscp并行传输文件

pscppssh套件中的一个工具,用于并行传输文件。使用pscp将本地文件传输到多台远程主机:

pscp -h hosts.txt -l user -A -r /path/to/local/file /path/to/remote/directory

在这个命令中:

  • -r 选项表示递归传输目录。

3.4.2 使用pslurp并行拉取文件

pslurppssh套件中的另一个工具,用于并行从多台远程主机拉取文件。使用pslurp将远程文件拉取到本地:

pslurp -h hosts.txt -l user -A -r /path/to/remote/file /path/to/local/directory

在这个命令中:

  • -r 选项表示递归拉取目录。

3.5 使用Parallel-SSH的其他工具

3.5.1 prsync

prsyncpssh套件中的一个工具,用于并行同步文件。使用prsync将本地目录同步到多台远程主机:

prsync -h hosts.txt -l user -A -r /path/to/local/directory /path/to/remote/directory

3.5.2 pnuke

pnukepssh套件中的一个工具,用于并行终止远程主机上的进程。使用pnuke终止多台远程主机上的指定进程:

pnuke -h hosts.txt -l user -A process_name

通过使用Parallel-SSH,我们可以高效地在多台远程主机上并行执行命令、传输文件和管理进程,从而大大提高批量处理的效率和可靠性。

4. 应用举例:批量配置免密登录

为了提高批量处理的效率,我们可以配置免密登录,使得在执行远程命令时不需要每次输入密码。以下是如何批量配置免密登录的步骤。

4.1 生成SSH密钥对

首先,在本地主机上生成一个SSH密钥对。如果已经有一个密钥对,可以跳过这一步。

ssh-keygen -t rsa -b 2048 -f ~/.ssh/id_rsa -N ""

这将生成一个没有密码短语的RSA密钥对,公钥保存在~/.ssh/id_rsa.pub,私钥保存在~/.ssh/id_rsa

4.1.1 生成SSH密钥对

首先,在本地主机上生成一个SSH密钥对。如果已经有一个密钥对,可以跳过这一步。

ssh-keygen -t rsa -b 2048 -f ~/.ssh/id_rsa -N ""

这将生成一个没有密码短语的RSA密钥对,公钥保存在~/.ssh/id_rsa.pub,私钥保存在~/.ssh/id_rsa

4.1.2 创建主机列表文件

创建一个包含所有目标主机的列表文件hosts.txt

host1
host2
host3

4.1.3 编写批量分发公钥的脚本

编写一个Bash脚本,将公钥分发到所有目标主机。这个脚本将使用ssh-copy-id命令将公钥复制到远程主机的~/.ssh/authorized_keys文件中。

#!/bin/bash

# 定义主机列表文件
HOSTS_FILE="hosts.txt"

# 定义用户名
USER="your_username"1

# 读取主机列表文件并逐个处理
while IFS= read -r HOST; do
    echo "Copying SSH key to $HOST..."
    ssh-copy-id -i ~/.ssh/id_rsa.pub $USER@$HOST
done < "$HOSTS_FILE"

echo "SSH key distribution completed."

将上述脚本保存为distribute_ssh_key.sh,并确保它具有可执行权限:

chmod +x distribute_ssh_key.sh

4.1.4 运行脚本

运行脚本,将公钥分发到所有目标主机:

./distribute_ssh_key.sh

在运行脚本时,系统会提示输入每个远程主机的密码。输入密码后,公钥将被复制到远程主机,配置免密登录。

4.1.5 验证免密登录

完成公钥分发后,可以验证免密登录是否配置成功。尝试使用SSH登录到其中一台远程主机:

ssh your_username@host1

如果配置成功,应该能够直接登录而不需要输入密码。

通过上述步骤,我们可以批量配置若干个远程主机的免密登录,从而提高批量处理的效率和自动化程度。

4.2 使用Parallel-SSH (pssh) 批量配置免密登录

4.2.1 准备工作

  1. 确保已安装 pssh
sudo apt-get install pssh  # Debian/Ubuntu
sudo yum install pssh      # CentOS/RHEL
  1. 创建包含目标主机的列表文件 hosts.txt
host1
host2
host3
  1. 确保你已经生成了 SSH 密钥对。如果没有,可以使用以下命令生成:
ssh-keygen -t rsa -b 2048

4.2.2 使用 pssh 批量分发公钥

使用以下命令批量将公钥分发到所有目标主机:

pssh -h hosts.txt -i "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys" < ~/.ssh/id_rsa.pub

这个命令的含义是:

  • -h hosts.txt: 指定包含目标主机列表的文件
  • -i: 显示每个主机的标准输出和标准错误
  • "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys": 在每个远程主机上执行的命令,创建 .ssh 目录(如果不存在),并将公钥追加到 authorized_keys 文件中
  • < ~/.ssh/id_rsa.pub: 将本地的公钥作为输入传递给远程命令

4.2.3 验证

完成后,你可以尝试登录其中一台主机来验证免密登录是否成功:

ssh user@host1

如果配置成功,你应该能够直接登录而无需输入密码。这种方法更加简洁和高效,特别适合需要快速在多台主机上配置免密登录的场景。

目录
相关文章
|
6月前
|
存储 缓存 固态存储
深度解析linux主机:从应用到硬盘,玩转系统I/O性能优化攻略!
深度解析linux主机:从应用到硬盘,玩转系统I/O性能优化攻略!
105 0
|
3月前
|
存储 Ubuntu Linux
在Linux中,如何查看当前主机的主机名,如何修改主机名?要想重启后依旧生效,需要修改哪个配置文件?
在Linux中,如何查看当前主机的主机名,如何修改主机名?要想重启后依旧生效,需要修改哪个配置文件?
|
1月前
|
Linux 网络安全
Linux虚拟机与主机和Xshell的连接问题解决
Linux虚拟机与主机和Xshell的连接问题解决
71 1
|
3月前
|
存储 监控 网络协议
在Linux中,如何使用 tcpdump 监听主机为 192.168.1.1,tcp 端⼝为 80 的数据,并将将输出结果保存输出到tcpdump.log?
在Linux中,如何使用 tcpdump 监听主机为 192.168.1.1,tcp 端⼝为 80 的数据,并将将输出结果保存输出到tcpdump.log?
|
3月前
|
网络协议 Linux 网络安全
在Linux中,如何将本地 80 端口的请求转发到 8080 端口?当前主机 IP 为10.0.0.104。
在Linux中,如何将本地 80 端口的请求转发到 8080 端口?当前主机 IP 为10.0.0.104。
|
3月前
|
存储 监控 Ubuntu
在Linux中,如何规划⼀台 Linux 主机,步骤是怎样?
在Linux中,如何规划⼀台 Linux 主机,步骤是怎样?
|
3月前
|
Shell Linux 网络安全
在Linux中,如何利用Shell把10台主机的当前时间写到一个文件里边?
在Linux中,如何利用Shell把10台主机的当前时间写到一个文件里边?
|
6月前
|
Linux
LINUX修改主机名
LINUX修改主机名
68 0
|
3月前
|
Linux 开发工具 文件存储
Linux修改主机名的两种方法
Linux修改主机名的两种方法
45 0
|
3月前
|
网络协议 Ubuntu Linux
在Linux中,如何将本地80端口的请求转发到8080端口,当前主机IP为192.168.16.1,其中本地网卡eth0。
在Linux中,如何将本地80端口的请求转发到8080端口,当前主机IP为192.168.16.1,其中本地网卡eth0。