爲N臺linux服務器傳輸大文件

運行邏輯:大文件放在創建torrent的一個目錄中,murder將tgz目錄並創建一個.torrent文件,這個文件讓客戶端知道他們正在下載什麼,跟蹤器會跟蹤當前正在分發的.torrent文件。一旦murder轉移開始,seeder將成爲許多客戶端獲取碎片的第一臺服務器。客戶端將接收文件並在各自之間分發文件。

1.服務端與客戶端建立公鑰及私鑰信任關係。服務端作爲原始文件存儲地,ansible主機
1.1. 在ansible主機上創建公鑰。
ssh-keygen -b 1024 -t rsa
[root@server ~]# ssh-keygen -b 1024 -t rsa
Generating public/private rsa key pair. #提示正在生成rsa密鑰對
Enter file in which to save the key (/home/usrname/.ssh/id_dsa): #詢問公鑰和私鑰存放的位置,回車用默認位置即可
Enter passphrase (empty for no passphrase): #詢問輸入私鑰密語,輸入密語 (這邊輸入的是2Hbl$qt)
Enter same passphrase again: #再次提示輸入密語確認
Your identification has been saved in /home/usrname/.ssh/id_dsa. #提示公鑰和私鑰已經存放在/root/.ssh/目錄下
Your public key has been saved in /home/usrname/.ssh/id_dsa.pub.
The key fingerprint is:
x6:68:xx:93:98:8x:87:95:7x:2x:4x:x9:81:xx:56:94
-b 1024 採用長度爲1024字節的公鑰/私鑰對
-t rsa  採用rsa加密方式的公鑰/私鑰對
有人說使用登錄使用密碼短語,登錄時還要使用密碼短語沒有比使用用戶名和密碼方便多少。其實不然
1.2. 傳輸公鑰到遠程主機上,命令:sshpass -p ‘遠程主機密碼’ root@ip ssh-copy-id -o StrictHostKeyChecking=no
1.3 如何避免ssh 連接遠程主機ip ,輸入密碼短語呢

(這個一般在雲服務器管理中常見,堡壘機到內網主機ssh連接,但是每連一臺主機都輸入密碼短語都比較麻煩,可用以下方式設置)

運行eval命令自動聲明環境變量。eval ssh-agent ssh環境變量加入當前會話環境變量。
ssh-add 把專用密鑰添加到ssh-agent的高速緩存中。提示輸入密碼短語,輸入即可。
在當前的環境變量中直接ssh就能連接到遠程主機。退出當前shell的時候,ssh-agent也退出。下次連接的時候,再次eval即可。

2.相關腳本定義
思路:基於第一步,建立了ansible主機到各個客戶端信任關係後,運行tracker服務,生成大文件的.torrent的文件,播種需要分發的文件包,最後在客戶端定義下載文件腳本。
2.1 首先定義兩個目錄 :存放大文件目錄/opt/data/ ;定義腳本目錄/opt/app/
2.2 修改/opt/app/murder下的seeder.conf配置文件內容。

#大文件
deploy_file=/opt/data/update_v0.27-91-2
#要生成的torrent文件存放地址,放在ansible的相應目錄下。
torrent_file=/etc/ansible/roles/update/files/update_v0.27-91-2.torrent
#tracker服務,其他成員依賴tracker
tracker_ip=21.0.0.153:8998
local_ip=21.0.0.153

2.3 /opt/app/murder/murder_tracker.sh 定義,啓動。

#/bin/sh
name="murder-tracker"
murder_tracker_bin="/opt/app/murder/murder-master/dist/murder_tracker.py"
murder_tracker_log="/opt/log/murder/murder_tracker.log"
murder_tracker_data="/opt/data/murder/tracker_data"

find_tracker_process(){
  PID=`ps -ef |grep murder_tracker|grep python |grep -v $0|grep -v grep |grep -v sh|awk '{print $2}'`

}
start(){
    LOG_DIR=`dirname $murder_tracker_log`
    DATA_DIR=`dirname $murder_tracker_data`
    if [ ! -d $LOG_DIR ];then
         #echo -e "\e[35mlog dir $LOG_DIR doesn't exist,creating\e[0m"
         printf "log dir $LOG_DIR doesn't exist,creating...\n"
         mkdir -p $LOG_DIR
    fi
        if [ ! -d $DATA_DIR ];then
             printf "data dir $DATA_DIR doesn't exist,creating...\n"
         mkdir -p $DATA_DIR 
        fi
        find_tracker_process
    echo $PID
        if [ "$PID" != "" ]; then
         printf  "$name is already running...\n"
    else
          python $murder_tracker_bin > /dev/null 2>&1 &
          printf  "starting $name done....\n"
    fi

}

stop(){
    if [ `netstat -lnpt |grep 8998 |wc -l` -eq 1 ];then
        find_tracker_process
        kill $PID
        printf "stoping $name done...\n"
    else
        printf "$name is already stopping...\n"
    fi 
}

restart(){

    stop
    sleep 2
    start
}

case $1 in
start)
        start
        ;;
stop)
        stop
        ;;
restart)
        restart
        ;;
*)
        printf "Usage: $0 {start|stop|restart}\n"
esac

exit

2.4 基於上文seeder.conf配置文件,/opt/app/murder/murder_seeder.sh定義,啓動。

#!/bin/sh
name="murder-seeder"
muder_seeder_data="/opt/data/murder"
muder_seeder_log="/opt/log/murder/muder_seeder.log"
murder_make_torrent_bin="/opt/app/murder/murder-master/dist/murder_make_torrent.py"
murder_seeder_bin="/opt/app/murder/murder-master/dist/murder_client.py"
seeder_conf_path="/opt/app/murder/seeder.conf"

deploy_file=$(awk -F= '/deploy_file/{print $2}' $seeder_conf_path)
torrent_file=$(awk -F= '/torrent_file/{print $2}' $seeder_conf_path)
tracker_ip=$(awk -F= '/tracker_ip/{print $2}' $seeder_conf_path)
local_ip=$(awk -F= '/local_ip/{print $2}' $seeder_conf_path)
#echo $murder_make_torrent_bin  $deploy_file   $tracker_ip  $torrent_file

find_seed_process(){
    PID=`ps -ef |grep murder_client|grep seed |grep -v $0|grep -v grep |grep -v sh|awk '{print $2}'`
}

start(){
    #make torrent
    python $murder_make_torrent_bin  $deploy_file  $tracker_ip   $torrent_file
    #echo $?
        if [ $? != 0 ];then 
           python $muder_make_torrent_bin $deploy_file  $tracker_ip   $torrent_file
        fi

    find_seed_process
        #echo $PID
        if [ "$PID" != "" ]; then
               printf  "$name is already running...\n"
        else
           python $murder_seeder_bin seed $torrent_file $deploy_file $local_ip >/dev/null 2>&1 &
               printf  "starting $name done....\n"
        fi
}

stop(){
    find_seed_process
        if [ $PID != "" ];then
            kill $PID
            printf "stoping $name done...\n"
        else
            printf "$name is already stopping...\n"
        fi  
}

restart(){

        stop
        sleep 2
        start
}

case $1 in
start)
        start
        ;;  
stop)
        stop
        ;;  
restart)
        restart
        ;;  
*)
        printf "Usage: $0 {start|stop|restart}\n"
esac
exit

2.5 /etc/ansible/roles/update/files/ peer_download.sh定義,要在客戶端執行的腳本,放在ansible的目錄下。

#!/bin/bash
#用於各個 peer 節點根據種子文件信息,執行下載任務
#定義變量
torrent_file=/deploy.test.tar.gz.torrent
download_file=/download/deploy.test.tar.gz
#這裏獲取各個 peer 節點自己的內網IP
local_ip=$(hostname -I|awk '{print $2}')
murder_client_bin=/murder/dist/murder_client.py
#在各個 peer 節點執行 P2P 下載命令
python  $murder_client_bin peer $torrent_file $download_file $local_ip

3.ansible傳輸
3.1 ansible執行的入口文件“gengxin.yaml”

#{{host}}:ansible-playbook執行是帶參數
- hosts: "{{host}}" 
  remote_user: root 
  roles: 
  - { role: update, tags: "update"}

3.2 編寫/etc/ansible/roles/update/tasks/main.yaml如下:

- name: copy file   to remote hosts
  copy: src={{ item }}   dest=/
  with_items:
     - murder-master.tar.gz
     - "{{ update_version }}.torrent"
     - peer_download.sh
- name: tar -zxf murder-master.tar.gz
  command: tar -zxf murder-master.tar.gz
- name: download update use murder_client
  shell: sh /peer_download.sh

3.3 進入到cd /etc/ansible
time ansile-playbook gengxin.yaml --extra-vars "host=28-20 update_version= update_v0.28-20" -t update(host中定義不同的主機組, gengxin.yaml定義不同的角色.-t 指定角色 )

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章