All Your Bugs Are Belong To Ass

VZNopeというOpenVZ wrapperの紹介 (3)

前回のエントリはこちら

コンテナの設定手順書を出力してみる

前回までのエントリで、mysqldが稼働してるコンテナを作りました。ではこれをもう一つ作りましょう。

なになに、「もう一度同じ作業をするの?めんどくさい!」ですって?そうでしょうそうでしょうw

そんな時はvznfileを使うのが便利です。vznfileとは、chefのrecipeやansibleのplaybookのような存在で(もっと貧弱ですけど)、コンテナの設定手順書のようなものです。vznfileはtextで記述されていますので、人間が見ても分かりやすいと思います。また、行頭に# を配置することでコメントを書くこともできます。

さて、前回作成したばかりのコンテナについて、設定手順が記述されているvznfileを出力する方法があります。それがvzn vznfileコマンドです。文法は以下の通りです。

vzn vznfile [コンテナIDまたはコンテナ名]

vzn vznfileコマンドを実行すると、以下のような感じで、標準出力にだばーっとvznfileの中身が吐き出されます。

~$ vzn vznfile kangaroo_gold
create centos
set --nameserver 8.8.8.8
start
exec yum -y update
exec yum -y install mysql-server
exec service mysqld start
exec chkconfig mysqld on

見ていただければ何となくわかるかもしれませんが、基本的にはcreateからstartのくだり以外は「vzn execしてexit値が0だった物が記録されている」だけの代物です。そんなわけなので「vzn execはコンテナに変更を加える際に利用すべき」ということなのです。

ちょっと脱線しましたが、vzn vznfileで出力された結果を適当なファイルに保存します。

vzn vznfile kangaroo_gold > my_container.vznfile

拡張子は何でもいいのですが、便宜的に.vznfileとか.vznとかつけるといいんじゃないでしょうか。

vznfileを元にコンテナをセットアップする

vznfileを読み込んで新しいコンテナをセットアップするコマンドがvzn buildです。文法は以下の通り。

vzn build [新しいコンテナID] [オプション] < [vznfile]

察しの良い方はお気づきでしょうが、以下のようにすると、vznfileの出力からコンテナのセットアップまでをまとめて実行してくれます。

vzn vznfile [既存のコンテナID] | vzn build [新しいコンテナID] [オプション]

では実際にvzn buildコマンドを使ってコンテナをもう1つセットアップしてみましょう。

~$ vzn build 102 < my_container.vznfile 
[CT:102] RUN: create centos
Name fire_hippo assigned
Creating container private area (centos-6-x86_64)

    (中略)

[master (root-commit) 74a9dc7] created
 2 files changed, 43 insertions(+)
 create mode 100644 container.conf
 create mode 100644 vznfile
# On branch master
nothing to commit, working directory clean
[CT:102] RUN: set --nameserver 8.8.8.8
CT configuration saved to /etc/vz/conf/102.conf
[master 09cf400] set --nameserver 8.8.8.8
 1 file changed, 1 insertion(+)
[CT:102] RUN: start 
Starting container...

    (中略)

okay.
[master 830b45a] start
 1 file changed, 1 insertion(+)
[CT:102] RUN: exec yum -y update
Loaded plugins: fastestmirror
Setting up Update Process
Resolving Dependencies
--> Running transaction check
---> Package audit-libs.x86_64 0:2.2-2.el6 will be updated

    (中略)

Complete!
[master e75e662] exec yum -y update
 1 file changed, 1 insertion(+)
[CT:102] RUN: exec yum -y install mysql-server
Loaded plugins: fastestmirror
Determining fastest mirrors
 * base: www.ftp.ne.jp
 * extras: www.ftp.ne.jp
 * updates: www.ftp.ne.jp
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package mysql-server.x86_64 0:5.1.73-3.el6_5 will be installed

    (中略)

Installed:
  mysql-server.x86_64 0:5.1.73-3.el6_5                                          

Dependency Installed:
  mysql.x86_64 0:5.1.73-3.el6_5           mysql-libs.x86_64 0:5.1.73-3.el6_5    
  perl-DBD-MySQL.x86_64 0:4.013-3.el6     perl-DBI.x86_64 0:1.609-4.el6         

Complete!
[master f9527f5] exec yum -y install mysql-server
 1 file changed, 1 insertion(+)
[CT:102] RUN: exec service mysqld start
Initializing MySQL database:  Installing MySQL system tables...
OK
Filling help tables...
OK

    (中略)

Starting mysqld:  [  OK  ]
[master f479d59] exec service mysqld start
 1 file changed, 1 insertion(+)
[CT:102] RUN: exec chkconfig mysqld on
[master 5c566d9] exec chkconfig mysqld on
 1 file changed, 1 insertion(+)

やたら長いログですが、ともあれこれでコンテナID102にmysqldが動いてるはずです。確認しましょう。

~$ vzn list
  VEID              NAME      COMMIT    STATUS        IP_ADDRESS         PHYSPAGES         SWAPPAGES         DISKSPACE  CPUUNITS
----------------------------------------------------------------------------------------------------------------------------------
   101     kangaroo_gold     5970b35   running   192.168.230.101            0:256M            0:512M           2G:2.2G      1000
   102        fire_hippo     5c566d9   running   192.168.230.102            0:256M            0:512M           2G:2.2G      1000
----------------------------------------------------------------------------------------------------------------------------------
~$ vzn enter fire_hippo
entered into CT 102
[root@fire_hippo /]# service mysqld status
mysqld (pid  844) is running...

mysqldが稼働してますね。

ちなみに、もう一度同じコンテナに同じ内容のvznfileを通したらどうなるのでしょう。やってみます。

~$ vzn build 102 < my_container.vznfile 
SKIP: create centos
already committed (74a9dc7)

SKIP: set --nameserver 8.8.8.8
already committed (09cf400)

SKIP: start
already committed (830b45a)

SKIP: exec yum -y update
already committed (e75e662)

SKIP: exec yum -y install mysql-server
already committed (f9527f5)

SKIP: exec service mysqld start
already committed (f479d59)

SKIP: exec chkconfig mysqld on
already committed (5c566d9)

スキップされてしまいましたね。

これはどういう事かといいますと、vznfileは各コンテナごとにgitでバージョン管理されており、vznfileの1行ごとに処理を実行し、exit値が0だった場合に限りgit commitを行います(それ以外の場合は即座にbuildを停止します)。

また、既に実行した処理については、ご覧の通り処理をスキップするようになっています。

そのため、結果的に冪等性の担保につながっているのです(専門の方に言わせると「ナンチャッテ」なのかもしれませんが・・・)。

ちなみに vzn list したときのCOMMITは、コンテナごとに管理されているvznfileのcommit-hashだったりします。

いらなくなったコンテナを削除する

もうつかわないコンテナを削除するにはvzn destroyコマンドを使います。文法は以下の通りです。

vzn destroy [コンテナIDまたはコンテナ名]

では、今回作ったコンテナを2つとも削除します。

~$ vzn destroy fire_hippo
Stopping container ...
Container was stopped
Container is unmounted
Destroying container private area: /var/lib/vz/private/102
Container private area was destroyed

~$ vzn destroy kangaroo_gold
Stopping container ...
Container was stopped
Container is unmounted
Destroying container private area: /var/lib/vz/private/101
Container private area was destroyed

これでコンテナの削除ができました。

おわりに。またの名を自問自答タイム。

作ってまだ間もないこともあり、そこまで成熟されているわけではないVZNopeですが、ちょっとした仮想サーバを用意したい、みたいな用途には気軽につかるような代物だと思っています。よかったら、試してみてもらえるとうれしいです。

さて、以下自問自答タイム。

「Dockerでいいじゃん?」

基本的にDockerで間に合ってるならDocker使うといいと思います。あと、僕も部分的にはDockerつかってますし、それらをVZNopeで置き換えとか考えるだけ無駄だとおもいます。

「使いどころは?」

OpenVZとターゲットが一緒です。当たり前ですね。なんせOpenVZのラッパーなんですから。

「goでかかないのなんで?」

とりあえずさっさと動く物がほしかったので、慣れた言語で書いた次第です。

go力高めるためにportingするのも面白いかもしれませんが、openvzってどこまでAPI提供してるの?って話になりますし、libvirtつかうの?的な感じもしていて、なんだか微妙だとおもいます。

そのままportingするのは徒労に終わるだけに思えますし、むしろbashだけで書いた方がスッキリするようにも思えます。

「誰が使うの?」

ぼくです。だめですか?

「バグがある」「意見したい」「マサカリを(ry」

こちらにどうぞ。

Created at
by
ytnobody
Last modified at
2014-06-26 16:57
by
ytnobody