(轉)SSH批量分發管理&非交互式expect
目錄
- 1 SSH批量分發管理
- 1.1 測試環境
- 1.2 批量管理步驟
- 1.3 批量分發管理實例
- 1.3.1 利用sudo提權來實現沒有權限的用戶拷貝
- 1.3.2 利用sudo提權開發管理腳本
- 1.3.3 利用rsync來實現增量備份
- 1.4 SSH批量管理分發腳本實戰
- 1.5 SSH批量管理總結
- 2 非交互式expect
- 2.1 非交互式生成密鑰及實現批量管理
- 2.2 一鍵批量安裝httpd服務
- 2.3 一鍵自動化50臺規模集群網站
1 SSH批量分發管理
基於口令的,如何實現批量管理:expect、pssh、sshpass
期中架構分享
http://edu.51cto.com/course/course_id-4212.html
1.1 測試環境
m01(Server)
eth0:192.168.90.61/24
eth1:172.16.1.61/24
nfs01(Client)
eth0:192.168.90.31/24
eth1:172.16.1.31/24
backup(Client)
eth0:192.168.90.41/24
eth1:172.16.1.41/24
web01(Client)
eth0:192.168.90.8/24
eth1:172.16.1.8/24
1.2 批量管理步驟
1、創建用戶及密碼
2、m01創建密鑰對
3、m01分發公鑰
默認22端口可以不指定端口
若更改過的端口,需要指定-p端口
4、測試
測試成功的話連接後就不用密碼了
[root@m01 ~]# useradd oldgirl
[root@m01 ~]# echo 123456|passwd --stdin oldgirl
更改用戶 oldgirl 的密碼 。
passwd: 所有的身份驗證令牌已經成功更新。
[root@m01 ~]# id oldgirl
uid=501(oldgirl) gid=501(oldgirl) 組=501(oldgirl)
[root@m01 ~]# su - oldgirl
[oldgirl@m01 ~]$ ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/home/oldgirl/.ssh/id_dsa):
Created directory ‘/home/oldgirl/.ssh‘.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/oldgirl/.ssh/id_dsa.
Your public key has been saved in /home/oldgirl/.ssh/id_dsa.pub.
The key fingerprint is:
bf:44:68:f3:eb:6b:03:28:45:21:24:fb:dd:e9:b0:cf oldgirl@m01
The key‘s randomart image is:
+--[ DSA 1024]----+
| ..o .. |
| o .. |
| . . |
| . ... o |
| ..o.S . |
| . .=.= |
| .. ..+ |
| o .oo |
| Eo=o |
+-----------------+
[oldgirl@m01 ~]$ ll .ssh/
總用量 8
-rw------- 1 oldgirl oldgirl 668 2月 10 19:36 id_dsa #鑰匙
-rw-r--r-- 1 oldgirl oldgirl 601 2月 10 19:36 id_dsa.pub #鎖
#非交互式創建密鑰
1、ssh-keygen -t dsa -P ‘‘ -f ~/.ssh/id_dsa >/dev/null 2>&1
2、echo -e "\n" | ssh-keygen -t dsa -N ""
#發送公鑰(下面這個只能發送公鑰)
沒改端口:ssh-copy-id -i .ssh/id_dsa.pub [email protected]
改端口:ssh-copy-id -i .ssh/id_dsa.pub "-p 52113 [email protected]"
#測試
[oldgirl@m01 ~]$ ssh -p 52113 oldgirl@172.16.1.31 /sbin/ifconfig eth0
[oldgirl@m01 ~]$ ssh oldgirl@172.16.1.8 /sbin/ifconfig eth0
[oldgirl@m01 ~]$ ssh oldgirl@172.16.1.41 /sbin/ifconfig eth0
#若要批量查看每個系統的版本,可以直接寫成腳本,把上面的三條命令都寫成腳本然後執行。
vi ssh.sh
ssh -p 52113 oldgirl@172.16.1.31 /sbin/ifconfig eth0
ssh oldgirl@172.16.1.8 /sbin/ifconfig eth0
ssh oldgirl@172.16.1.41 /sbin/ifconfig eth0
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
1.3 批量分發管理實例
例:把所有服務器上的hosts解析文件給更新一遍,hosts文件內容如下
cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.1.5 lb01
172.16.1.6 lb02
172.16.1.7 web01
172.16.1.8 web02
172.16.1.51 db01 db01.etiantian.org
172.16.1.31 nfs01
172.16.1.41 backup
172.16.1.61 m01
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
企業裏實現ssh的3種方案:
1、直接root ssh key。
條件:允許root ssh登錄
2、利用sudo提權來實現沒有權限的用戶拷貝
3、利用suid來實現沒有權限的用戶拷貝(工作中不建議使用suid)
曲線救國的方式,可以先用scp把hosts文件拷貝到對方主機的家目錄下,然後再給rsync或其它拷貝命令授權以suid(chmod u+s `which rsync`)。之後再用ssh連接執行遠程拷貝功能(前提是rsync已經被授權suid)操作命令如下:
ssh -p 52113 hosts oldgirl@172.16.1.31:~
ssh -p 52113 oldgirl@172.16.1.31 /usr/bin/rsync ~/hosts /etc/hosts
- 1
- 2
1.3.1 利用sudo提權來實現沒有權限的用戶拷貝
指定一個用戶,讓他可以執行某個命令:
visudo
oldgirl ALL=(ALL) NOPASSWD:/usr/bin/rsync
- 1
- 2
自動化管理
echo "oldgirl ALL=(ALL) NOPASSWD:/usr/bin/rsync" >>/etc/sudoers
visudo -c
- 1
- 2
實現遠程sudo
兩種方法:
第一種:註釋掉/etc/sudoers文件中的Defaults requiretty
第二種(推薦):ssh 加-t選項,在執行遠程ssh時可以打開終端,然後就可以sudo用了。
scp -P52113 hosts oldgirl@172.16.1.31:~
ssh -p52113 -t oldgirl@172.16.1.31 sudo /usr/bin/rsync ~/hosts /etc/hosts
- 1
- 2
1.3.2 利用sudo提權開發管理腳本
[oldgirl@m01 ~]$ cat fenfa_file.sh
scp -P52113 hosts oldgirl@172.16.1.31:~
ssh -p52113 -t oldgirl@172.16.1.31 sudo /usr/bin/rsync ~/hosts /etc/hosts
scp hosts oldgirl@172.16.1.41:~
ssh -t oldgirl@172.16.1.41 sudo /usr/bin/rsync ~/hosts /etc/hosts
scp hosts oldgirl@172.16.1.8:~
ssh -t oldgirl@172.16.1.8 sudo /usr/bin/rsync ~/hosts /etc/hosts
- 1
- 2
- 3
- 4
- 5
- 6
- 7
1.3.3 利用rsync來實現增量備份
rsync -avz hosts -e ‘ssh -p 52113‘ oldgirl@172.16.1.31:~
- 1
#這樣的方法有兩種好處
1、增量
2、加密
工作中的跳板機(堡壘機)一定要保護的很安全,就是批量管理的機器
1、防火墻
2、監聽內網
3、不給外網IP
4、ssh防護好,禁止root登錄
1.4 SSH批量管理分發腳本實戰
所有服務器端ssh端口最好都一致
#一個簡單的可以讓所有服務器執行命令的腳本
[oldgirl@m01 scripts]$ cat ssh_view.sh
#!/bin/bash
. /etc/init.d/functions
export PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/oldgirl/bin
if [ $# -ne 1 ];then
echo "USAGE:$0 ARG"
exit 1
fi
#由於我的端口沒有一致,故只測試31這一個改過端口的服務器
for n in 31
do
echo =============172.16.1.$n=============
ssh -p52113 oldgirl@172.16.1.$n "$1"
done
#######測試
[oldgirl@m01 scripts]$ bash ssh_view.sh "cat /etc/redhat-release"
=============172.16.1.31=============
CentOS release 6.9 (Final)
[oldgirl@m01 scripts]$ bash ssh_view.sh "tail -1 /etc/inittab"
=============172.16.1.31=============
id:3:initdefault:
#可以批量管理服務器的拷貝文件的腳本
[oldgirl@m01 scripts]$ cat fenfa_file1.sh
#!/bin/bash
. /etc/init.d/functions
if [ $# -ne 2 ];then
echo "USAGE:$0 ARG1 ARG2"
exit 1
fi
for n in 8 41 31
do
scp ~/$1 oldgirl@172.16.1.${n}:~ >/dev/null 2>&1 && #備份,可以不做
#ssh -t [email protected].${n} sudo /usr/bin/rsync /etc/hosts /etc/hosts_$(date +%F-%H:%M:%S)
ssh -t oldgirl@172.16.1.${n} sudo /usr/bin/rsync ~/$1 $2 >/dev/null 2>&1
if [ $? -eq 0 ];then
action "fenfa hosts 172.16.1.$n" /bin/true
else
action "fenfa hosts 172.16.$n" /bin/false
fi
done
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
1.5 SSH批量管理總結
1、利用root做ssh key驗證。
優點:簡單,易用
缺點:安全差,同時無法禁止root遠程連接這個功能
企業應用:80%的中小企業。
2、利用普通用戶如oldgirl來做
思路是先把分發的文件拷貝到服務器用戶家目錄,然後sudo提權拷貝分發的文件到遠程服務器的對應權限目錄。
優點:安全。無需停止root遠程連接這個功能。
缺點:配置比較復雜。
3、拓展:同方案2,只是不用sudo,而是設置suid對固定命令提權。
優點:相對安全
缺點:負載,安全性較差。任何人都可以處理帶有suid權限的命令。
建議:
追求簡單可以選1
追求安全建議選2
有能力可以用puppet、saltstack。
suid:普通用戶裕興程序,沒有權限時也可以suid,然後運行,必須是編譯好的程序命令。
puppet:早起大網站使用的
saltstack(*):可以裝客戶端
ansible(*):優點:不用裝客戶端,直接ssh就可以
4、企業級生產場景批量管理,自動化管理方案:
1)最簡單常用ssh key,功能最強大的。一般中小型企業會用,50-100臺以下。
2)sina cfengine、puppet 較早的批量管理工具。現在基本上沒有企業用。
3)門戶級別比較流行的,puppet批量管理工具,復雜,笨重。
4)saltstack批量管理工具,特點:簡單,功能強大(配置復雜),趕集網、小米等一些CDN公司會使用
5)http+cron
批量管理路線:ssh key–>cfengine–>puppet–>saltstack/ansible
輕松實現遠程批量拷貝文件腳本博客:
http://blog.51cto.com/oldboy/1205715
SSH連接慢的解決:
http://blog.51cto.com/oldboy/1300964
2 非交互式expect
非交互式工具:expect(一門語言)、sshpass、pssh
expect:默認沒有安裝,需要先安裝再使用
[root@m01 ~]# yum install expect -y
[root@m01 ~]# rpm -qa expect
expect-5.44.1.15-5.el6_4.x86_64
#裝完expect後會附帶一個隨機密碼生成工具mkpasswd
[root@m01 ~]# mkpasswd
tnhu1LM9$
[root@m01 ~]# mkpasswd
Y1]taHax9
[root@m01 ~]# mkpasswd -l 10 #-l 指定隨機密碼長度
GSg[yeyv10
[root@m01 ~]# mkpasswd -l 15
nb/Wayrtj9ww0vE
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
2.1 非交互式生成密鑰及實現批量管理
1、所有機器創建用戶及密碼
useradd oldgirl888
echo 123456|passwd --stdin oldgirl
id oldgirl888
su - oldgirl888
2、管理機創建密鑰
ssh-keygen -t dsa -P ‘‘ -f ~/.ssh/id_dsa >/dev/null 2>&1
3、自動分發密鑰
vim fenfa_sshkey.exp
#!/usr/bin/expect
#
if { $argc != 2 } {
send_user "Usage: expect fenfa_sshkey.exp file host \n"
exit
}
#define var
set file [lindex $argv 0]
set host [lindex $argv 1]
set password "123456"
spawn ssh-copy-id -i $file oldboy@$host
expect {
"yes/no" {send "yes\r";exp_continue}
"*password" {send "$password\r"}
}
expect eof
exit -onexit {
send_user "Oldboy say goodbye to you!\n"
}
[oldboy@m01 scripts]$ expect fenfa_sshkey.exp ../.ssh/id_dsa.pub 172.16.1.41
一個腳本都分發:
cat /server/scripts/fenfa_sshkey.sh
#!/bin/bash
#
. /etc/init.d/functions
for i in 128 129
do
expect fenfa_sshkey.exp ~/.ssh/id_dsa.pub 192.168.90.$i >/dev/null 2>&1
if [ $? -eq 0 ]
then
action "$i" /bin/true
else
action "$i" /bin/false
fi
done
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
2.2 一鍵批量安裝httpd服務
1、準備工作:
useradd oldboy
echo 123456|passwd --stdin oldboy
id oldboy
2、sudo提權實現沒有權限用戶拷貝
配置sudoers:
echo "oldboy ALL=(ALL) NOPASSWD: ALL" >>/etc/sudoers
visudo -c
su - oldboy
自動分發腳本
[oldboy@m01 scripts]$ cat sshkey_install.sh
#!/bin/bash
#
. /etc/init.d/functions
export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
# Product key pair
ssh-keygen -t dsa -P ‘‘ -f ~/.ssh/id_dsa > /dev/null 2>&1
if [ $? -eq 0 ];then
action "Create dsa $ip" /bin/true
else
action "Create dsa $ip" /bin/false
exit 1
fi
#dis pub key
for i in 128 129
do
expect ~/scripts/fenfa_sshkey.exp ~/.ssh/id_dsa.pub 192.168.90.$i >/dev/null 2>&1
if [ $? -eq 0 ];then
action "$i" /bin/true
else
action "$i" /bin/false
fi
done
#dis fenfa scripts
for n in 128 129
do
scp -rp ~/scripts oldboy@192.168.90.$n:~
done
#install service
for m in 128 129
do
ssh -t oldboy@192.168.90.$m sudo /bin/bash ~/scripts/install.sh
done
cat /scripts/install.sh
yum install httpd -y
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
2.3 一鍵自動化50臺規模集群網站
思路:
自動化的基礎:
a.搭建yum倉庫
b.定制rpm包
1、ssh key + expect
a.kickstart無人值守安裝Linux系統(自動創建用戶、密碼、優化)
b.分發機上創建密鑰對、批量發走公鑰(expect)
c.寫安裝優化腳本、批量發到各個服務器上,遠程執行安裝
2、高級架構師知識搞定的一套集群方案
a.cobbler無人值守安裝Linux系統(自動創建用戶、密碼、優化、salt客戶端)
b.服務端salt上,創建認證,寫配置來批量安裝管理各個節點服務器應用。
3、高級架構師知識搞定的一套集群方案
a.kvm虛擬化、根據不同的業務提前做好鏡像
b.通過與計算工具OpenStack管理鏡像,批量生成五個虛擬機
c.服務端salt上,創建認證,寫配置來批量安裝管理各個節點服務器應用。
4、docker
版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/Mr_rsq/article/details/79619793(轉)SSH批量分發管理&非交互式expect