思路:
1. 生成服务器IP地址list
先使用脚本打印出来, 后期有用再改
[root@bi remote]# cat iplist
192.168.100.111
[root@bi remote]# cat foreach.sh
#!/usr/bin/bash
readarray -t ips < iplist
for ip in ${ips[@]}
do
echo $ip
done
[root@bi remote]#
2. 创建集群管理账户
[root@bi remote]# useradd -m -d /home/admin admin
[root@bi remote]# passwd admin
Changing password for user admin.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
[root@bi remote]# sudo usermod -G sudo admin
[root@bi remote]# usermod --shell /bin/bash admin
usermod: no changes
[root@bi remote]# sudo cp ~/.bashrc /home/admin/
[root@bi remote]# sudo chown admin.admin /home/admin/.bashrc
# 将上述操作改为sh脚本
[root@bi remote]# cat create_admin.sh
#!/usr/bin/bash
sudo useradd -m -d /home/admin admin
sudo passwd admin
sudo usermod -G sudo admin
sudo usermod --shell /bin/bash admin
sudo cp ~/.bashrc /home/admin
sudo chown admin.admin /home/admin/.bashrc
sudo sh -c 'echo "admin ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers'
# 脚本写完了, 当然是要分发其它机器上了, 改一下foreach.sh
[root@bi remote]# cat foreach.sh
#!/usr/bin/bash
readarray -t ips < iplist
for ip in ${ips[@]}
do
scp ~/home/remote/create_admin.sh root@$ip:~/create_admin.sh
done
[root@bi remote]#
你以为这样就可以了? 我挖个坑儿在这里, 因为若有成百个IP, 要登录该怎么办?
所以我需要安全地且免登录这些服务器,
3. 免登录这些服务器, 可以使用公钥登录(id_rsa.pub)
# 本地创建公私钥对
mkdir -p ~/.ssh # 在家目录下, 创建个`.ssh`文件
cd ~/.ssh/ # 切换至`.ssh`工作目录
ssh-keygen -t rsa # 生成公私密钥对
# 以下为往一台机器上写入公钥的脚本
[root@bi remote]# cat transfer_key.sh
ip = $1
pubkey=$(cat ~/.ssh/id_res.pub)
echo "execute on ... $ip"
ssh admin@$ip "
mkdir -p ~/.ssh
echo $pubkey >> ~/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
"
# 再改一下foreach.sh, 分发到每一台机器上
[root@bi remote]# cat foreach.sh
#!/usr/bin/bash
readarray -t ips < iplist
for ip in ${ips[@]}
do
sh ./transfer_key.sh $ip
done
[root@bi remote]#
4. 配置一个在每台服务器上要安装的文件
比如安装个docker
# 先在本地试验一下, 看能不能安装完成
[root@bi remote]# cat docker_install.sh
yum -y install docker-io
每次都改foreach.sh, 烦死了, 再改一次
[root@bi remote]# cat foreach.sh
#!/usr/bin/bash
readarray -t ips < iplist
script=$1
for ip in ${ips[@]}
do
ssh $ip 'bash -s ' < $script
done
# 这样我就可以让foreach.sh 带个参数, 参数就是脚本的名称, 那这个脚本在每台服务器上执行了.
[root@bi remote]#
5. 总结:
就是把你配置一台服务器过程中使用的所有关键命令行收集成为sh脚本, 然后分发到每台服务器上去执行.