やれ仮想化だ、
Jujuとは
「Juju」
Ubuntuにはもともと強力なパッケージ管理システムであるAPTが存在します。APTシステムを使えば多種多様なソフトウェアの依存関係の解決やインストール、
たとえば、
このような従来
Chefとの違い
サービス構築の自動化という意味では、
よってUbuntu上でどちらを使うかは、
- Jujuは構成スクリプトをBashやPythonなど好きな言語を使って記述できる
- Jujuは構築の中でも、
サービス間の動的な 「Relation」 や 「Scale」 の設定の自動化に注力している - Chefが数多くのプラットフォームに対応しているのに対して、
JujuはUbuntuしかサポートしていない
もちろんJujuとChefを共存させることも可能です。Ubuntuインスタンスの生成とChefを動かすためのセットアップまでをJujuで、
Charm(構築手順書)を共有する
サービス構築にあたっての手順書を、
これらの構築手順書は、
そこでCanonicalでは
インストール方法
以前、
Jujuを使ううえで最低限必要なのは、
クライアントにはJujuを使うためのコマンド群をインストールします。明示的にJujuをインストールする必要があるのはこのクライアントだけです。
サーバとして使うマシンは物理マシンでも仮想マシンでもかまいません。仮想マシンは各種クラウドサービスを利用できますし、
もしまだ持っていないようなら、
$ ssh-keygen -t rsa -b 2048
この鍵は、
次にJujuをクライアントにインストールします。Jujuは頻繁にリリースされており、
$ sudo add-apt-repository ppa:juju/stable $ sudo apt-get update && sudo apt-get install juju-core
最後にJujuの設定ディレクトリと設定テンプレートを生成しておきましょう。次のコマンドは
$ juju init
これでJujuのインストールは完了です。
はじめてのデプロイ
Jujuは
ここでデプロイ先にAmazon EC2を使うのはそれが一番お手軽だからです。Jujuはサービスをデプロイするとき、
Amazon EC2であればとりあえずアカウント
デプロイ先の設定を行う
デプロイ先は
## https://juju.ubuntu.com/get-started/amazon/
amazon:
type: ec2
admin-secret: (ここは変更せず)
# globally unique S3 bucket name
control-bucket: (ここは変更せず)
# override if your workstation is running a different series to which you are deploying
# default-series: precise
# region defaults to us-east-1, override if required
region: ap-northeast-1
# Usually set via the env variable AWS_ACCESS_KEY_ID, but can be specified here
access-key: (Access Key IDを入力)
# Usually set via the env variable AWS_SECRET_ACCESS_KEY, but can be specified here
secret-key: (Secret Keyを入力)
access-keyとsecret-keyには、
regionはインスタンスを生成するリージョンです。東京リージョンだと
2行目の
オプションを指定しないときに使われる環境はswitchコマンドで確認・
$ juju switch (標準で使われる環境のラベル名が表示される) $ juju switch amazon (標準の環境を“amazon”に変更する)
bootstrapノードをデプロイする
Jujuの管理サービスであるbootstrapノードをデプロイしましょう。Jujuでこれから操作するサービスは、
$ juju bootstrap
ちなみにbootstrapノードさえ立ち上がれば、
今回の設定ではAmazon EC2を使うことになっているので、
bootstrapノードが立ち上がるまで、
$ juju status environment: amazon machines: "0": agent-state: started agent-version: 1.13.2 dns-name: ec2-54-248-35-144.ap-northeast-1.compute.amazonaws.com instance-id: i-b48a7ab1 instance-state: running series: precise hardware: arch=amd64 cpu-cores=1 cpu-power=100 mem=1740M root-disk=8192M services: {}
machinesには各インスタンスが表示されます。今のところbootstrapノードだけなので、
WordPressに必要な各種サービスをデプロイし公開する
ここまできて、
- WordPressをデプロイする
- MySQLをデプロイする
- WordPressとMySQLを紐付ける
- WordPressサービスを公開する
ここは単純に4つのコマンドを実行するだけです。
$ juju deploy wordpress $ juju deploy mysql $ juju add-relation wordpress mysql $ juju expose wordpress
deployコマンドは新規にインスタンスを生成し、
これだけで、
$ watch juju status
bootstrapと同様に各インスタンスのデプロイ完了までは少し時間がかかります。deployコマンド直後にstatusを実行してもまだ準備はできていないかもしれません
最終的に
environment: amazon
machines:
"0":
agent-state: started
agent-version: 1.13.2
dns-name: ec2-54-248-35-144.ap-northeast-1.compute.amazonaws.com
instance-id: i-b48a7ab1
instance-state: running
series: precise
hardware: arch=amd64 cpu-cores=1 cpu-power=100 mem=1740M root-disk=8192M
"1":
agent-state: started
agent-version: 1.13.2
dns-name: ec2-54-238-44-109.ap-northeast-1.compute.amazonaws.com
instance-id: i-fa8a7aff
instance-state: running
series: precise
hardware: arch=amd64 cpu-cores=1 cpu-power=100 mem=1740M root-disk=8192M
"2":
agent-state: started
agent-version: 1.13.2
dns-name: ec2-54-248-147-25.ap-northeast-1.compute.amazonaws.com
instance-id: i-f88a7afd
instance-state: running
series: precise
hardware: arch=amd64 cpu-cores=1 cpu-power=100 mem=1740M root-disk=8192M
services:
mysql:
charm: cs:precise/mysql-27
exposed: false
relations:
cluster:
- mysql
db:
- wordpress
units:
mysql/0:
agent-state: started
agent-version: 1.13.2
machine: "2"
public-address: ec2-54-248-147-25.ap-northeast-1.compute.amazonaws.com
wordpress:
charm: cs:precise/wordpress-16
exposed: true
relations:
db:
- mysql
loadbalancer:
- wordpress
units:
wordpress/0:
agent-state: started
agent-version: 1.13.2
machine: "1"
open-ports:
- 80/tcp
public-address: ec2-54-238-44-109.ap-northeast-1.compute.amazonaws.com
まずはmachinesのところから。今回はbootstrapに加えて、
さらに今回はservicesの項目が増えています。こちらはサービス名ごとに関係や使われたCharmなどがリストアップされています。
さらにwordpressについてはopen-portsに開放したポート番号として80/
wordpressサービスにはpublic-addressとしてインスタンスのアドレスが表示されています。そこへWebブラウザでアクセスすれば、
サービスの設定変更
ここまでの作業で無事、
スケールアウトする
まかり間違って
$ juju add-unit -n2 wordpress
add-unitは指定したサービスを提供するインスタンスを増やすコマンドです。-nオプションに増やしたいインスタンスの数を指定します。少し待ってからstatusコマンドでmachinesのインスタンスの数とwordpressサービスのunitsの数を確認してみましょう。どちらも2つずつ増えているはずです。
さらに追加したインスタンスのpublic-addressにアクセスしてみてください。どちらのインスタンスもデータベースは同じmysqlサービスにつながっているので、
リバースプロキシを追加する
これだけだとWordPressサーバが3つになっただけなので、
$ juju deploy haproxy $ juju add-relation haproxy wordpress $ juju expose haproxy
HAProxyは外部に公開するサービスなので、
インスタンスタイプを指定する
単純にdeployコマンドを実行した場合、
現在のインスタンスの設定値はstatusコマンドで確認できます。たとえばmysqlサービスで使われているインスタンスの設定値を見てみましょう。
$ juju status mysql environment: amazon machines: "2": (中略) hardware: arch=amd64 cpu-cores=1 cpu-power=100 mem=1740M root-disk=8192M
このようにm1.
deploy時にCPUコアの数を4に、
$ juju deploy --constraints "cpu-cores=8 mem=8G" mysql
スケールダウンする
比較的アクセスが落ち着いてきて、
手順としてはまずdestroy-unitでunitを削除してから、
$ juju destroy-unit wordpress/1 $ juju destroy-unit wordpress/2 $ juju destroy-machine 3 $ juju destroy-machine 4
これでインスタンスの数はスケールアウトする前の状態に戻っているはずです。最初のうちはAmazon EC2のコンソールから実際にインスタンスがterminatedになっているかどうかも確認しておくと良いでしょう。
デプロイするインスタンスを指定する
これまでdeployコマンドを実行する度にEC2のインスタンスが生成されてきました。しかしサービスの種類によってはわざわざインスタンスを分ける必要がないものも存在します。もし既に起動済みのインスタンスに別のサービスをデプロイしたいなら、
たとえばwordpressをマシン番号1にデプロイしたあと、
$ juju deploy --to 1 mysql
これにより、
サービスを削除する
個々のインスタンスではなくサービスそのものが不要になった場合は、
$ juju destroy-service wordpress $ juju destroy-service mysql $ juju destroy-service haproxy
インスタンス自体は削除されないので、
$ juju destroy-environment
これによりすべてのインスタンスが削除され、
うまく動かないときは
最後に、
verboseオプションを使用する
そもそもインスタンスが生成されない場合は、
debug-logコマンドを使用する
debug-logコマンドには、
juju statusを確認する
サービス構築中にエラーが発生した場合は、
$ juju status (中略) agent-state: error agent-state-info: 'hook failed: "config-changed"'
これを足がかりにJujuコマンドのオプションが間違っていないか、
ちなみにCharmの本体は~/.juju/
sshでインスタンスに接続する
Jujuで作ったインスタンスはあらかじめsshログインできるようになっています。インスタンスのホスト名に対して、
ちなみに、
マシン番号0にログインする場合: $ juju ssh 0 wordpress/1インスタンスにログインする場合: $ juju ssh wordpress/1
インスタンスの中身は普通のUbuntuなので、
問題が解決したら
何らかの方法で無事に問題が解決した場合、
$ juju resolved wordpress/1
これにより、
まとめ
Jujuを使えばクラウド時代のUbuntu Serverの構築を、
もちろん、