peiyuan1030 发表于 2018-7-29 12:24:43

ansible 使用bt协议分发大文件

  python源代码
  http://www.361way.com/python-p2p/4737.html
  ansible 使用bt协议分发大文件
  http://john88wang.blog.51cto.com/2165294/1793080
  # ansible 172.168.2.171-m service -a "name=murder-tracker state=started"
  # ansible 172.168.2.179-m service -a "name=murder-seeder state=started"
  # ansible 172.168.2.179-m synchronize -a "mode=pull src=/opt/software/download/deploy.torrent dest=/opt/software/download"
  # ansible all-m synchronize -a "src=/opt/software/download/deploy.torrent dest=/opt/software/download"
  # ansible all-m shell -a "sh /opt/app/murder/dist/peer_download.sh"
  /etc/init.d/murder-tracker
  /etc/init.d/murder-seeder
  trackerseeder peers172.168.2.171
  手动
  python /opt/app/murder/dist/murder_make_torrent.py deploy.tar.gz 172.168.2.171:8998 deploy.torrent
  python /opt/app/murder/dist/murder_client.py seeddeploy.torrent deploy.tar.gz 172.168.2.171
  python /opt/app/murder/dist/murder_client.py peerdeploy.torrent deploy.tar.gz 客户ip
  单台机器80M,8s
  ansible自动
  ansible -i hostsbt all -m shell -a "mkdir -p /opt/software/download"
  ansible -i hostsbt all -m copy -a "src=/opt/software/download/deploy.torrent dest=/opt/software/download/"
  ansible -i hostsbt all -m copy -a "src=/opt/app/murder dest=/opt/software/download/"
  (时间 5M 1min41s)
  ansible -i hostsbt all -m copy -a "src=/opt/software/download/peer_download.sh dest=/opt/software/download/"
  ansible -i hostsbt all-m shell -a "sh /opt/software/download/peer_download.sh"
  6台机器1m24.260s
  cat peer_download.sh
  #!/bin/bash
  #this file is used to download bt files
  torrent_file=/opt/software/download/deploy.torrent
  download_file=/opt/software/download/deploy.tar.gz
  #local_ip=$(hostname -I|awk '{print $1}')
  local_ip='172.168.2.171'
  #murder_client_bin=/opt/software/download/murder_client.py
  murder_client_bin=/opt/software/download/murder/dist/murder_client.py
  python$murder_client_bin peer $torrent_file $download_file $local_ip
  多台
  tracker172.168.2.171
  seeder   172.168.2.179
  peers    172.168.2.180~200
  1.在tracker服务器上启动tracker
  ansible 172.168.2.171-m service -a "name=murder-tracker state=started"
  2.注意数据目录/opt/data/murder
  将需要的分发的文件打包成deploy.tar.gz
  在seeder服务器上制作torrent文件并启动seeder
  手动:python /opt/app/murder/dist/murder_make_torrent.py deploy.tar.gz 172.168.2.171:8998 deploy.torrent
  自动:/etc/init.d/murder-seeder restart
  启动脚本依赖一个配置文件seeder.conf
  # cat /opt/app/murder/dist/seeder.conf (注意不能注释,切记)
  deploy_file=/opt/data/murder/deploy.tar.gz
  torrent_file=/opt/data/murder/deploy.torrent
  tracker_ip=172.168.2.171:8998
  local_ip=172.168.2.179
  3.从seeder获取种子文件,然后分发到peers
  4.在各个peers端执行下载任务
  ansible all-m shell -a "sh /opt/app/murder/dist/peer_download.sh"
  peer_download.sh
  #!/bin/bash
  #this file is used to download bt files
  torrent_file=/opt/software/download/deploy.torrent
  download_file=/opt/software/download/deploy.tar.gz
  local_ip=$(hostname -I|awk '{print $1}')
  murder_client_bin=/opt/app/murder/dist/murder_client.py
  python$murder_client_bin peer $torrent_file $download_file $local_ip
  时间 对比发一个374M的文件
  bt
  + intr=85
  + echo 85/60
  + bc
  直接copy
  + intr=137
  + echo 137/60
  + bc
  cat test.sh
  D1=`date +"%Y-%m-%d %H:%M:%S"`
  D2=`date +%s -d "$D1"`
  cd /etc/ansible
  ansible -i hostsbt all -m copy -a "src=/opt/software/download/deploy.tar.gz dest=/opt/software/download/deploy.tar.gz"
  D3=`date +"%Y-%m-%d %H:%M:%S"`
  D4=`date +%s -d "$D3"`
  intr=`expr $D4 - $D2`
  echo ${intr}/60 | bc
  cat murder-tracker
  #! /bin/sh
  #
  # Start/Stop murder-tracker
  #
  # chkconfig: 345 99 99
  # description: murder-tracker
  # processname: murder-tracker
  if [ -f /etc/rc.d/init.d/functions ]; then
  . /etc/rc.d/init.d/functions
  fi
  name="murder-tracker"
  murder_tracker_bin="/opt/app/murder/dist/murder_tracker.py"
  murder_tracker_log="/opt/logs/murder/murder_tracker.log"
  murder_tracker_data="/opt/data/murder/tracker_data"
  murder_user=murder
  find_tracker_process () {
  PID=`ps -ef | grep murder_tracker | grep python |grep -v $0|grep -v grep|grep -v sh|grep -v root| awk '{ print $2 }'`
  }
  start () {
  getent passwd $murder_user>/dev/null || useradd -r-s /sbin/nologin $murder_user
  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"
  mkdir -p $LOG_DIR
  fi
  if [ ! -d $DATA_DIR ]; then
  echo -e"\e[35mLog dir ${DATA_DIR} doesn't exist. Creating\e[0m"
  mkdir -p $DATA_DIR
  fi
  chown -R $murder_user:$murder_user $DATA_DIR$LOG_DIR
  find_tracker_process
  if [ "$PID" != "" ]; then
  echo -e"\e[35m$name is already running!\e[0m"
  else
  daemon --user $murder_usernohuppython $murder_tracker_bin> /dev/null 2>&1 &
  echo -e "\e[35mStarting $name Done\e[0m"
  fi
  }
  stop () {
  find_tracker_process
  if [ "$PID" != "" ]; then
  echo -e "\e[35mStopping $name\e[0m"
  kill $PID
  else
  echo -e "\e[35m$name is not running yet\e[0m"
  fi
  }
  case $1 in
  start)
  start
  ;;
  stop)
  stop
  exit 0
  ;;
  reload)
  stop
  sleep 2
  start
  ;;
  restart)
  stop
  sleep 2
  start
  ;;
  status)
  find_tracker_process
  if [ "$PID" != "" ]; then
  echo -e "\e[35m$name is running: $PID\e[0m"
  exit 0
  else
  echo -e "\e[35m$name is not running\e[0m"
  exit 1
  fi
  ;;
  *)
  echo -e "\e[35mUsage: $0 {start|stop|restart|reload|status|configtest}\e[0m"
  RETVAL=1
  esac
  exit 0
  cat murder-seeder
  #! /bin/sh
  #
  # Start/Stop murder-seeder
  #
  # chkconfig: 345 98 98
  # description: murder-seeder
  # processname: murder-seeder
  if [ -f /etc/rc.d/init.d/functions ]; then
  . /etc/rc.d/init.d/functions
  fi
  name="murder-seeder"
  murder_seeder_data="/opt/data/murder/tracker_data"
  murder_seeder_log="/opt/logs/murder/murder_seeder.log"
  murder_seeder_bin="/opt/app/murder/dist/murder_client.py"
  murder_make_torrent_bin="/opt/app/murder/dist/murder_make_torrent.py"
  murder_seeder_conf="/opt/app/murder/dist/seeder.conf"
  deploy_file=$(awk -F= '/deploy_file/{print $2}' /opt/app/murder/dist/seeder.conf)
  torrent_file=$(awk -F= '/torrent_file/{print $2}' /opt/app/murder/dist/seeder.conf)
  tracker_ip=$(awk -F= '/tracker_ip/{print $2}' /opt/app/murder/dist/seeder.conf)
  local_ip=$(awk -F= '/local_ip/{print $2}' /opt/app/murder/dist/seeder.conf)
  murder_user=murder
  find_seeder_process () {
  PID=`ps -ef | grep murder_client|grep seed | grep python |grep -v $0|grep -v grep| awk '{ print $2 }'`
  #PID=`ps -ef | grep murder_client|grep seed | grep python |grep -v $0|grep -v grep|grep -v sh|grep -v root| awk '{ print $2 }'`
  }
  start () {
  getent passwd $murder_user>/dev/null || useradd -r-s /sbin/nologin $murder_user
  LOG_DIR=`dirname ${murder_seeder_log}`
  DATA_DIR=${murder_seeder_data}
  if [ ! -d $LOG_DIR ]; then
  echo -e"\e[35mLog dir ${LOG_DIR} doesn't exist. Creating\e[0m"
  mkdir -p $LOG_DIR
  fi
  if [ ! -d $DATA_DIR ]; then
  echo -e"\e[35mLog dir ${DATA_DIR} doesn't exist. Creating\e[0m"
  mkdir -p $DATA_DIR
  fi
  ####### make torrent
  python $murder_make_torrent_bin $deploy_file $tracker_ip $torrent_file
  #######
  chown -R $murder_user:$murder_user $DATA_DIR$LOG_DIR
  find_seeder_process
  if [ "$PID" != "" ]; then
  echo -e"\e[35m$name is already running!\e[0m"
  else
  nohuppython $murder_seeder_binseed$torrent_file $deploy_file $local_ip   > $murder_seeder_log 2>&1 &
  #daemon --user $murder_usernohuppython $murder_seeder_binseed$torrent_file $deploy_file $local_ip   > $murder_seeder_log 2>&1 &
  echo -e "\e[35mStarting $name Done\e[0m"
  fi
  }
  stop () {
  find_seeder_process
  if [ "$PID" != "" ]; then
  echo -e "\e[35mStopping $name\e[0m"
  kill $PID
  else
  echo -e "\e[35m$name is not running yet\e[0m"
  fi
  }
  case $1 in
  start)
  start
  ;;
  stop)
  stop
  exit 0
  ;;
  reload)
  stop
  sleep 2
  start
  ;;
  restart)
  stop
  sleep 2
  start
  ;;
  status)
  find_seeder_process
  if [ "$PID" != "" ]; then
  echo -e "\e[35m$name is running: $PID\e[0m"
  exit 0
  else
  echo -e "\e[35m$name is not running\e[0m"
  exit 1
  fi
  ;;
  *)
  echo -e "\e[35mUsage: $0 {start|stop|restart|reload|status|configtest}\e[0m"
  RETVAL=1
  esac
  exit 0
  可以将这些步骤写成Ansible playbooks
  1.copy部分
  copy种子文件,脚本文件
  2.shell命令
页: [1]
查看完整版本: ansible 使用bt协议分发大文件