阿里雲服務器自動化運維小試

想運行一個比較大的任務,須要很強的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 腳本完作這件事。
相關文章
相關標籤/搜索