2013年9月18日 星期三

使用 Ubuntu Juju 中的 Local Provider (Linux Container) 心得

Ubuntu Juju 是一套 Canonical 設計給使用 Ubuntu 做為雲端平台的一套工具。

基本概念是輕鬆地使用一堆專家們精心寫好的 Juju Charms,無痛地將網路服務部署到使用 Ubuntu 的雲端平台上面。

Ubuntu Juju 目前支援的雲端平台有 Amazon Web Services (AWS), Microsoft Azure, HP Cloud, OpenStack, MAAS, Local,而 Ubuntu Juju 的工具本身可以在 Ubuntu, Mac OS X, Windows 上面安裝使用。

而 Ubuntu Juju 的 Local Provider 就是利用 Linux Container (LXC) 來在自己的主機上面架設使用 Ubuntu Juju,以下就是介紹 Local Provider 的設定方法。(窮人省錢的雲端解決方案)

首先當然要有一個 Ubuntu 12.04 以上的系統,然後先要加入 ppa:juju/stable 這個 PPA 然後更新索引:

$ sudo apt-add-repository ppa:juju/stable
$ sudo apt-get update

接下來安裝所需要的軟體套件。

如果是 Ubuntu 12.04 的話執行:

$ sudo apt-get install juju-local linux-image-generic-lts-raring linux-headers-generic-lts-raring

然後重新啟動系統來使用 linux-lts-raring 的 kernel

如果是其它比 Ubuntu 12.04 新的版本的話執行:

$ sudo apt-get install juju-local

然後檢查一下 MongoDB 有沒有支援 SSL (這點很重要,一定要支援 SSL 否則就無法使用):

$ mongod -h | grep ssl
  --sslOnNormalPorts      use ssl on configured ports
  --sslPEMKeyFile arg     PEM file for ssl
  --sslPEMKeyPassword arg PEM file password

還有要檢查一下 LXC 的 DHCP server 有沒有被執行起來 (這點也很重要,不然 LXC 的網路就無法正常運作):

$ ps aux | grep lxc-dnsmasq
dnsmasq       1640  0.0  0.0  26080   900 ?        S    10:13   0:00 dnsmasq -u lxc-dnsmasq --strict-order --bind-interfaces --pid-file=/var/run/lxc/dnsmasq.pid --conf-file= --listen-address 10.0.3.1 --dhcp-range 10.0.3.2,10.0.3.254 --dhcp-lease-max=253 --dhcp-no-override --except-interface=lo --interface=lxcbr0 --dhcp-leasefile=/var/lib/misc/dnsmasq.lxcbr0.leases --dhcp-authoritative
user    12013  0.0  0.0  13660   952 pts/2    S+   15:47   0:00 grep --color=auto lxc-dnsmasq

接下來就可以產生 Juju 的設定檔了:

$ juju init 
A boilerplate environment configuration file has been written to /home/user/.juju/environments.yaml.
Edit the file to configure your juju environment and run bootstrap.

然後修改一下 ~/.juju/environments.yaml 將 "default: amazon" 改成 "default: local",接下來就可以執行 `sudo juju bootstrap` 來產生 Local Provider 所需要的環境。

`sudo juju bootstrap` 所做的動作就是產生 ~/.juju/local-cert.pem 及 ~/.juju/local-private-key.pem 還有 /etc/init/juju-*.conf 的檔案來執行一個 MongoDB Server 給 Juju 使用。

接下來執行 Ubuntu Juju 的資料就會全部儲存在 ~/.juju/local/ 目錄底下了。

$ sudo tree .juju                                                                                                                                                                              
.juju
├── charmcache
│   ├── cs_3a_precise_2f_mysql-27.charm
│   └── cs_3a_precise_2f_wordpress-16.charm
├── environments.yaml
├── local
│   ├── agents
│   │   └── machine-0
│   │       └── agent.conf
│   ├── db
│   │   ├── admin.0
│   │   ├── admin.ns
│   │   ├── journal
│   │   │   ├── j._0
│   │   │   ├── lsn
│   │   │   ├── prealloc.1
│   │   │   └── prealloc.2
│   │   ├── juju.0
│   │   ├── juju.ns
│   │   ├── mongod.lock
│   │   ├── presence.0
│   │   ├── presence.ns
│   │   └── _tmp
│   ├── log
│   │   └── machine-0.log
│   ├── server.pem
│   ├── shared-storage
│   ├── storage
│   │   ├── bootstrap-verify
│   │   ├── provider-state
│   │   └── tools
│   │       ├── juju-1.14.0.1-precise-amd64.tgz
│   │       └── juju-1.14.0.1-raring-amd64.tgz
│   └── tools
│       └── 1.14.0.1-raring-amd64
│           ├── downloaded-url.txt
│           ├── FORCE-VERSION
│           └── jujud
├── local-cert.pem
└── local-private-key.pem

13 directories, 26 files

像是如果要架設一台 WordPress Blog Server 就只需要執行以下四行指令:

$ juju deploy wordpress
$ juju deploy mysql
$ juju add-relation wordpress mysql
$ juju expose wordpress

因為建構這些服務需要一些時間去網路上抓取資料回來安裝設定,所以馬上執行 `juju status` 會看到以下輸出,表示動作還沒有完成:

$ juju status
environment: local
machines:
  "0":
    agent-state: started
    agent-version: 1.14.0.1
    dns-name: 10.0.3.1
    instance-id: localhost
    series: raring
  "1":
    instance-id: pending
    series: precise
  "2":
    instance-id: pending
    series: precise
services:
  mysql:
    charm: cs:precise/mysql-27
    exposed: false
    relations:
      cluster:
      - mysql
      db:
      - wordpress
    units:
      mysql/0:
        agent-state: pending
        machine: "2"
  wordpress:
    charm: cs:precise/wordpress-16
    exposed: true
    relations:
      db:
      - mysql
      loadbalancer:
      - wordpress
    units:
      wordpress/0:
        agent-state: pending
        machine: "1"

過一會後再執行 `juju status` 就可以看到全部完成的結果了。

$ juju status                                                                                                                                                                     
environment: local
machines:
  "0":
    agent-state: started
    agent-version: 1.14.0.1
    dns-name: 10.0.3.1
    instance-id: localhost
    series: raring
  "1":
    agent-state: started
    agent-version: 1.14.0.1
    instance-id: user-local-machine-1
    instance-state: missing
    series: precise
  "2":
    agent-state: started
    agent-version: 1.14.0.1
    instance-id: user-local-machine-2
    instance-state: missing
    series: precise
services:
  mysql:
    charm: cs:precise/mysql-27
    exposed: false
    relations:
      cluster:
      - mysql
      db:
      - wordpress
    units:
      mysql/0:
        agent-state: started
        agent-version: 1.14.0.1
        machine: "2"
        public-address: 10.0.3.158
  wordpress:
    charm: cs:precise/wordpress-16
    exposed: true
    relations:
      db:
      - mysql
      loadbalancer:
      - wordpress
    units:
      wordpress/0:
        agent-state: started
        agent-version: 1.14.0.1
        machine: "1"
        open-ports:
        - 80/tcp
        public-address: 10.0.3.69

然後就可以連到 10.0.3.69 這個 IP 就可以開始使用 WordPress 了。 :-)

如果想要清掉這些服務,只要執行下面一行指令:

$ sudo juju destroy-environment
WARNING: this command will destroy the "local" environment (type: local)
This includes all machines, services, data and other resources.

Continue [y/N]? y

這樣就會將之前用 `sudo juju bootstrap` 產生的環境整個清除乾淨。

$ tree .juju
.juju
├── charmcache
│   ├── cs_3a_precise_2f_mysql-27.charm
│   └── cs_3a_precise_2f_wordpress-16.charm
├── environments.yaml
├── local-cert.pem
└── local-private-key.pem

1 directory, 5 files
張貼留言