1. 程式人生 > 實用技巧 >Fabric外部節點部署自動化指令碼

Fabric外部節點部署自動化指令碼

#!/bin/bash
# zoujiaojiao 2020-0829
# 變數全部大寫,函式首字母大寫下劃線拼接

MASTER_FILE=$2_master.txt
echo $MASTER_FILE
NODE_FILE=$2_node.txt
TRANSFER_PROJECT=/

OTHER=$3
FABRIC_PATH=/mnt/nfs/vbaas/fabric

#獲取主機IP賬戶密碼資訊
Get_Variable(){
     TRANSFER_HOST=`echo ${LINE}|cut -d" " -f 2 `
     TRANSFER_USER=`echo ${LINE}|cut -d" " -f 3`
     TRANSFER_PASSWORD=`echo ${LINE}|cut -d" " -f 4` 
     NETWROK_NAME=`echo ${LINE}|cut -d" " -f 5` 
     ORG_NAME=`echo ${LINE}|cut -d" " -f 6` 
     ORG_HOST=`echo ${LINE}|cut -d" " -f 7` 
     TRANSFER_FILE=${OTHER:-${TRANSFER_HOST}_file.tar.gz}
     echo ${TRANSFER_HOST} ${TRANSFER_USER} ${TRANSFER_PASSWORD} ${TRANSFER_FILE} ${NETWROK_NAME} ${ORG_NAME} ${ORG_HOST}

}

#所有主機執行操作
All_Hosts(){
cat $MASTER_FILE $NODE_FILE | while read LINE
        do
	    Get_Variable
	    ${ACTION}
	done 
}
#master執行操作
Master_Hosts(){
cat $MASTER_FILE  | while read LINE
    do
        Get_Variable
        REMOTE_SHELL="sh /swarm_init_master.sh"
        ${ACTION}
	${REMOTE_TO_LOAL}
    done 
}
#node執行操作
Node_Hosts(){
cat $NODE_FILE | while read LINE
        do
	    Get_Variable
            ${LOAL_TO_REMOTE}
	    ${ACTION}
	    REMOTE_SHELL="sh /swarm_add_node.sh"
	done
}
#生成客戶端需要的檔案
Touch_Files(){
    cat $MASTER_FILE | while read LINE
    do
    Get_Variable
    if [ ! ${OTHER} ];then
        sed  "s/MASTER_HOST/${TRANSFER_HOST}/g" swarm_init_master.sh > swarm_init_master_${TRANSFER_HOST}.sh
	echo "TRANSFER_HOST:${TRANSFER_HOST}"
        tar zcvf ${TRANSFER_HOST}_file.tar.gz swarm_init_master_${TRANSFER_HOST}.sh ${NODE_FILE} docker_check.sh fabric_check.sh swarm_add_node.sh fabric_bin.tar.gz
    else
	sed "s/NETWORKNAME/${NETWROK_NAME}/g" org-start-stack.sh > org-start-stack_${TRANSFER_HOST}_${ORG_NAME}.sh

	sed -i "s/ORGNAME/${ORG_NAME}/g" org-start-stack_${MASTER_HOST}_${ORG_NAME}.sh > org-start-stack_${TRANSFER_HOST}_${ORG_NAME}.sh

        tar zcvf ${OTHER}.tar.gz $FABRIC_PATH/networks/${NETWROK_NAME}/orgs/${ORG_NAME} $FABRIC_PATH/networks/${NETWROK_NAME}/crypto-config/peerOrganizations/${ORG_HOST} org-start-stack_${TRANSFER_HOST}_${ORG_NAME}.sh
    fi
    
    done
}
#fuction 檔案傳輸
Remote_Transfer() {
    expect -c "
        set timeout -1
	#spawn scp -r "$@"
	spawn scp -r ${TRANSFER_FILE} ${TRANSFER_USER}@${TRANSFER_HOST}:${TRANSFER_PROJECT}
	    expect {
                \"*assword\" { send \"${TRANSFER_PASSWORD}\r\" }
	       	\"yes/no\" { send \"yes\r\"; exp_continue }
            };
            send \"exit\r\"
	    expect eof 
    "  	
}
#遠端執行
Remote_Execution() {
    expect -c "
        set timeout 5
	spawn ssh ${TRANSFER_USER}@${TRANSFER_HOST};
	    expect {
                \"*assword\" { send \"${TRANSFER_PASSWORD}\r\" }
	       	\"yes/no\" { send \"yes\r\"; exp_continue }
            } ;
	    expect "#"
            send \"${REMOTE_SHELL}\r\"
	    expect "#"
            send \"exit\r\"
	    expect eof 
    "  	
}

#主函式
Main() {
    case $1 in
    "transfer")
	 Touch_Files
	 ACTION=Remote_Transfer
         All_Hosts;;
    "fabric")
	 ACTION=Remote_Execution
	 REMOTE_SHELL="tar zxvf /${TRANSFER_HOST}_file.tar.gz -C / && sh /fabric_check.sh"
         All_Hosts;;
    "docker")
	 ACTION=Remote_Execution
	 REMOTE_SHELL="sh /docker_check.sh"
         All_Hosts;;
    "swarm_master")
	 ACTION=Remote_Execution
         REMOTE_TO_LOAL="Remote_Transfer \"${TRANSFER_USER}@${TRANSFER_HOST}:/${TRANSFER_HOST}_token ${TRANSFER_PROJECT}\""
         Master_Hosts;;
    "swarm_node")
	 ACTION=Remote_Execution
	 LOAL_TO_REMOTE="Remote_Transfer \"${TRANSFER_PROJECT}${TRANSFER_HOST}_token ${TRANSFER_USER}@${TRANSFER_HOST}:${TRANSFER_PROJECT}\""
        Node_Hosts;;
    "create_org")
	 ACTION=Remote_Transfer
	 REMOTE_SHELL="sh /org-start-stack_${TRANSFER_HOST}_${ORG_NAME}.sh"
         Master_Hosts;;


    *)
	 echo "Usage :"
	 echo "sh main.sh transfer master_ip_orgname \"filename1 filename2\""
	 echo "        傳檔案。預設傳輸當前master_host_file.tar.gz,自定義檔案可以在雙引號中寫多個檔案引數"
	 echo " "
	 echo "sh main.sh fabric master_ip_orgname"
	 echo "        安裝和檢查fabric環境"
	 echo " "
	 echo "sh main.sh docker master_ip_orgname"
         echo "        安裝和檢查docker環境"
	 echo " "
	 echo "sh main.sh swarm_master  master_ip_orgname"
	 echo "        初始化swarm叢集master節點"
	 echo " "
	 echo "sh main.sh swarm_node  master_ip_orgname"
         echo "        新增swarm叢集node節點"
	 echo " "
	 echo "sh main.sh create_org  master_ip_orgname "
         echo "        建立組織";;
    esac
}
# 增加一個安裝expect的函式,給node進行安裝
#執行
Main $@