阿里云服务器自动化运维小试

想运行一个比较大的任务,须要很强的CPU和内存,本身老笔记本跑不动。在阿里云上租一个Ubuntu服务器,可是但愿任务结束后服务器实例自动删除,要不半夜时分任务跑完了,次日早上再回收...... 心疼 :)html

作了些尝试,初步达成目的,记录以下,有些踩过的坑供借鉴。docker

环境

  • 管理服务器:已经有了一个云服务器(Ubuntu),1 CPU 2G RAM 免费半年的那种,根本不能跑个人任务,可是能够用作控制台。我下面的操做都是在这台机器上发出的。
  • 工做服务器:真正干活的云服务器(4核CPU, 16G RAM, 80G HD) 是手工申请的。应该能够自动申请(aliyuncli ecs CreateInstance),但这不是个人需求重点,我关心的是自动stop, delete. 之后也许有机会把建立也自动化。
  • OSS 网盘: 90+G 的数据存在 OSS上,须要从工做服务器上读取,处理后的结果也会保存在这里,由于工做服务器会被销毁。

步骤

  1. 在管理服务器上安装 Aliyun 命令行工具 和 SDK。基本安装比较简单,按照文档作就能够,可是特别注意,在Ubuntu下最后要手工把安装包copy到系统位置,不然aliyuncli 找不到可用命令。这是我折腾几个小时,提交工单后获得答案
  2. 在管理服务器上安装,测试 ossfs。目的是把oss 上的大文件mount 成为工做服务器上的某个目录。
    1. ossfs 挂载命令是 ossfs bucket_name /mnt_point -ourl=http://oss_region.
    2. 这里要注意url,我开始老是mount不上, 第一不能包括bucket name; 第二,对于在VPC中的云服务器,url 须要特殊写法,好比vpc100-oss-cn-hangzhou.aliyuncs.com,内网的url 是不通的,外网的也不稳定。详细的region 列表在这里
    3. 另外,我遇到过屡次ossfs 命令 hang在那里不返回,其实开另一个ssh窗口发现命令已经成功,能够访问挂载的内容,但ossfs 就是不返回。能够在ossfs 命令最后加上 -f -d 看调试输出。
    4. 由于个人oss有很大空间,我试过 ossfs 一个bucket 到 /tmp。可是一旦这么作,在/tmp作一点操做就会hang住,gunzip, df -h, lsof, 甚至ls /tmp 都不行,说明oss 不适合频繁密集读写。(想挂载/tmp 由于gunzip 会占用大量 /tmp空间,直到把系统盘40G撑满了,这个时候du 查不到,df -h 发现空间没了,lsof |grep deleted 发现都在 /tmp 下面,没有释放)。 
  3. 最后使用了两个 shell 脚本完成了任务。第一个脚本总控(provision 工做服务器,最后kill it),第二个脚本发送到工做服务器,在上面运行作那个费力的任务。
    1. 控制脚本。
    2. 整个脚本只须要输入一次远程服务器密码,scp 的几个文件是给ossfs 用的
# local shell
export ESC_ID=i-xxxxxxxxx
export set ESC_NAME=ali_ecs

cat /root/.ssh/id_rsa.pub | ssh root@$ESC_NAME 'mkdir -p .ssh; cat >> .ssh/authorized_keys'
# config for osscmd
# scp /root/.osscredentials root@$ESC_NAME:/root
# config for ossfs
scp /etc/passwd-ossfs root@$ESC_NAME:/etc

# worker shell
scp /root/remoteAction.sh root@$ESC_NAME:/root echo $(hostname) echo ------------------------- ssh root@$ESC_NAME 'chmod +x /root/remoteAction.sh; /root/remoteAction.sh' echo ------------------------- aliyuncli ecs StopInstance --InstanceId $ESC_ID sleep 30 aliyuncli ecs DeleteInstance --InstanceId $ESC_ID sleep 10 aliyuncli ecs DescribeInstanceAttribute --InstanceId $ESC_ID

 

worker shell. remoteAction.shshell

apt-get update
cd /root

# ---------------------
# install osscmd
# wget -O osscmd.zip https://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/internal/oss/0.0.4/assets/sdk/OSS_Python_API_20160419.zip?spm=5176.doc32171.2.2.cRTWFj&file=OSS_Python_API_20160419.zip
# apt-get -y install unzip
# unzip osscmd.zip
# rm *.zip


# ---------------------
# install ossfs
wget -O ossfs.deb http://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/assets/attach/32196/cn_zh/1481699531936/ossfs_1.80.0_ubuntu14.04_amd64.deb?spm=5176.doc32196.2.1.kxKrKX&file=ossfs_1.80.0_ubuntu14.04_amd64.deb

# -y assume yes
apt-get -y install gdebi-core

# -n --non-interactive
gdebi -n ossfs.deb

mkdir /mnt/gene
ossfs bob-backup /mnt/gene -ourl=http://vpc100-oss-cn-beijing.aliyuncs.com

# ---------------------
# run my big job # 命令行中 - 做为参数占位符。好比下面的命令 b.sh 要读2个参数,第二个参数 用- 代替,表示内容是 a.sh 的标准输出。
./a.sh r1.csv r2.csv \
| ./b.sh ref.csv - 2> out.log \
| ./c.sh convert - > out.dat;

总结

除了以上步骤,还有其余的自动化的方法值得尝试:ubuntu

  • docker machine + ESC driver. 一旦作好镜像, commit以后就不用每次安装ossfs了,虽然安装也很快。可是在现有的云服务器上运行 curl下载docker machine 总超时,懒得折腾,先放下了。
  • Airflow, celery worker。 若是任务很是复杂,值得去尝试。
  • 我只有一台机器要管理,ansible 给适合多任意多台机器重复管理步骤,因此就没用。之后也许能够写playbook 代替shell 脚本完作这件事。
相关文章
相关标签/搜索