cobbler 2.2.3 安装 ubuntu 12.04

cobbler server 部署在 ubuntu 上还是 rh 上问题都不大,关键是 2.2.3 这个版本对 ubuntu 的支持依然不是很好。需要对 cobbler 本身做一些调整,再加上 preseed 这个比 autoYAST 好用一些,比 ks 差很远的 debian 式自动化程序,花了小半天的时间才搞定了。当然前提是你对 preseed 足够的熟悉,否则需要更多的时间。

由于在不同的 vlan,需要新部署 dhcrelay,这个确实是件麻烦的事,再加上没有 dhcp,就陷入了鸡生蛋蛋生鸡的窘境。另外考虑过是直接加 ks=ip 的方式,但是不管是改成 static 还是 dhcp 的模式,必然获取不到 ip,此路行不通。暂时先找了个 netboot.iso,然后在启动的时候按 Esc,手动执行:
boot: linux ip=192.168.1.10 netmask=255.255.255.0 gateway=192.168.1.1 dns=192.168.1.3 ksdevice=eth0
现在正在评估在三层开启 dhcp 的可能性,否则以后每增一个 vlan 都是一次又一次的重复工作。

开始正题,首先是本地源的问题,cobbler 自身的那个 repo 自命令对 ubuntu 支持的很不好,只能通过其他的途径解决。
要同步 ubuntu 的源到本地,可以使用 apt-mirror,这个之前介绍过,还可以使用 debmirror,这里主要介绍 debmirror。还有个叫 apt-cacher 的工具,可用性不高也不方便管理,就是不介绍了。除此之外就是 rsync 这个最普遍的也是最好用的工具了。

安装 debmirror,导入公钥:
# yum install debmirror
# wget http://pa.archive.ubuntu.com/ubuntu/pool/main/u/ubuntu-keyring/ubuntu-keyring_2012.05.19.tar.gz
# tar zxvf ubuntu*tar.gz
# gpg --no-default-keyring --keyring ~/.gnupg/trustedkeys.gpg  --import /ubuntu-keyring-2012.05.19/keyrings/ubuntu-archive-keyring.gpg

然后就可以参照上面那个脚本。两点需要注意:
1. arch 选项如果需要 64 位的,应该是 amd64 而非 x86_64,因为这个问题延误了半个多小时,后来还是在脚本里面开启 –debug 选项才看到问题的。
2. release 选项默认不全,precise 的一共有如下几个: precise,precise-backports,precise-proposed,precise-security,precise-updates。

通过 debmirror 同步的源不存在任何的问题,但是使用 apt-mirror 同步的源会在安装过程报找不到 mirror 的错误,因为他会使用 grep 去 mirror 里面查找一些必要的东西。

在导入 distro 的时候又出现了不少问题,cobbler 默认导入的的 kernel, initrd 是 $UBUNTUROOT(UBUNTUROOT=/var/www/cobbler/ks_mirror/ubuntu_12.04.2-x86_64)/install/ 下面的两个,明显是错误的,正确的是 $UBUNTUROOT/install/netboot/ubuntu-installer/amd64/ 下面的两个文件:
# distro edit --name=ubuntu_12.04.2-x86_64 --initrd=$UBUNTUROOT/install/netboot/ubuntu-installer/amd64/initrd.gz   --kernel=$UBUNTUROOT/install/netboot/ubuntu-installer/amd64/linux --os-version=precise --breed=ubuntu --arch=x86_64

根据这篇文章作者的描述,12.04 存在一个 bug,网络配置的选项在 preseed 里面被忽略了,只能在内核参数里面设置。在添加 profile 的时候,指定就好了:
# cobbler profile edit --name=profile_ubuntu_12.04.2 --kopts="priority=critical locale=en_US netcfg/choose_interface=auto"

上面的这个仅仅解决的一部分,继续使用会发现,ubuntu 尽管通过 dhcp 分配到了地址,但是其 ip 跟 mac 的划分的不一致,比如原来 aa:bb:cc:dd 这个应该对应 192.168.1.2,但是最终分配到的却是另外一个叫 192.168.1.3 的 ip,,这个打断了事先的规划,我们需要重新将其收敛起来,一个行得通的方式是继续在 kopts 里面加选项:
profile_kopts="priority=critical locale=en_US netcfg/get_ipaddress=192.168.1.42 netcfg/get_gateway=192.168.1.254 netcfg/get_nameservers=192.168.1.254 netcfg/get_netmask=255.255.255.0 netcfg/choose_interface=auto"
# cobbler profile edit --name=profile_ubuntu_12.04.2 --kopts=\"${profile_kopts}\"

安装到最后会发现,ubuntu 并不会帮你做 static ip,reboot 之后检查 interface 文件你会发现依然是 dhcp 分配到的 ip(iface eth0 inet dhcp)。g 了个脚本,支持的版本比较多,我这里其实只需要 ubuntu 的。

另外,其最终的 hosts 文件也比较奇怪,标准的方式应该像下面这个样子:
127.0.0.1   localhost.localdomain       localhost
192.168.1.1 jaseywang.me                jaseywang

preseed 最终缺成了下面这个样子:
127.0.0.1   localhost
127.0.0.1   jaseywang.me    jaseywang

这类的情况在下面的 post install 里面可以一并解决。

preseed 虽然比较烂,好歹 post install 还是有的可以将后续需要做的一些事情写到一个脚本 postinstall.sh(包含上面的 dhcp2static) 里:
d-i preseed/late_command string \
    cd /target; \
    wget http://mirror.jaseywang.me/cobbler/ks_mirror/ubuntu_post/postinstall.sh; \
    chmod +x ./postinstall.sh; \
    chroot ./ ./postinstall.sh; \
    rm -f ./post-install.sh

之前贴过(gist, 详细的解释)一个我们在 10.04 生产环境的 preseed 文件,这次分享的是 12.04 的,主要是根据这个官方的文件修改而来。至于最后的 post install 可以参考我之前写的一篇在 rhel 上博客,原理一样,实现起来也几乎类似。

尽管 preseed 或者说是 ubuntu 比较难用,但,我们最终还是在生产环境给用起来了,并且达到了之前的期望。

  • http://gfrog.net/ gfrog

    hey,既然用了cobbler,难道没有考虑过用breaker来管理设备么? 虽然这货是个自动测试系统,不过用来管理设备也是一流的哦。

    • http://jaseywang.me/ Jasey Wang

      什么 breaker?我g了一圈没找到相关的信息–

      • http://twitter.com/linuxtty Anonymous
        • http://gfrog.net/ gfrog

          对,是beaker。抱歉,一着急多打了个r。