【樹莓派】【原】遠程連接樹莓派設備,以及進行遠程應用更新與升級


在實際工作中,我們把樹莓派作為一個agent放在用戶那邊,在里面啟動一些服務,進行用戶業務數據dicom文件的存儲,並轉發到阿里雲oss上面,起到一個gateway的作用。

但是,放出去的盒子,就如同魔術師手中的飛鏢,發出去,怎么還能繼續掌控,這很重要。

在實際應用場景中,對於這種agent,我們還需要繼續維護,升級,並定期進行一些業務數據的更新。

那么如何進行遠程操控以及管理呢?

我們目前采用下面的方式處理,雖然我認為其實有更好的方式,但目前暫先就如此,畢竟我們都知道,穩定大於一切。

1.在每個agent 樹莓派盒子上面,通過 sshkey-gen生成自己的公鑰私鑰;

2.將每個agent的私鑰存儲在ssh在管控/調度機器(相當於跳板機)的~/.ssh/authorized_keys中,並保存;

3.在自己的應用程序中,通過MQ下發消息,在樹莓派盒子上面,用 ssh -o "StrictHostKeyChecking no" -CNfR 10000:127.0.0.1:22 boxagent@smith.lifeccp.com 驅動盒子發起ssh請求;或者

4.在跳板機上面,使用 ssh -p 10140 lifeccp@localhost 命令來連接樹莓派盒子;

5.由於ssh連接存在時效性,所以,退出時候記得exit一下,否則可能下次連接時候存在問題導致連接不上。

6.如果連接不上,可以通過如下命令kill舊的進程,然后重新發起連接請求; 

kill -9 `ps -ef |grep ssh |grep StrictHostKeyChecking | awk '{print $2}'`

或者 kill -9 `pgrep -f StrictHostKeyChecking`

 

我這邊成功的結果,如下圖:

 

 另外,應用更新其實很簡單了,在agent盒子那邊寫個腳本,執行一下就行了。update.sh腳本內容見下面:

#!/bin/sh
export JAVA_HOME=/usr/lib/jdk1.8.0_45
export CALSSPATH=$JAVA_HOME/lib/*.*   
export PATH=$PATH:$JAVA_HOME/bin

#config
APP_NAME=osprey
USER_HOME=/home/lifeccp/webapp
RELEASE_SRC="boxagent@smith.lifeccp.com:/home/boxagent/boxrelease/osprey/*.zip"

#function
say() {
    echo -e "[Osprey Deploy] $0: $1"
}

fetch_artifacts() {
    DEST="$USER_HOME/incoming/${APP_NAME}/"
    [ -d ${DEST} ] || mkdir -p ${DEST}
    say "Fetching artifacts from $ARTIFACTS_SRC to ${DEST}"
    scp ${RELEASE_SRC} ${DEST} 
    
    say "Unzip the new war"
    cd ${DEST} && unzip -qo *.zip    
    
    if [ "$?" = "0" ]; then
        say "\033[32m -=Fetch artifacts finished=- \033[0m"
    else
        say "\033[31m -=Fetch artifacts failed=- \033[0m"
        exit 1
    fi

}

stop_app() {
    say "Stopping [${APP_NAME}]"
    pkill -f ${APP_NAME}

    osprey_pid=$(pgrep -f ${APP_NAME})
    if [ "${osprey_pid}" = "" ]; then
        say "\033[32m -=Stop ${APP_NAME} finished=- \033[0m"
    else
        say "\033[32m -=Stop ${APP_NAME} failed=- \033[0m"
        kill -9 "${osprey_pid}"
        say "\033[32m -=Kill -9 ${APP_NAME}=- \033[0m"
    fi
}

backup_app() {
    DEST="$USER_HOME/archive/${APP_NAME}$(date '+%Y%m%d%H%M')/"
    say "make backup dir ${DEST}"
    mkdir -p "${DEST}"
    
    say "Copying backup app and config files."
    cp -r ${USER_HOME}/${APP_NAME}/* ${DEST}    
    say "\033[32m -=Backup ${APP_NAME} finished=- \033[0m"
    
    
}

deploy_app() {
    DEST="$USER_HOME/incoming/${APP_NAME}/"
    say "Deploy ${APP_NAME}"

    say "Remove old app"
    rm -rf $USER_HOME/$APP_NAME/osprey*.release.jar
    rm -rf $USER_HOME/$APP_NAME/osprey*.release.jar.original

    say "Copying new app"
    # cp $USER_HOME/incoming/$APP_NAME/*.zip $USER_HOME/$APP_NAME/
    cp ${DEST}/osprey*.release.jar $USER_HOME/$APP_NAME/osprey.release.jar
    cp ${DEST}/osprey*.release.jar.original $USER_HOME/$APP_NAME/
    

    if [ "$?" = "0" ]; then
        say "\033[32m -=Deploy ${APP_NAME} finished=- \033[0m"
    else
        say "\033[31m -=Deploy ${APP_NAME} failed=- \033[0m"
        exit 1
    fi
}


clear_app() {
    say "clear $USER_HOME/incoming/${APP_NAME}/"
    rm -rf $USER_HOME/incoming/${APP_NAME}/*
}


start_app() {
    say "Start [${APP_NAME}]"
    sudo reboot
    if [ "$?" = "0" ]; then
        say "\033[32m -=Start reboot finished=- \033[0m"
    else
        say "\033[31m -=Start reboot failed=- \033[0m"
        exit 1
    fi
}

publish() {
    fetch_artifacts
    stop_app
    backup_app
    deploy_app  
    clear_app
    start_app
}

#### do it ###
publish

 

簡單說明一下上面的腳本:

1.獲取新的安裝包;

2.停止當前應用;

3.備份當前應用;

4.部署當前應用;

5.清理安裝包文件;

6.啟動服務應用;

7.發布部署; 

 

樹莓派系列文章為原創文章,轉載請注明源自 http://www.cnblogs.com/haochuang/,感謝配合。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM