阿里云服务器自动化运维小试
Posted bob.dong
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了阿里云服务器自动化运维小试相关的知识,希望对你有一定的参考价值。
想运行一个比较大的任务,需要很强的CPU和内存,自己老笔记本跑不动。在阿里云上租一个Ubuntu服务器,但是希望任务结束后服务器实例自动删除,要不半夜时分任务跑完了,第二天早上再回收...... 心疼 :)
做了些尝试,初步达成目的,记录如下,有些踩过的坑供借鉴。
环境
- 管理服务器:已经有了一个云服务器(Ubuntu),1 CPU 2G RAM 免费半年的那种,根本不能跑我的任务,但是可以用做控制台。我下面的操作都是在这台机器上发出的。
- 工作服务器:真正干活的云服务器(4核CPU, 16G RAM, 80G HD) 是手工申请的。应该可以自动申请(aliyuncli ecs CreateInstance),但这不是我的需求重点,我关心的是自动stop, delete. 以后也许有机会把创建也自动化。
- OSS 网盘: 90+G 的数据存在 OSS上,需要从工作服务器上读取,处理后的结果也会保存在这里,因为工作服务器会被销毁。
步骤
- 在管理服务器上安装 Aliyun 命令行工具 和 SDK。基本安装比较简单,按照文档做就可以,但是特别注意,在Ubuntu下最后要手工把安装包copy到系统位置,否则aliyuncli 找不到可用命令。这是我折腾几个小时,提交工单后得到答案。 在管理服务器上安装,测试 ossfs。目的是把oss 上的大文件mount 成为工作服务器上的某个目录。
- ossfs 挂载命令是 ossfs bucket_name /mnt_point -ourl=http://oss_region.
- 这里要注意url,我开始总是mount不上, 第一不能包括bucket name; 第二,对于在VPC中的云服务器,url 需要特殊写法,比如vpc100-oss-cn-hangzhou.aliyuncs.com,内网的url 是不通的,外网的也不稳定。详细的region 列表在这里。
- 另外,我遇到过多次ossfs 命令 hang在那里不返回,其实开另外一个ssh窗口发现命令已经成功,可以访问挂载的内容,但ossfs 就是不返回。可以在ossfs 命令最后加上 -f -d 看调试输出。
- 因为我的oss有很大空间,我试过 ossfs 一个bucket 到 /tmp。但是一旦这么做,在/tmp做一点操作就会hang住,gunzip, df -h, lsof, 甚至ls /tmp 都不行,说明oss 不适合频繁密集读写。(想挂载/tmp 因为gunzip 会占用大量 /tmp空间,直到把系统盘40G撑满了,这个时候du 查不到,df -h 发现空间没了,lsof |grep deleted 发现都在 /tmp 下面,没有释放)。
- 最后使用了两个 shell 脚本完成了任务。第一个脚本总控(provision 工作服务器,最后kill it),第二个脚本发送到工作服务器,在上面运行做那个费力的任务。
- 控制脚本。
- 整个脚本只需要输入一次远程服务器密码,scp 的几个文件是给ossfs 用的
# local shell export ESC_ID=i-xxxxxxxxx export set ESC_NAME=ali_ecs cat /root/.ssh/id_rsa.pub | ssh [email protected]$ESC_NAME ‘mkdir -p .ssh; cat >> .ssh/authorized_keys‘
# config for osscmd
# scp /root/.osscredentials [email protected]$ESC_NAME:/root
# config for ossfs
scp /etc/passwd-ossfs [email protected]$ESC_NAME:/etc
# worker shell
scp /root/remoteAction.sh [email protected]$ESC_NAME:/root echo $(hostname) echo ------------------------- ssh [email protected]$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.sh
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 cd /mnt/gene/bwa sleep 1000 #my big job :)
总结
除了以上步骤,还有其他的自动化的方法值得尝试:
- docker machine + ESC driver. 一旦做好镜像, commit之后就不用每次安装ossfs了,虽然安装也很快。但是在现有的云服务器上运行 curl下载docker machine 总超时,懒得折腾,先放下了。
- Airflow, celery worker。 如果任务非常复杂,值得去尝试。
- 我只有一台机器要管理,ansible 给适合多任意多台机器重复管理步骤,所以就没用。以后也许可以写playbook 代替shell 脚本完做这件事。
以上是关于阿里云服务器自动化运维小试的主要内容,如果未能解决你的问题,请参考以下文章
为数以亿计用户提供快速稳定的服务,阿里集群自动化运维如何做到的!
数云运维总监陈延宗:基于阿里云计算巢,数云CRM一键云上交付
开发攻城狮产品经理和运维小哥哥幸福生活的开始之阿里云效DevOps