Shell并发编程实战

Shell并发模式批量安装saltstack的脚本
环境:SaltStack+Shell
说明:该脚本通过批量部署salt-minion来演示shell的并发功能。并介绍了saltsack的配置和遇到的坑。

salt-master的配置:

cat /etc/salt/master

user: root
auto_accept: True
salt-minion的配置(支持多master的配置):

cat /etc/salt/minion

// minion唯一标识
id: $minion_ip
module_dirs:
– /etc/salt/module
master:
– master1_ip
– master2_ip
– master3_ip
说明:

1./etc/salt/pki/master/minions,该目录是master记录minion_id的目录,以此识别minion。
2./etc/salt/pki/minion,该目录下是公私钥,若master识别不了可删除minion_master.pub文件重启minion。
3.在建立多Master的配置中,主要的一点就是所有的Master使用同样的private key. 这些key将在Master第一次启动时自动生成。 因此在多Master环境建立时,需要从原始的(original)Master上拷贝其private key至第二个Master以提供它启动时自动生成的那个, 以此类推。Master的private key存储在Master本地的 pki_dir 目录下. 默认的目录是 /etc/salt/pki/master/master.pem 和/etc/salt/pki/master/master.pub两个文件. 将该key拷贝到新增的master上. 需要注意的是,在拷贝的时候,需要确保新增的master上并没有minion连接进来.
脚本:
脚本分为三部分:第一部分预检查连通性,是否目标主机是否可以正常登录执行命令;第二部分执行并发安装salt-minion脚本;第三部分检查目标主机安装是否成功。

1.预检查脚本:

cat testlogin.sh

检查主机是否有权限登录的脚本

!/bin/bash

并发线程数

thead_num=50

创建临时输入输出管道文件

tmp_fifo_file=”/tmp/$$.fifo”
mkfifo $tmp_fifo_file

绑定管道文件到文件描述符,自定义3-9

exec 4<>$tmp_fifo_file

删除临时管道文件,也可不删除

rm -f $tmp_fifo_file

利用for循环向管道中输入并发数量的空行

for ((i=0;i<$thead_num;i++)) do #输出空行 echo “” done >&4 #输出重导向到定义的文件描述符4上

for i in $(cat /home/abc/iplist/all.ip | grep -vE “#|^$”)
do
read -u4
{
ssh $i “hostname” 2>&1
if [ $? -eq 255 ];then
echo $i >> /home/abc/iplist/nologin.ip
else
echo $i >> /home/abc/iplist/login_ok.ip
fi
#暂停一秒,缓冲时间
sleep 1
#再写入一个空行,使挂起的循环继续执行
echo “” >&4
}& #放入后台执行
done

等待所有后台进程执行完成

wait

删除文件描述符

exec 4>&-
exit 0
2.并发安装salt-minion脚本:

cat install_salt.sh

执行安装并配置salt-minion的脚本

!/bin/bash

thead_num=50
tmp_fifo_file=”/home/abc/$$.fifo”
mkfifo $tmp_fifo_file
exec 4<>$tmp_fifo_file
rm -f $tmp_fifo_file
for ((i=0;i<$thead_num;i++)) do echo “” done >&4

for i in $(cat /home/abc/iplist/login_ok.ip | grep -vE “#|^$”)
do
read -u4
{
OS=$(ssh $i “cat /etc/issue | awk ‘{print \$1}’| grep -vE \”^$\” | head -1″ 2>&1)
if [[ “x$OS” == “xCentOS” ]];then
#安装salt-minion
ssh $i “sudo yum install salt-minion -y”
#检查master的配置文件
ssh $i “sudo grep -E “^master:” /etc/salt/minion”
if [ $? -eq 0 ];then
#替换master的配置
ssh $i “sudo sed -i ‘s/^master:(.)/master: salt-master/g’ /etc/salt/minion” else #开启master的配置并指定master ssh $i “sudo sed -i ‘s/#master: salt/master: salt-master/g’ /etc/salt/minion” fi #检查minion中id的配置 ssh $i “sudo grep -E “^id:” /etc/salt/minion” if [ $? -eq 0 ]; then #替换id为自己的ip ssh $i “sudo sed -i ‘s/^id:(.)/id: $i/g’ /etc/salt/minion”
else
#开启id的配置并指定为自己的ip
ssh $i “sudo sed -i ‘s/#id:(.)/id: $i/g’ /etc/salt/minion” fi #重启minion客户端 ssh $i “ps -ef | grep salt-minion|grep -v grep|awk ‘{print \$2}’| sudo xargs kill -9 && sudo rm -f /etc/salt/pki/minion/minion_master.pub && sudo salt-minion -d” elif [[ “x$OS” == “xUbuntu” ]];then ssh $i “sudo apt-get install salt-minion -y” ssh $i “sudo grep -E “^master:” /etc/salt/minion” if [ $? -eq 0 ];then ssh $i “sudo sed -i ‘s/^master:(.)/master: salt-master/g’ /etc/salt/minion”
else
ssh $i “sudo sed -i ‘s/#master: salt/master: salt-master/g’ /etc/salt/minion”
fi
ssh $i “sudo grep -E “^id:” /etc/salt/minion”
if [ $? -eq 0 ]; then
ssh $i “sudo sed -i ‘s/^id:(.)/id: $i/g’ /etc/salt/minion” else ssh $i “sudo sed -i ‘s/#id:(.)/id: $i/g’ /etc/salt/minion”
fi
ssh $i “ps -ef | grep salt-minion|grep -v grep|awk ‘{print \$2}’| sudo xargs kill -9 && sudo rm -f /etc/salt/pki/minion/minion_master.pub && sudo salt-minion -d”
else
echo $i >> /home/abc/iplist/yeslogin_but_error.ip
fi
sleep 1
echo “” >&4
}&
done

wait
exec 4>&-
exit 0
3.检查是否安装成功脚本:

cat check_install_salt.sh

检查是否安装成功的脚本,得到成功的主机数应该和在master上执行的#salt “*” test.ping | grep -v True|sort |uniq |wc -l命令得到的数量一样才对。

!/bin/bash

thead_num=50
tmp_fifo_file=”/home/abc/$$.fifo”
mkfifo $tmp_fifo_file
exec 4<>$tmp_fifo_file
rm -f $tmp_fifo_file
for ((i=0;i<$thead_num;i++)) do echo “” done >&4

for i in $(cat /home/abc/iplist/login_ok.ip)
do
read -u4
{
ssh $i “ps -ef | grep salt-minion| grep -v grep”
if [ $? -eq 1 ];then
echo $i >> /home/abc/iplist/install_error.ip
else
echo $i >> /home/abc/iplist/install_ok.ip
fi
sleep 1
echo “” >&4
}&
done

wait
exec 4>&-
exit 0

4.测试:

如上图所示,salt支持使用这样的方式来指定特定的ip列表批量执行命令,类似于分组管理,iplist.ip文件格式是使用空格分割ip。

salt -L “iplist.ip” cmd.run ‘uptime’

声明:文中观点不代表本站立场。本文传送门:https://eyangzhen.com/235137.html

(0)
联系我们
联系我们
分享本页
返回顶部