CobblerにCentOS 7 RCを登録する

CobblerにCentOS 7 RCを登録してPXEブートで自動インストールできるところまで。

# はじめに

* 今回使用したCobblerはCentOS 6.5上で動作している。CentOS 7 RC上ではないので悪しからず。
* Cobblerのバージョンは2.4.4。
* Cobblerの設定はCentOS 7 RC以外の適当なOSをPXEでインストールできるところまで終わっているものとする。
* すべてrootユーザで操作している。

（ **2014-07-06追記**: 現在、 http://buildlogs.centos.org/centos/7/os/x86_64-latest/ は最新ではなく http://buildlogs.centos.org/centos/7/os/x86_64-20140704-1/ が最新になっている。望むならダウンロード元をこちらにしても良い）

（ **2014-07-08追記**: CentOS 7.0が正式にリリースされた。cobbler importは後述するシグニチャファイルの書き換えで実行可能なので、それさえやっておけば従来の方法で取り込み可能である）

# 作業手順

## CentOS 7 RCのローカルミラーを作る

cobbler importでさくっと登録できればあまり考えることはないのだけど、残念ながらそうはいかない。

まずcobbler importの取り込み対象は、ローカルにあるか、rsyncで公開していないといけないので（だよね？）CentOS 7 RCのリポジトリ http://buildlogs.centos.org/centos/7/os/x86_64-latest/ を取り込めない。

そこで http://buildlogs.centos.org/centos/7/os/x86_64-latest/ のミラーをローカルに作ることにする。

reposyncを実行するのにリポジトリごとの設定ファイルが必要なので以下で作成する。なお、今回はこのリポジトリをCobbler以外の用途でも使用したかったので、Webサーバのドキュメントルート以下に配置している（このファイル自体はドキュメントルート以下でなくとも良かったのだけど）。

```
# cat > /var/www/html/r-c7rc.conf <<EOD
[c7rc]
name=c7rc
baseurl=http://buildlogs.centos.org/centos/7/os/x86_64-latest
enabled=1
priority=99
gpgcheck=0
EOD
```

しかるのちにreposyncとcreaterepoを実行する。この時点でCentOS 7 RCのローカルミラーとして使用することができるようになる。が、今の目的はそれじゃないので。

```
# reposync -l -n -d -m -c /var/www/html/r-c7rc.conf -r c7rc -p /var/www/html
# createrepo -g comps.xml /var/www/html/c7rc
```

あとで必要になるのでリポジトリのimages以下とLiveOS以下もダウンロードする。
ちなみにLiveOS以下がいつ必要になるかはこの作業手順内には書かれてないが、PXEブートして実際にOSをインストールする時に使われる。

```
# cd /var/www/html/c7rc/
# wget -r -np -nH --cut-dirs=4 http://buildlogs.centos.org/centos/7/os/x86_64-latest/images/
# wget -r -np -nH --cut-dirs=4 http://buildlogs.centos.org/centos/7/os/x86_64-latest/LiveOS/
```

なお、ここまでの手順を http://buildlogs.centos.org/centos/7/os/x86_64-latest/ が更新される度に実行すれば最新のものを使用できる。

## cobbler distroの作成

さて、これで必要なファイルをローカルにダウンロードしてきたのでcobbler importだ、と喜び勇んで実行してみても「ERROR | No signature matched in /var/www/cobbler/ks_mirror/c7rc」なんてメッセージが出てエラーになってしまう。これに関しては将来のCobblerが対応するのを待たなければならない。

（ **2014-07-06追記**: どこを修正すれば良いかを調べたので後述する。もっとも、修正してcobbler importができるようになった場合でも http://buildlogs.centos.org/centos/7/os/x86_64-latest/ 以下は更新が多く、それを取り込むことを考えれば、この後のシンボリックリンクを作る手順は実行しておく方が良い）

というわけでcobbler importの代わりにcobbler distro addとcobbler profile addを実行することになる。

/var/www/cobbler/ks_mirror 以下にここまで作った /var/www/html/c7rc と同じものを置く必要がある。といってもシンボリックリンクで問題ない。

```
# ln -s /var/www/html/c7rc /var/www/cobbler/ks_mirror/
```

cobbler distro addを実行する。長いけど1つのコマンド。
ここでcobbler distroのnameは /var/www/cobbler/ks_mirror にできたディレクトリ名に合わせる必要がある。
つまり先ほどのシンボリックリンクは /var/www/cobbler/ks_mirror/c7rc にできているので、cobbler distroのnameはc7rcとする。

```
# cobbler distro add --name c7rc --arch x86_64 --breed redhat --initrd /var/www/cobbler/ks_mirror/c7rc/images/pxeboot/initrd.img --kernel /var/www/cobbler/ks_mirror/c7rc/images/pxeboot/vmlinuz --ksmeta "tree=http://@@http_server@@/cblr/links/c7rc" --os-version rhel7
```

cobbler importが使えなかったので /var/www/cobbler/ks_mirror/c7rc 以下をcore-0リポジトリとして、cobblerを使ってインストールしたOSでyumリポジトリとして利用する機能も設定されていない。

これを利用するにはまずcore-0リポジトリ設定ファイルを作る必要がある。

```
# cat > /var/www/cobbler/ks_mirror/config/c7rc-0.repo <<EOD
[core-0]
name=core-0
baseurl=http://@@http_server@@/cobbler/ks_mirror/c7rc
enabled=1
gpgcheck=0
priority=\$yum_distro_priority
EOD
```

このファイルをcobbler distroのsource reposとして追加してやればよいのだが、cobbler distro editのオプションに--source-reposというものがあるにもかかわらず、配列の配列の形で追加してやらないといけないのに--source-reposでは配列の配列どころか普通の配列ですら追加する方法がわからない。

仕方がないのでデータファイル /var/lib/cobbler/config/distros.d/c7rc.json に直書きしてしまう。`"source_repos": []`という箇所があるのでこれを`"source_repos": [["http://@@http_server@@/cobbler/ks_mirror/config/c7rc-0.repo", "http://@@http_server@@/cobbler/ks_mirror/c7rc"]]`としてやれば良い。
このファイルを書き換えるときは一旦cobblerdサービスを停止した状態にする必要がある。

```
# service cobblerd stop
# sed -i 's|"source_repos": \[\]|"source_repos": [["http://@@http_server@@/cobbler/ks_mirror/config/c7rc-0.repo", "http://@@http_server@@/cobbler/ks_mirror/c7rc"]]|' /var/lib/cobbler/config/distros.d/c7rc.json
# service cobblerd start
```

## cobbler profileの作成

distroができたので後はprofile。と言いつつ、リポジトリとしてEPEL7 betaも取り込むことにした。cobbler repo addで作成してcobbler reposync。

```
# cobbler repo add --name epel7beta --mirror rsync://ftp.jaist.ac.jp/pub/Linux/Fedora/epel/beta/7/x86_64/
# cobbler reposync --only epel7beta
```

kickstartファイルの作成。これはcobblerが用意したサンプルをコピーして適当に修正して使う。
%packagesの中にインストールしたいパッケージあるいはパッケージグループを書くことができるが、書いておきたいものを後述する。

```
# cp /var/lib/cobbler/kickstarts/sample_end.ks /var/lib/cobbler/kickstarts/centos7.ks
# vi /var/lib/cobbler/kickstarts/centos7.ks
```

最後にcobbler profile addしておしまい。
--reposオプションでさっき追加したepel7betaリポジトリを設定したので、これでcobblerを使ってインストールしたCentOS 7 RCでは先のcore-0以外にEPEL7 betaもyumリポジトリとして自動的に設定されることになる。

```
# cobbler profile add --name c7rc --distro c7rc --kickstart /var/lib/cobbler/kickstarts/centos7.ks --repos epel7beta
```

後はPXEブートさせて、このプロファイルを選べば（あるいはこのプロファイルをcobbler systemのdefaultに設定しておけば）勝手にCentOS 7 RCをインストールしてくれる。

# おまけ

* CentOS 7ではNICの名前が標準ではpredictable network inteface name（例えば、VirtualBox上で動かしていれば最初の1枚はenp0s3）になるが、これを回避して従来通りのeth0にしたいなら以下のようにする。

```
# cobbler distro edit --name c7rc --kopts "net.ifnames=0 biosdevname=0" --kopts-post "net.ifnames=0 biosdevname=0"
```

* kickstartファイルの%packagesに少なくとも指定したいもの。

1. wget: これがないと/etc/yum.repos.d/以下に何も生成されない。@baseに含まれる。
1. bash-completion: CentOS 7ではsystemdのせいで6まで以上に入力補完が重要。@baseに含まれる。

* 実際のところcobbler importを成功させるにはシグネチャファイル /var/lib/cobbler/distro_signatures.json のrhel7の中をcentos-releaseのrpmファイル名にマッチするよう、 `"version_file":"(redhat|sl|centos)-release-(?!notes)([\\w]*-)*7[\\.-]+(.*)\\.rpm",`
と修正すれば良い。ちなみにRHEL7でもScientific Linux 7 alphaでもrpmファイル名を見る限りこれで動くはずだ。
また、cobbler importを実行する前にcobblerdの再起動 `service cobblerd restart` が必要になる。
**2014-07-10追記**: http://www.cobblerd.org/signatures/latest.json が修正されたため、この項の作業をしなくても次項の通り `cobbler signature update` を実行すれば良くなった。
**2014-07-15追記**: Cobbler 2.4.5がリリースされ、上記シグネチャファイルの修正も含まれているので、これ以降のバージョンでは特に問題は起こらないだろう。もっともEPELにはまだ2.4.5は来ていないが。
<br>

* Cobbler自体をアップデートしなくても `cobbler signature update` でシグネチャファイルを http://www.cobblerd.org/signatures/latest.json から取得する機能もある。2014-07-10時点でCentOS 7対応済み。