[记录]Shell并发模式批量安装saltstack的脚本

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'

 

posted @ 2018-03-07 18:23  wsjhk  阅读(733)  评论(0编辑  收藏  举报