批量分发管理
一般架构服务器在50-100台做批量分发管理没问题,如果是大型架构的话,最好用puppet、saltstack
这里以nfs服务器做分发服务端,其他服务器做分发客户端
1、首先在所以服务器上创建用户oldgirl ,这个用户专门做分发用,这样做的好处是针对性比较强,不会出现用root操作时的隐患
useradd oldgirl
同时在所以服务器上对用户oldgirl修改密码为:echo 123456|passwd --stdin oldgirl
2、在nfs服务器上生成密钥对
切换到oldgirl环境下 su - oldgirl
在oldgirl环境下创建ssh密钥对
[oldgirl@nfs-server ~]$ ssh-keygen -t dsa,生成一个公钥和一个私钥,如下:
[oldgirl@nfs-server ~]$ ll ~/.ssh/ 总用量 8 -rw------- 1 oldgirl oldgirl 668 9月 15 15:47 id_dsa -rw-r--r-- 1 oldgirl oldgirl 608 9月 15 15:47 id_dsa.pub
3、在nfs服务器上将公钥拷贝到其他各个服务器上,而且还要保证私钥和拷贝到其他服务器上的公钥的权限都是默认的600 ,不要修改,如果修改了权限,那么在ssh连接的话就不生效了,要输入密码了
这个事按照默认端口22拷贝的
[oldgirl@nfs-server ~]$ ssh-copy-id -i .ssh/id_dsa.pub oldgirl@192.168.1.102
下面是如果ssh的端口修改过,比如修改成了52113,那么将公钥拷贝到其他服务器上的方式为:
[oldgirl@nfs-server ~]$ ssh-copy-id -i .ssh/id_dsa.pub "-p 52113 oldgirl@192.168.1.102"
4、这时候再用ssh连接到其他服务的时候就不需要密码了,只要公钥和密码匹配上就自动连接了
[oldgirl@nfs-server ~]$ ssh -p22 oldgirl@192.168.1.102 [oldgirl@lamp01 ~]$
同理用scp远程拷贝也不要密码了
5、分发hosts文件
在nfs服务器上将/etc/hosts文件拷贝到oldgirl家目录
[oldgirl@nfs-server ~]$ cp /etc/hosts .
修改hosts文件
[oldgirl@nfs-server ~]$ vi hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.1.101 nfs-server 192.168.1.102 lamp01 192.168.1.103 lnmp01 192.168.1.104 backup
将修改后的hosts文件分发到其他服务器上
创建分发脚本fenfa.sh
[oldgirl@nfs-server ~]$ vim fenfa.sh
scp -P22 hosts oldgirl@192.168.1.103:~
#!/bin/bash
. /etc/init.d/functions
if [ $# -ne 1 ]
then
echo "USAGE:$0 {FILENAME|DIRNAME}"
exit 1
fi
for n in 102 103 104
do
scp -P22 -r $1 oldgirl@192.168.1.$n:~ &>/dev/null
if [ $? -eq 0 ]
then
action "fenfa $1 ok" /bin/true
else
action "fenfa $1 false" /bin/false
fi
done
脚本里的 $@:表示所有脚本参数的内容 $#:表示返回所有脚本参数的个数 $?表示脚本运行状态1为错误 0为正常 $0表示脚本本身 $1表示脚本后的第一个参数 $2第二个参数。。。
运行脚本 /bin/sh fenfa.sh hosts 这样hosts文件就被分发到其他服务器的oldgirl用户的家目录了
[oldgirl@nfs-server ~]$ sh fenfa.sh hosts
fenfa hosts ok [确定]
fenfa hosts ok [确定]
fenfa hosts ok [确定]
[oldgirl@nfs-server ~]$ sh fenfa.sh hos
fenfa hos false [失败]
fenfa hos false [失败]
fenfa hos false [失败]
[oldgirl@nfs-server ~]$ sh fenfa.sh
USAGE:fenfa.sh {FILENAME|DIRNAME}
注意事项
这个hosts远程分发在这种情况下是无法分发到远程的/etc/下面的,解决办法就是对远端所有服务器的oldgirl提权,使oldgirl有rsync的root权限,这样oldgirl用户就可以将本地文件复制到/etc/下面了
更改/etc/sudoers如下:
echo 'oldgirl ALL=(ALL) NOPASSWD: /usr/bin/rsync'>>/etc/sudoers visudo -c cat /etc/sudoers |grep oldgirl
测试分发到一台服务器上
先分发hosts sh fenfa.sh hosts
然后ssh -t oldgirl@192.168.1.102 sudo rsync hosts /etc/ ---这里的-t 参数表示要在远程机器上用sudo命令,这里的hosts文件和/etc/目录是远端机器上的文件和目录,而不是分发服务的机器上文件或目录
这个分发过程为先将文件分发到远程服务端的oldgirl家目录,然后让oldgirl sudo同步家目录文件到/etc/目录下
如果要批量操作的话,那么这个脚本就需要再做优化
[oldgirl@nfs-server ~]$ vim fenfa_good.sh
#!/bin/bash
. /etc/init.d/functions
if [ $# -ne 2 ]
then
echo "USAGE:$0 localfile remotedir"
exit 1
fi
for n in 102 103 104
do
scp -P22 -r $1 oldgirl@192.168.1.$n:~ &>/dev/null && \
ssh -t oldgirl@192.168.1.$n sudo rsync $1 $2 &>/dev/null
if [ $? -eq 0 ]
then
action "fenfa $1 ok" /bin/true
else
action "fenfa $1 false" /bin/false
fi
done
这样脚本就实现了先分发文件到远端,然后远端用户oldgirl 用sudo提权将自己的家目录的文件拷贝到需要的目录下。
sh fenfa_good.sh hosts /etc/
最后用cat /etc/hosts来验证批量分发是否成功。
最后注意事项:
分发秘钥的时候,如果服务很多的情况下,每次分发秘钥都要输入对方对应用户的密码和yes,这种情况很麻烦,这时候就要用到expect
用expect就可以省掉输入的yes和密码,在非交互式的情况下把秘钥分发到其他服务器
安装expect : yum install expect -y
首先切换到分发的用户环境下,比如oldgirl用户环境下,创建expect.exp 和expect.sh iplist文件
1、创建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 "-p 22 oldgirl@$host"
expect {
"yes/no" {send "yes\r";exp_continue}
"*password" {send "$password\r"}
}
expect eof
exit -onexit {
send_user "Goser say goodboy to you !\n"
}
当然这时候可以用 expect fenfa_sshkey.exp ~/.ssh/id_dsa.pub 192.168.1.102来测试分发是否需要yes和密码,也可以这时候不测试,完成下面的sh脚本后一次性分发测试。。。。
2、创建fenfa_sshkey.sh脚本和需要分发的服务器文件iplist
#!/bin/sh . /etc/init.d/functions for ip in `cat iplist` do #expect fenfa_sshkey.exp ~/.ssh/id_dsa.pub $ip >/dev/null 2>&1 expect fenfa_sshkey.exp ~/.ssh/id_dsa.pub $ip if [ $? -eq 0 ];then action "$ip" /bin/true else action "$ip" /bin/false fi done
iplist文件
192.168.1.102 192.168.1.103 192.168.1.104
3、最后运行脚本fenfa_sshkey.sh就可以直接将密码分发到iplist指定的分发服务器上
sh fenfa_sshkey.sh
浙公网安备 33010602011771号