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'