欢迎光临
我们一直在努力

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

通过阿里云命令行 自动化管理服务器生命周期

想运行一个比较大的任务,需要很强的CPU和内存,自己老笔记本跑不动。在阿里云上租一个Ubuntu服务器,但是希望任务结束后服务器实例自动删除,要不半夜时分任务跑完了,第二天早上再回收...... 心疼 🙂

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

环境

  • 管理服务器:已经有了一个云服务器(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.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 # 命令行中 - 作为参数占位符。比如下面的命令 b.sh 要读2个参数,第二个参数 用- 代替,表示内容是 a.sh 的标准输出。
./a.sh r1.csv r2.csv \
| ./b.sh ref.csv - 2> out.log \
| ./c.sh convert - > out.dat;

总结

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

  • docker machine + ESC driver. 一旦做好镜像, commit之后就不用每次安装ossfs了,虽然安装也很快。但是在现有的云服务器上运行 curl下载docker machine 总超时,懒得折腾,先放下了。
  • Airflow, celery worker。 如果任务非常复杂,值得去尝试。
  • 我只有一台机器要管理,ansible 给适合多任意多台机器重复管理步骤,所以就没用。以后也许可以写playbook 代替shell 脚本完做这件事。
  • 海报
海报图正在生成中...
赞(0) 打赏
声明:
1、本博客不从事任何主机及服务器租赁业务,不参与任何交易,也绝非中介。博客内容仅记录博主个人感兴趣的服务器测评结果及一些服务器相关的优惠活动,信息均摘自网络或来自服务商主动提供;所以对本博客提及的内容不作直接、间接、法定、约定的保证,博客内容也不具备任何参考价值及引导作用,访问者需自行甄别。
2、访问本博客请务必遵守有关互联网的相关法律、规定与规则;不能利用本博客所提及的内容从事任何违法、违规操作;否则造成的一切后果由访问者自行承担。
3、未成年人及不能独立承担法律责任的个人及群体请勿访问本博客。
4、一旦您访问本博客,即表示您已经知晓并接受了以上声明通告。
文章名称:《阿里云服务器自动化运维小试》
文章链接:https://www.456zj.com/4501.html
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址