批量分发管理

一般架构服务器在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

 

posted @ 2017-09-15 16:23  goser  阅读(153)  评论(0)    收藏  举报