运行逻辑:大文件放在创建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_DIRfiif [ ! -d $DATA_DIR ];thenprintf "data dir $DATA_DIR doesn't exist,creating...\n"mkdir -p $DATA_DIR fifind_tracker_processecho $PIDif [ "$PID" != "" ]; thenprintf  "$name is already running...\n"elsepython $murder_tracker_bin > /dev/null 2>&1 &printf  "starting $name done....\n"fi}stop(){if [ `netstat -lnpt |grep 8998 |wc -l` -eq 1 ];thenfind_tracker_processkill $PIDprintf "stoping $name done...\n"elseprintf "$name is already stopping...\n"fi
}restart(){stopsleep 2start
}case $1 in
start)start;;
stop)stop;;
restart)restart;;
*)printf "Usage: $0 {start|stop|restart}\n"
esacexit

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_filefind_seed_process(){PID=`ps -ef |grep murder_client|grep seed |grep -v $0|grep -v grep |grep -v sh|awk '{print $2}'`
}start(){#make torrentpython $murder_make_torrent_bin  $deploy_file  $tracker_ip   $torrent_file#echo $?if [ $? != 0 ];then python $muder_make_torrent_bin $deploy_file  $tracker_ip   $torrent_filefifind_seed_process#echo $PIDif [ "$PID" != "" ]; thenprintf  "$name is already running...\n"elsepython $murder_seeder_bin seed $torrent_file $deploy_file $local_ip >/dev/null 2>&1 &printf  "starting $name done....\n"fi
}stop(){find_seed_processif [ $PID != "" ];thenkill $PIDprintf "stoping $name done...\n"elseprintf "$name is already stopping...\n"fi
}restart(){stopsleep 2start
}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 hostscopy: src={{ item }}   dest=/with_items:- murder-master.tar.gz- "{{ update_version }}.torrent"- peer_download.sh
- name: tar -zxf murder-master.tar.gzcommand: tar -zxf murder-master.tar.gz
- name: download update use murder_clientshell: 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 指定角色 )

为N台linux服务器传输大文件相关推荐

  1. 关于解决多台linux服务器间的文件实时同步问题

    关于解决多台linux服务器间的文件实时同步问题 参考文章: (1)关于解决多台linux服务器间的文件实时同步问题 (2)https://www.cnblogs.com/fps2tao/p/1003 ...

  2. 如何快速在两台电脑之间传输大文件

    两台电脑如何传文件最快方法.我们在使用电脑的时候,有的情况下需要我们队两台电脑之间互相的传输大文件.那么我们应该通过什么样的方法传输最快速呢?我们一起来看看吧. 首先我们需要一根平时上网连接网络时用的 ...

  3. 如何快速在两台电脑之间传输大文件?

    两台电脑之间的文件传输,大家比较常用的有通过QQ.微信.飞鸽传书等.但是此类软件传输有一个局限的问题,就是文件的大小限制,一旦超出范围后将无法进行传输.那么,如果使用移动硬盘来进行传输呢?数据的拷贝时 ...

  4. 服务器传输大文件方法

    最近需要与服务器及进行文件传输,尝试了一些方法. 1.对于小文件(1G以内)可以使用sz.rz命令使用item完成传输. 2.但当文件较大时,使用sz.rz命令会出现传输中断的问题,因此需要使用其他方 ...

  5. 2台电脑一根网线传文件_「教程」如何快速的在两台电脑间传输大文件?

    两台电脑如何传输文件 我们常见的就是使用U盘或者网盘进行传输 但是速度非常的慢 我们需要一种文件可以直接复制到另一台设备的方法 首先准备一根网线 然后将两台电脑连接到同一局域网内 在右下角的小电脑打开 ...

  6. 在两台 ubuntu 之间传输大文件

    方法1: scp -c aes128-gcm@openssh.com a.tar.gz usrname@ip:dir 加上 -c aes128-gcm@openssh.com,可以加速. 方法2: r ...

  7. 向windows服务器传输大文件时提示未知错误解决方法

    1.打开远程登录的对话窗口,选择选项按钮,点击本地资源,在本地资源和设备这一项上点击详细信息 2.展开驱动器,勾选需要传输文件所在的磁盘,也可全部勾选 3.再远程登录至服务器,在"我的电脑& ...

  8. c 服务器传输大文件,cend.me:不须经过服务器,直接点对点的文件传输免费服务...

    要传送文件给远程的手机.平板.电脑等设备,通常的做法就是先将文件上传到服务器存放,然后再从服务器下载,这样的做法看似合理,但如果上传的同时就由远程的设备来接收,不要经过服务器,这样就能更节省上.下载的 ...

  9. 【电脑技能】无联网无U盘两台电脑之间传输大文件

    参考:https://www.bilibili.com/video/av69478967 方法一:两台电脑连接局域网 1.两台电脑用网线连接到同一局域网下. 2.右击右下角网络连接图标:打开网络和In ...

  10. linux 传送大文件,使用Transfer.sh在Linux上的终端中传输大文件 | MOS86

    想知道如何通过互联网从Linux终端传输大文件是什么样子?与转移.你可以很容易地 Let然而,找到一条主流的文件共享服务是这样的路线很少见. So,你如何在Linux上使用这个工具?在本指南中阅读并了 ...

最新文章

  1. 指导你成为C++编程高手的魔幻之书——写给大家看的C++书
  2. 打造属于自己的图文符号库
  3. Coursera课程Python for everyone:chapter10
  4. android 通知显示时间,android:在特定时间显示通知?
  5. Error creating bean with name ‘org.springframework.security.oauth2.config.annotation.web.configurati
  6. 【Linux】一步一步学Linux——stat命令(77)
  7. android Eclipse导入com.android.internal.R和layoutlib.jar报错解决方案
  8. android 图片存sd卡上,android打开,保存图片到sd卡,显示图片
  9. Typescript前端接口联调自动化的探究与实践
  10. 农历php,PHP农历公历转换
  11. linux系统怎么设置开机密码,Linux_Linux系统怎么设置开机密码?Linux设置开机密码的方法,为了保证Linux系统的安全,应 - phpStudy...
  12. Bootstrap CSS 编程规范之语法规范
  13. unicode编码表_关于编码
  14. 读书笔记_量化交易如何建立自己的算法交易02
  15. linux 空信息,为什么recv()函数收到空消息?
  16. 第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(昆明)(热身赛)
  17. 游戏角色命名与游戏风格
  18. 苹果如何安装ipa(亲测有用,无需越狱)
  19. wordpress 调整段落间距和字体大小
  20. 多相机BEV感知表达

热门文章

  1. 华擎主板设置来电开机_华擎bios修改开机画面 BIOS界面焕然一新 - 电脑常识 - 服务器之家...
  2. [转载]浙江杭西高2011年5月高二地理(徐霞客游记TV版-
  3. PMP复习整理考点篇【3】--- 风险应对策略
  4. 对象存储(OSD)及架构原理
  5. 托福、雅思、托业有什么区别?
  6. Please make sure that the app id is set correctly.
  7. 软件测试学习之悟空CRM项目测试
  8. 洛谷1260 工程规划
  9. jdbc常见异常及错误解决办法汇总
  10. 知名大企业的愿景和使命