SaltStack+Shell:
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连接进来.
==============================================================================================================
==============================================================================================================
#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
==============================================================================================================
==============================================================================================================
#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
==============================================================================================================
==============================================================================================================
#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

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