mixi engineer blog

*** 引っ越しました。最新の情報はこちら → https://medium.com/mixi-developers *** ミクシィ・グループで、実際に開発に携わっているエンジニア達が執筆している公式ブログです。様々なサービスの開発や運用を行っていく際に得た技術情報から採用情報まで、有益な情報を幅広く取り扱っています。

Cobblerを使ったOSインストールとその後のクラウド化

こんにちは。運用部 アプリ運用グループの清水です。趣味の楽器も気づけば20年目を迎えましたが、いっこうに上達している気がしません。

何回かに渡ってOS移行のお話を書いてきましたが、今回は、OSのインストールで使っているCobblerというツールの利用例を中心に紹介したいと思います。

OSインストールを楽にしたい

ミクシィでは非常に多くのサーバーを運用しています。それらのサーバーにおいて、OSインストール作業は日常的に行われています。OSのインストールが必要になるケースは、例えば以下のような場合です。
  • サーバーを購入した
  • サーバーが壊れ、修理した
  • OSをバージョンアップする(移行する)
  • サーバーの役割を変える(クリーンインストールする)
  • VM(Virtual Machine)を作る

当然ながら、OSインストール作業をするために、わざわざデータセンターに行ってCDやDVDといったメディアを使い、大量のサーバーを相手に作業するわけにはいきません。基本的に作業はリモート(場合によっては現地)でおこない、作業にかかる時間を最小限にすることが求められます。
そこで、作業の効率化のために、約2年くらい前からCobblerを本格的に使うようになりました。

Cobblerの概要

公式サイト http://www.cobblerd.org/

Cobblerは、リモートで各種Linuxディストリビューション(RHEL系、Debian系など)のインストールを素早くおこなうことができるPython製のツールです。物理サーバーはもちろん、仮想マシンへのOSインストールを簡単にできる仕組みを備えています。Cobbler自体はそれほど新しいツールではありません。GitHub上の最初のコミットは2006年4月4日のもので、当時はたった8つのファイルで構成されていたようです。これだけ前からあるツールなので、お使いの方も多いかもしれません。どのような流れで使うものなのかイメージできるように、以下に簡単な図を用意しました。

Cobblerが扱うデータの構造

Cobblerでは、OSの設定やインストール先のサーバーの情報などが以下のタイプで分類されています。

  • Distribution
    OSのディストリビューションの定義
  • Repository
    リポジトリサーバーの定義
  • Profile
    使うDistributionとRepositoryの定義と、Kickstartなどのインストールスクリプトの場所の定義
  • System
    使うProfileの定義と、各サーバーに関わる情報(ホスト名やIPアドレスなど)の定義

Cobblerでできるようになること

Cobblerを使うことで、主に以下の点が便利になりました。

数ステップで簡単に再インストール

以下のコマンド3つでOSの再インストールができるようになりました。

再インストールしたいサーバーにログイン

ssh [対象のホスト]

koanコマンドでCobblerから情報を取得、次回起動時のカーネルと起動オプションの書き換え

sudo koan [オプション]

リブート

sudo reboot

コマンドしてリブートした後、OSインストールが自動的に始まり、インストール後の再度のリブートで起動したら完了です。

Cobblerにはkoanというコマンドが付属しています。Koanを使うことで、PXE BootせずにOSの再インストールができるようになります。(OSが入っていないマシンで、新規にインストールする場合には使えません。)
koanコマンドは、OSをインストールしたいサーバー上で実行します。
内部動作的には、Cobblerサーバー上にあるvmlinuz、initrdファイルと登録情報を取得して、現在起動しているLinuxのブートローダで設定(grub.cfgなど)してあるvmlinuzとinitrdを切り替えることで、次回起動時にネットワークインストールが実行されるようになります。

再インストールではなく、新規インストールをしたい場合は、Cobbler設定後、koanコマンドを使わずにPXE Bootで同じようにインストールができます。

プログラマブルなKickstart

Cobblerが扱うKickstartファイルは、テンプレートエンジンであるCheetahが採用されています。
変数や制御構文が使え、変数にはProfileやSystemに設定された値を展開することができます。
テンプレートの仕様については以下に詳しく書かれています。

http://www.cobblerd.org/manuals/2.4.0/4/5_-_Kickstart_Templating.html

また、Cobblerをインストールした環境であれば、/var/lib/cobbler/kickstartsや/var/lib/cobbler/snippetsにデフォルトのテンプレートがあるので参考すると便利です。これらのテンプレートは、git管理にしておくことで、変更差分の管理ができます。

Cobblerの導入方法

Cobblerの導入方法についてはここでは詳しくは触れませんが、下記の公式ドキュメント(Version 2.4.0)を参考に、お使いの環境に合わせて設定すると良いかと思います。

公式ドキュメント
http://www.cobblerd.org/manuals/2.4.0/

クイックスタートガイド
http://www.cobblerd.org/manuals/2.4.0/2_-_Cobbler_Quickstart_Guide.html

Koan
http://www.cobblerd.org/manuals/2.4.0/7/1_-_Koan_Basics.html

ミクシィでのCobblerの使い方

以上のようにCobblerを使うことでOSインストールがコマンドベースで実行できるようになりますが、1つ1つコマンドを叩いてサーバーの設定をするのは意外と面倒だったりします。CobblerにはWebUIやAPIが用意されていますが、ミクシィではcobblerコマンドをラップしたスクリプトを自作して、効率よくOSのインストールがおこなえるようにしています。また、インストール時のネットワークについても少し工夫をしています。

スクリプトを作ってより楽に

Cobblerを日常的に使う場合、個々のサーバーを相手にすることから、Systemを登録することが非常に多くなります。OSの再インストールをするたびに、

sudo cobbler system add --name hoge --ip-address x.x.x.x --netmask x.x.x.x ...

と、サーバーごとに毎回IPアドレスやネットマスクを入力してコマンドを実行するのは非常に面倒です。

そこで、Cobblerサーバーから、再インストール対象のサーバーのひと通りの情報をssh経由で取得し、cobblerコマンドに渡すといったスクリプトを作り、再インストールの手間を減らしています。再インストール対象のサーバーのIPアドレスやネットマスク、ゲートウェイ設定など取得は、環境依存せずに確実に取得するために、C言語で書いた自作のコマンドを利用しています。Cobblerサーバーで実行するスクリプトにはホスト名を渡すだけで、ひと通りの登録処理がおこなわれるようにしています。

また、スクリプトでの効率化を図っていた時に、Cobbler側のコードが非対応だったために、一部の環境でインストールがうまくできない問題や、やりたいことができない、といったことがありました。しかし、CobblerはGitHubにリポジトリがあるので、ソースコードを修正して差分を本家にマージしてもらいました。修正内容の一例として、KVMホスト上でVMにOSインストールをするためにkoanコマンドを実行すると、内部的にはvirt-installが実行されるのですが、エミュレートするマシンタイプが"pc-0.15"固定になっていたところを、デフォルト値を"pc"に、そして明示的にマシンタイプの指定ができるように修正をおこないました。マシンタイプが"pc-0.15"の場合、仮想ネットワークドライバのvirtio-netを使った場合に問題が起きたため、このような修正が必要になりました。

ネットワーク環境

ミクシィのネットワーク環境は、VLAN Tag付きのネットワーク環境(以下Tag環境)とVLAN Tag無し環境(以下Untag環境)が存在しています(いろいろな理由で……)。

弊社のCobblerサーバーは、TagとUntagそれぞれの環境に統一的なインストールができるように構成しています。Tag環境であっても、OSインストール中はUntag状態で必要なリソースへの接続が必要なため少し厄介です。ここでは、Tag環境でのインストールについて少し詳しく説明します。

Koanを使う場合、コマンド実行時はTag環境を通じてインストールKernelやパラメータの取得を行いますが、再起動後のインストール中(Anaconda実行中)は、Untag環境で必要なリソースの取得(Cobbler、Yum Repositoryなど)を行う必要があります。このため、Tag環境のエッジスイッチのDefault VLANをインストールセグメントとして設定し、Untagのまま、このセグメントのCobblerサーバーやリポジトリへ接続できるように設定して解決しています。

OSのインストーラはUntag環境で動作しますが、Cobblerの登録情報を元にTag環境向けのインタフェース設定が実施され、インストール後はTag環境に接続されます。

DC作業(構成変更、修理など)ドリブンなインストールでは、NICのPXE Boot機能を使っています。起動時のPXE Boot時点ではUntag環境となるので、この場合も上記と同様に、インストールセグメントに対してDHCPでインストール用のIPアドレスを取得し、インストールKernelや必要なパラメータを取得をおこないます。

まとめ

Cobblerによって、物理サーバー、仮想サーバーともにOSのインストールは格段に楽になりました。しかし、仮想サーバーに関しては、OSインストール時に仮想CPUやメモリといったリソースの配分や、IPアドレスなどのネットワーク周りの割り当てについては面倒で、システムを構築する上での課題となります。

この課題を解決するために、今では一部の環境でOpenStack(Grizzly)を導入しています。OpenStackを導入したことで、ダッシュボードやAPIを使ってオンデマンドで用途に応じたリソース配分が細かく調整できるようになり、全体としてサーバー利用効率が上がりました。

非常に簡単な図ですが、下の図はそのイメージです。

VMを立ち上げる際は、仮想CPU数、メモリサイズ、ディスクサイズが異なる複数のインスタンスタイプを用意し、サーバーの用途に合わせてタイプを設定しています。立ち上がったVMの構成の適用、管理はChefを使っています。


ご存じの方も多いかもしれませんが、ミクシィでは、mixi.jp以外にもスマホアプリの提供などさまざまなプロジェクトがあります。これらのサービスに柔軟に素早く対応できるインフラを提供するためには、CobblerやOpenStack、Chefのようなツールは欠かせません。OpenStackやChefの事例や詳しい内容について後日エントリを書きたいと思います。