zoukankan      html  css  js  c++  java
  • [记录]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'

  • 相关阅读:
    linux软件包安装yum
    linux软件包安装rpm
    使用OwnCloud建立属于自己私有的云存储网盘
    Linux 防火墙
    Linux docker
    llinux 权限2
    详列JDK中的设计模式(二)结构型
    详列JDK中的设计模式(一)创建型
    JavaWeb学习总结(一) JavaWeb基础与Tomcat服务器
    老生常谈-从输入url到页面展示到底发生了什么
  • 原文地址:https://www.cnblogs.com/wsjhk/p/8524547.html
Copyright © 2011-2022 走看看