如何在多台服务器上运行相同命令
作者:cf313995
PSSH
全称是parallel-ssh,基于Python编写的并发在多台服务器上批量执行命令的工具。包括pssh,pscp,prsync,pnuke和pslurp。该项目包括psshlib,可以在自定义应用程序中使用。它相当于ansible的简化版,执行起来速度比ansible快,支持文件并行复制,远程命令执行,杀掉远程主机上的进程,杀手锏是文件并行复制。
主要用法:
pssh命令 在远程主机上执行本地命令或者脚本
pscp命令 将本地文件拷贝至多个远端主机
pslurp命令 从多台远程机器拷贝文件到本地
pnuke命令 在远端主机杀进程
prsync命令 使用rsync协议从本地计算机同步到远程主机
安装
yum install epel-release yum install pssh
使用
(1)、定义一个文件,写入需要操作的机器,如pssh-hosts
vim pass-hosts
然后写入需要控制的机器
192.168.96.54:22 192.168.96.60:22 192.168.96.244:22
(2)、pssh执行命令
pssh -h pssh-hosts -l root -i "echo "Hello World"" # 因为已经是互信环境,所以不需要输入密码
(3)、参数含义
-h -–hosts 主机文件列表,内容格式[user@]host[:port] -l -–user 登录使用的用户名 -p -–par 并发的线程数【可选】 -t --timeout 超时时间【可选】 -v --verbose 输出详细信息【可选】
仅包含在pslurp里的
-L --localdir 下载文件的保存目录
(4)、pscp从96.54拷贝文件到其他机器
pscp.pssh -h pssh-hosts -l root pssh-hosts /tmp # 拷贝pssh-hosts文件到其他机器的/tmp目录 # pscp从本地拷贝到远程,所以先写本地的某个文件或目录,再写远程的目录
(5)、pslurp从其它机器下载文件到本地
例如,先创建一个脚本,并将其传入到每个机器上,获取每个机器的hostname并写入到一个文件,然后将每个机器上的该文件下载到本地。
准备:
在使用pssh执行脚本后,将每个机器的hostname写入到本地的某个文件了
最后使用pslurp将其拷贝到本地的某个目录
pslurp -h pssh-hosts -L /a /tmp/1.txt 1.txt # 将每个节点上的/tmp/1.txt下载到本地的a目录里 # pslurp从远程下载到远程,所以先写远程的某个文件或目录,再写本地的目录
(6)、pnuke 杀死远程主机上的进程
例如杀死每个机器的nginx进程查看每个节点的nginx的状态
执行命令
查看效果
(7)、prsync跟rsync使用差不多,略过。
ansible
安装
先搜索仓库里的ansible源
然后安装centos提供的ansible源
然后每个机器安装ansible。(其实只需在管理主机上安装,都安装只是为了方便换其他机器后使用)
使用
(1)、安装完后,在/etc/ansible/目录下生成三个主要的文件或目录
- ansible.cfg: Ansible的配置文件
- hosts:登记被管理的主机
- roles:角色项目定义目录,主要用于代码复用
(2)、添加节点,在/etc/ansible/hosts文件中添加需要被管理的服务器节点
pssh -h pssh-hosts -i "printf '[cluster]\n192.168.96.54\n192.168.96.60\n192.168.96.244\n' > /etc/ansible/hosts" pssh -h pssh-hosts -i "cat /etc/ansible/hosts"
这里将三个节点放入cluster组中,后面执行命令时可指定针对某个组执行。
(3)、建立互信环境
ssh-keygen -t rsa -b 4096 ssh-copy-id root@192.168.96.54
(4)、测试连通性
针对cluster组里的机器执行ping命令
ansible cluster -m ping
若要针对所有组的机器执行命令,则使用all即可。
ansible all -m ping
(5)、处理[WARNING]: sftp transfer mechanism failed
修改sshd_config
改sshd_config文件,取消注释Subsystem
修改ansible配置文件,添加scp_if_ssh=True
在执行时已经没有warning了
(6)、ansible命令构成
ansible的命令格式为, ansible 主机群组名 -m 命令模块名 -a “批量执行的操作”
常用模块
- ping模块
- command/shell模块,两者区别是shell支持管道,command不支持管道操作
ansible all -m command -a 'hostname'
ansible all -m shell -a 'hostname | grep 54'
script脚本模块
ansible all -m script -a '/tmp/test.sh' # 无需将脚本拷贝到其他节点
copy模块,相当于scp
ansible all -m copy -a "src=/tmp/test.sh dest=/tmp/" # 将本节点的该路径的脚本拷贝到其他机器的tmp目录下
- user/group模块
- git模块
- file模块
- service模块
- yum模块
- cron模块
其他模块不再一一列举,可通过ansible-doc 模块名查看具体用法例如: ansible-doc yum
(7)、playbook
playbook即剧本,由一个或多个play组成,play的功能就是为归为一组的主机编排要执行的一系列task,其中每一个task就是调用Ansible的一个命令模块。
playbook的核心元素包括:
- hosts:执行任务的主机,可以是主机组
- tasks:要执行的任务列表
- variables:内置变量或自定义的变量
- templates:使用模板语法的文件,通常为配置文件
- handlers:和notify结合使用,由特定条件触发,一般用于配置文件变更触发服务重启
- tags:标签,可在运行时通过标签指定运行playbook中的部分任务
- roles:定义可重用的任务和变量集合。
没用过。
参考资料:https://www.cnblogs.com/spec-dog/p/12736447.html
自定义脚本
一个最简单的脚本的方式
#!/bin/bash # 要执行的命令 COMMAND="ls -l" # 集群中所有节点的 IP 地址 NODES=("192.168.1.101" "192.168.1.102" "192.168.1.103") # 在所有节点上执行命令 for NODE in "${NODES[@]}" do echo "Executing command on node $NODE..." ssh $NODE $COMMAND done
到此这篇关于如何在多台服务器上运行相同命令的文章就介绍到这了,更多相关多台服务器运行相同命令内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!