Kickstartのあんまり好きじゃないところおまけ。KVMの仮想マシンをvirt-managerからGUIで作成し、virt-managerの仮想シリアルコンソールからポチポチインストールしましたが、毎回GUIでこんなことやってられないので自動化しました。virt-installで仮想マシンの作成virt-installというCUIで仮想マシンの作成ができるコマンドラインがあります。今回はそれを使います。libvirtプロジェクトなのでKVM以外の仮想化基盤にも対応しています。virt-managerとvirt-installの紐付けvirt-installには大量のオプションがあります。前回やったvirt-managerでのGUIインストールと紐づけて見ていきます。capabilitiesの出力結果のdomain要素のtype属性にてホストマシンにインストールされている仮想化基盤名を確認可能。存在しないファイルを指定すると自動で新規作成する。ホストマシンのブリッジに接続したいときは続けて「bridge=<ブリッジ名>」。virshで作成した仮想NWに接続したい際は続けて「network=<NW名>」。そのほかvirt-managerとは明示的に紐付かないけど必要なvirt-installのオプション上記のほかにもvirt-managerが暗黙的にやっていたことがあり、それもvirt-installのオプションで指定してやる必要があります。今回CUIで仮想マシンをインストールする上で必要となる設定も追加していきます。これをつけないとvirt-installしたプロンプトがvirt-viewer経由でのゲストコンソールになる。そもそもvirt-viewerはインストールすらしていません。上記をもとにコマンドを組み立てます。オプションが非常に多いので、バックスラッシュ+改行+インデントで見やすくしてます。--noautoconsole123456789101112これでvirt-managerのGUIでやっていた仮想マシンの作成はコマンド化できました。Kickstartで仮想マシンのインストール自動化ここまでで、GUIからvirt-managerを開いて仮想マシン一覧を開くと、virt-installコマンドで作成した仮想マシンが稼働中であることがわかります。「開く」をクリックすると、仮想シリアルコンソールに接続されてGUIインストールを行うことができますが、ここも省力化したい。仮想マシンのインストールを自動化する方法として、vagrantとKickstartが思いつきました。vagrantは仮想マシン作成も込みでやってくれますし、virtualboxでずっと使ってきて慣れているのですが、vagrantはKVMネイティブではありません。boxの種類は少ないし、ネイティブでないものを使うと思わぬところではまる(はまってきた)ので、素直にKickstartを使うことにします。テンプレ用anaconda-ks.cfgの作成まずは先ほどのvirt-installで作成した仮想マシンについて、virt-managerの仮想コンソールを通じて、普通に手動インストールします。インストール後、作成した仮想マシンにログインします。すると以下のディレクトリにこんなファイルができているはず。--notempty%end1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950これは、本マシンのインストール時に手動で実施した設定が、Kickstart形式で書き出されたファイルです。これをテンプレとし、作成したいマシンごとに修正を加え、virt-install時に読み込ませることで、仮想マシンの作成~インストールを自動化することができます。このファイルは手書きで作成してもいいのですが、仮想環境のように似た構成のマシンを作って壊してできるのであれば、動いているマシンからコピペして持ってきたほうが確実です。ちなみにRHEL6台と7台でだいぶKickstartの構文が変わったりもしているため、やっぱり動いている実機からとってきたほうがいいです。仮想マシンの初期インストールにあたって変数となりうる部分はネットワーク周りでしょう。Kickstartファイルを都度都度変更はしたくないので、ネットワーク周りの設定はコメントアウトし、virt-installコマンドの引数として渡すことにします。--hostname=localhost.localdomain(後略)123456加えて、インストールが終わったら勝手に再起動するようにしておきます。これを付け加えないと、シリアルコンソールに入っての手動再起動が必要になります。通常のセクション(パッケージセクションに入る前。「%packages」が記述される前)に「reboot」と書きます。--initlabelreboot%packages@^minimal@corechronykexec-tools%end(後略)12345678910111213141516そのほかも必要に応じて修正します。私は上記二つだけ修正しました。できたKickstartファイルをホスト側の適当なディレクトリに配置しておく。したら、virt-installコマンドのオプションでそのkickstart側のファイルを指定する。具体的には以下のオプションをvirt-installコマンドに追加します。nameserver=192.168.100.1"1234567891011一つ目のinitrd-injectはKickstartファイルのホスト側のパスを指定。2つ目のextra-argsはゲスト側のブートオプション。initrd-injectで指定されたKickstartファイルは、ゲストの初期RAMディスクのルートフォルダに配置されるため、extra-argsのinst.ksにてゲスト側から見たKickstartファイルのありかを書いてあげます。あとはだらだらとネットワーク設定をブートオプションの書式にしたがって記述します。めんどくさいな......。ブートオプションの詳細についてはこれまたRedhat公式を参照。いうことで、結局以下のようなvirt-installコマンドを打てばいいことになります。うーむ、といった感じ。nameserver=192.168.100.1"1234567891011121314151617181920212223これを実行すると、仮想マシンの作成とインストールを同時にやってくれます。10分~20分くらい待つと、外からsshでつなげるようになります。一応自動化できました。Kickstartのあんまり好きじゃないところvirt-installコマンドが長すぎる。これは変数を外出ししたスクリプトを作っておくことで一応解決できなくもない。Kickstartの取り回しにくさ。安全を期すなら必ず一度は手動で仮想マシンを構築してanaconda-ks.cfgを取り出さないといけない。Kickstartの使い回しにくさ。OSのバージョンが変わると記法も変わる。debian系ではKickstartは使わないらしい(使えないわけではなさそうだが。変わりにPreseedというツールがあるらしいが、両方覚える労力が......。vagrantって優秀だったんだなぁというおはなし。KVMネイティブではないけどvagrantに乗り換えようかな。検証中に100回くらい打ちました。良いゴールデンウィークだった。/var/lib/libvirt/images/test2centos7.qcow2123おわり。