2013年8月5日 星期一

MiCloud CloudAPI CLI - Tag & User Script, 使用 User Script 建立 VM 環境

MiCloud CloudAPI繼承 Joyent CloudAPI而持續研發更多的功能,前面已經介紹如何入門使用 MiCloud CloudAPI

本篇在介紹以 CloudAPI 建置 Machine 的進階應用: 使用 CloudAPI 的 Tag 與 metadata 。

Machine的屬性


在 Machine 建立的當下,MiCloud 賦予 Machine 一些主機上的特殊屬性,讓使用者可以透過API的方式查詢,一般我們可以在 CLI 上查詢 Create Machine 的 help page 可以知道有哪些參數可以帶入:

# sdc-createmachine --help
sdc-createmachine [--account string] [--debug boolean] [--dataset string] [--help boolean] [--identity path] [--keyId string] [--metadata ] [--name string] [--package string] [--tag ] [--url url]


其中 tag 參數 metadata 參數是今天要介紹的重點...

關於Tag


tag 是一個以 key/value 存在的一組一組值,附屬在主機之下,在 CloudAPI 中可以透過下面方式對主機增加 tag (其中主機的 id 可以在 sdc-listmachines 中,每台主機的 id 欄位中找到):

# sdc-addmachinetags --tag servername=testtag01 [your machine id]
{
  "servername": "testtag01"
}


如果希望依次新增多個 tag,也可以這樣做:

# sdc-addmachinetags -t foo=bar -t servername=testtag01 b34f99ea-ef8d-4332-b043-9f4d49104833
{
  "servername": "testtag01",
  "foo": "bar"
}

然後可以透過 sdc-listmachinetags 來顯示主機的 tag 有哪些...

# sdc-listmachinetags [your machine id]
{
  "servername": "testtag01",
  "foo": "bar"
}


如果在 shell 中欲使用到 tag 中的某一個數值,可以這樣做
(PS:請先安裝json tool套件:npm install jsontool -g)

# sdc-listmachinetags b34f99ea-ef8d-4332-b043-9f4d49104833 | json foo
bar


對於一個管理者而言,tag 可以當做附加給這台主機的一些額外屬性,讓主機可以有更多的資訊可以作為日後自動化的參考值...

關於 Metadata / User Script


metadata 裡面主要存放與 tag 相同格式的 key/value 的參數值,而不同的是,當您設定 key=user-script 時候,將會有特殊的用途

主機將在 boot 時候,直接使用 shell 執行 user-script 裡面所帶的參數內容,此部份的設定是讓使用者可以自訂開通或開機時候的執行腳本,讓自動化部屬在每次開機時候完成...
如果主機一開始沒有設定任何 user-script 時候,使用 sdc-getmachinemetadata 會得到空的 json 物件

# sdc-getmachinemetadata b34f99ea-ef8d-4332-b043-9f4d49104833
{}


而,可以透過與 tag 相通的設定方式在主機上 attach 參數(唯一不一樣的是,它叫做sdc-updatemachinemetadata)


# sdc-updatemachinemetadata --metadata foo=bar b34f99ea-ef8d-4332-b043-9f4d49104833
{
  "foo": "bar"
}


查詢參數的方式是使用 sdc-getmachinemetadata 來查詢

# sdc-getmachinemetadata b34f99ea-ef8d-4332-b043-9f4d49104833
{
  "foo": "bar"
}


以上,設定與key的操作大同小異...

如果要機器聽話在開通或開機完成的時候自動執行您的腳本,直接在 metadata 指定key=user-script的屬性,並且帶入值為您欲執行的腳本即可:

# sdc-updatemachinemetadata --metadata "user-script"="echo HELLO > /root/user-script.log" b34f99ea-ef8d-4332-b043-9f4d49104833
{
  "foo": "bar",
  "user-script": "echo HELLO > /root/user-script.log"
}


設定完的 user-script 可以透過 sdc-getmachine 來看到設定的結果:

# sdc-getmachine b34f99ea-ef8d-4332-b043-9f4d49104833
{
  "id": "b34f99ea-ef8d-4332-b043-9f4d49104833",
  "name": "212ec88",
  "type": "smartmachine",
  "state": "running",
  "dataset": "local:robin:hadoop-node:0.1.0",
  "ips": [
    "211.78.254.144"
  ],
  "memory": 1024,
  "disk": 15360,
  "metadata": {
    "foo": "bar",
    "user-script": "echo HELLO > /root/user-script.log"
  },
  "created": "2013-03-23T14:50:21+00:00",
  "updated": "2013-06-07T04:29:29+00:00",
  "primaryIp": "211.78.254.144"
}

主機重新開機後,user-script 將會應用至該主機:

# sdc-rebootmachine b34f99ea-ef8d-4332-b043-9f4d49104833

# ssh root@211.78.254.144
Last login: Fri Jun  7 10:59:34 2013 from 211.78.254.110

[root@b34f99ea-ef8d-4332-b043-9f4d49104833 ~]# ls -l
總計 1
-rw-r--r-- 1 root root 6 6月   7 12:30 user-script.log
[root@b34f99ea-ef8d-4332-b043-9f4d49104833 ~]# cat user-script.log
HELLO


順道一提,當在撰寫 user-script 時候,script 的內容可以直接參考到其他的 metadata 屬性,例如:


sdc-updatemachinemetadata \
--metadata "user-script"="echo HELLO $USER > /root/user-script.log" \
--metadata USER=simon b34f99ea-ef8d-4332-b043-9f4d49104833

則重開機後,會發現 user-script.log 裡面會是:

# cat user-script.log
HELLO simonsu


另一種建立 user-script 的方式,是直接在 create machine 的參數中給予 script 參數,內容需要帶入一個腳本檔案,範例如下:

建立主機的指令:

# sdc-createmachine \
--dataset local:robin:hadoop-node:0.1.0 \
--package "S 1GB RAM (1CORE)" \
--script ./install.sh \
--tag servername=JoomlaServer01


其中 install.sh 內容如下

# cat install.sh
curl -k https://raw.github.com/micloud/installer/master/smartos-standard64/install-joomla.sh | sh

以上,給需要自動化部屬 Cloud Machine 的使用者參考