運維自動化——輕量級批量執行工具pssh

1、pssh介紹

pssh是python寫的可以併發在多臺機器上批量執行命令的工具,它的用法可以媲美ansible的一些簡單用法,執行起來速度比ansible快它支持文件並行複製,遠程命令執行,殺掉遠程主機上的進程等等。殺手鐗是文件並行複製,,當進行再遠程主機批量上傳下載的時候,最好使用它。

2、pssh的使用

在使用pssh之前,必須要保證管理主機和本地主機進行過密鑰的認證,或者是在進行批量時,沒有做過密鑰認證,但是必須保證被管理的多臺主機的密碼相同。
關於如何做密鑰認證,ssh無密碼登錄配置可以參考博客:https://blog.csdn.net/change_can/article/details/85318286

2.1 安裝
方法一:yum 安裝:
yum install -y pssh
方法二:編譯安裝
官網地址:https://code.google.com/archive/p/parallel-ssh/downloads(需要能打開谷歌)

wget http://parallel-ssh.googlecode.com/files/pssh-2.3.1.tar.gz 
# 或wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/parallel-ssh/pssh-2.3.1.tar.gz
tar -zxvf pssh-2.3.1.tar.gz
cd pssh-2.3.1
python setup.py install

說明:
使用yum安裝後,只能使用pssh,但是編譯安裝後會包括其他命令也安裝了(pscp prsync pnuke pslurp)

  • pssh:在遠程多臺主機上並行運行命令 pscp :把文件並行複製到多臺遠程主機上
  • prsync:使用rsync協議本地文件同步到遠程多臺主機上。
  • pnuke:在遠程多臺主機上並行killall某一進程
  • pslurp:把文件從遠程多臺主機上覆制到本地主機上

2.2 pssh常用參數

# pssh --help
Usage: pssh [OPTIONS] command [...]

Options:
  --version             show program's version number and exit
  --help                show this help message and exit
  -h HOST_FILE, --hosts=HOST_FILE
                        hosts file (each line "[user@]host[:port]")
  -H HOST_STRING, --host=HOST_STRING
                        additional host entries ("[user@]host[:port]")
  -l USER, --user=USER  username (OPTIONAL)
  -p PAR, --par=PAR     max number of parallel threads (OPTIONAL)
  -o OUTDIR, --outdir=OUTDIR
                        output directory for stdout files (OPTIONAL)
  -e ERRDIR, --errdir=ERRDIR
                        output directory for stderr files (OPTIONAL)
  -t TIMEOUT, --timeout=TIMEOUT
                        timeout (secs) (0 = no timeout) per host (OPTIONAL)
  -O OPTION, --option=OPTION
                        SSH option (OPTIONAL)
  -v, --verbose         turn on warning and diagnostic messages (OPTIONAL)
  -A, --askpass         Ask for a password (OPTIONAL)
  -x ARGS, --extra-args=ARGS
                        Extra command-line arguments, with processing for
                        spaces, quotes, and backslashes
  -X ARG, --extra-arg=ARG
                        Extra command-line argument
  -i, --inline          inline aggregated output and error for each server
  --inline-stdout       inline standard output for each server
  -I, --send-input      read from standard input and send as input to ssh
  -P, --print           print output as we get it

Example: pssh -h hosts.txt -l irb2 -o /tmp/foo uptime

具體常用介紹:

-h   HOST_FILE   後邊跟遠程主機列表(ip)
-H   HOST_STRING   後邊跟遠程主機名或者ip地址
-l   USER  指定遠程主機的用戶名
-p   PAR   指定pssh最大的並行線程數。
-o   將輸出的內容重定向到一個指定的文件中
-O   指定ssh參數的具體配置
-e   將執行錯誤重定向到一個指定的文件中
-t   設定命令執行超時時間
-x   傳遞ssh命令的一些參數
-i   在遠程主機上執行命令完成後顯示標準輸出和標準錯誤
-P   在執行遠程命令時,輸出執行結果

2.3 用法實例:

pssh -P -h hosts.txt “cat /etc/redhat-release”

# cat hosts.txt 
172.16.92.31
172.16.92.32

# pssh -P -h hosts.txt "cat /etc/redhat-release"
172.16.92.31: CentOS Linux release 7.5.1804 (Core) 
[1] 11:25:30 [SUCCESS] 172.16.92.31
172.16.92.32: CentOS Linux release 7.5.1804 (Core) 
[2] 11:25:30 [SUCCESS] 172.16.92.32

3、pscp拷貝文件到遠程主機

 pscp -h hosts.txt /root/test.txt /tmp/
[1] 11:36:21 [SUCCESS] 172.16.92.31
[2] 11:36:21 [SUCCESS] 172.16.92.32

4、pnuke殺掉某一進程

這個命令類似於 killall命令

# pnuke -h hosts.txt httpd

說明:在遠程主機上批量關閉httpd服務
能通過killall關閉的服務,都可以通過pnuke來批量完成

5 、pslurp 遠程主機拷貝文件到本地主機

# pslurp -h hosts.txt -L /root/ /tmp/test.txt  aaaa.txt
[1] 11:43:45 [SUCCESS] 172.16.92.32
[2] 11:43:45 [SUCCESS] 172.16.92.31

說明:將所有遠程主機/tmp/test.txt複製到本地主機/root/目錄下,並且重新命名爲aaaa.txt
-L 來指定本地文件路徑

下面這個是拷貝目錄

# pslurp -h hosts.txt -r -L /home/ /home/wenjian/ open

ps:建議分發文件,執行命令,批量殺死進程,使用pssh,pscp,pnuke,速度很快的

6、自動檢測
ssh-copy-id.exp

#!/usr/bin/expect -f
set ip [lindex $argv 0]
set user [lindex $argv 1]
set password [lindex $argv 2]
spawn ssh-copy-id $user@$ip
expect {  
 "*yes/no" { send "yes\r"; exp_continue}  
 "password" { send "$password\r" }  
}
expect eof

init.sh

#!/bin/bash

HOSTS=$(cat IP.txt)

if [[ "$HOSTS" == "" ]]; then
   echo "IP.txt can't is empty!"
   exit
fi
PASSWORD=$PASSWORD
if [ "$PASSWORD" == "" ]; then
   echo "PASSWORD can't is empty!"
   exit
fi

yum install expect -y  #交互命令
ssh-keygen -f ~/.ssh/id_rsa -N ""

for ip in $HOSTS; do 
  ./ssh-copy-id.exp $ip root $PASSWORD
done

wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/parallel-ssh/pssh-2.3.1.tar.gz
tar -xzvf pssh-2.3.1.tar.gz
cd pssh-2.3.1
python setup.py install

# uages:
# pssh -i -H `seq -f "172.16.92.%g" 11 25` echo hi

將所有服務器ip寫入文件IP.txt,一行一個ip
運行 PASSWORD='aaa' sh init.sh (aaa注意更換成自己的密碼喲, 所有機器密碼須一致!)
驗證免密是否成功
執行:

pssh -i -h IP.txt "hostname"

若無報錯則成功

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章