使用 cobbler 2.2.3 遇到的一些问题

我们线上的机器使用 2.2.3 这个版本已经很长一段时间,使用过程中也发现不少问题,包括本篇在内,后续会陆续跟大家分享一下。
要理解 cobbler 的整体架构,可以参见这张截取自官方的图,十分清晰的表明了各个部分的关系。

另外我之前的一篇博客总结过跟 cobbler 相关的所有目录文件的结构,这次官方提供了一个更加详细的。

在 RH 上安装 cobbler/cobblerd 需要如下的软件包,可以通过包管理器(yum)直接安装:
createrepo
httpd(apache2 for Debian/Ubuntu)
mkisofs
mod_wsgi(libapache2-mod-wsgi for Debian/Ubuntu)
python-cheetah
python-netaddr
python-simplejson
python-urlgrabber
PyYAML(python-yaml for Debian/Ubuntu)
rsync
tftp-server(atftpd for Debian/Ubuntu, though others may work)
yum-utils

如果需要安装 cobbler web,还需要如下的包:
Django(python-django for Debian/Ubuntu)

如果需要重新安装系统,则需要 koan 这个包,他依赖于下面的软件包:
python-simplejson
koan

将 cobbler 部署到 RH 的机型上时,需要注意 disable 掉 selinux,否则会遇到各种问题,比如在启动的时候:
# /etc/init.d/cobblerd  restart
Stopping cobbler daemon:                                   [FAILED]
Starting cobbler daemon: Traceback (most recent call last):
  File "/usr/bin/cobblerd", line 76, in main
    api = cobbler_api.BootAPI(is_cobblerd=True)
  File "/usr/lib/python2.6/site-packages/cobbler/api.py", line 127, in __init__
    module_loader.load_modules()
  File "/usr/lib/python2.6/site-packages/cobbler/module_loader.py", line 62, in load_modules
    blip =  __import__("modules.%s" % ( modname), globals(), locals(), [modname])
  File "/usr/lib/python2.6/site-packages/cobbler/modules/authn_pam.py", line 53, in <module>
    from ctypes import CDLL, POINTER, Structure, CFUNCTYPE, cast, pointer, sizeof
  File "/usr/lib64/python2.6/ctypes/__init__.py", line 546, in <module>
    CFUNCTYPE(c_int)(lambda: None)
MemoryError
                                                           [  OK  ]

sync 过程中如果遇到下面这个问题,是缺少 syslinux:
# cobbler sync
task started: 2013-01-30_181455_sync
task started (id=Sync, time=Wed Jan 30 18:14:55 2013)
running pre-sync triggers
cleaning trees
removing: /var/lib/tftpboot/grub/images
copying bootloaders
Exception occured: <class 'cexceptions.CX'>
Exception value: 'Could not find files matching /usr/lib/syslinux/pxelinux.0'
Exception Info:
  File "/usr/lib/python2.6/site-packages/cobbler/remote.py", line 89, in run
    rc = self._run(self)
   File "/usr/lib/python2.6/site-packages/cobbler/remote.py", line 188, in runner
    return self.remote.api.sync(self.options.get("verbose",False),logger=self.logger)
   File "/usr/lib/python2.6/site-packages/cobbler/api.py", line 717, in sync
    return sync.run()
   File "/usr/lib/python2.6/site-packages/cobbler/action_sync.py", line 115, in run
    self.tftpd.sync(self.verbose)
   File "/usr/lib/python2.6/site-packages/cobbler/modules/manage_in_tftpd.py", line 164, in sync
    self.pxegen.copy_bootloaders()
   File "/usr/lib/python2.6/site-packages/cobbler/pxegen.py", line 97, in copy_bootloaders
    dst, api=self.api, cache=False, logger=self.logger)
   File "/usr/lib/python2.6/site-packages/cobbler/utils.py", line 1240, in copyfile_pattern
    raise CX(_("Could not find files matching %s") % pattern)

!!! TASK FAILED !!!

安装即可:
# yum install syslinux

记得如果要启动 tfpt 和 rsync,需要修改各自的 xinet 文件:
# vim /etc/xinetd.d/tftp
# vim /etc/xinetd.d/rsync

将 disable 的值修改成 no。

重启服务:
# /etc/init.d/xinetd restart

每次修改 /etc/cobbler/settings 以及 /etc/cobbler/modules.conf 需要将 cobbler 重启:
# /etc/init.d/cobblerd restart

settings 文件是 YAML 格式的,一些常用指令如下。

default_password_crypted 表示的是默认的 root 的密码,也就是说,如果你在使用 /var/lib/cobbler/kickstarts/ 里面的 ks 文件时,如果不指定 rootpw –iscrypted xxxx,将使用该默认的 "cobbler" 这个密码。生产环境几乎不可能使用这个默认密码,重新生成 root 的密码:
$ openssl passwd -1

注意用双引号将其包围起来:
default_password_crypted: "g1fbrI7rLZzrPxXetL97LrScqJFxnW7KS1"

server 是 cobbler server 的地址,填写内网的地址就好了。

next_server 是 dhcp/pxe 的地址,正常时将 dhcp 以及 tftp 等跟 cobbler 部署在一台机器上的。

将 manage_dhcp 设置为 1 表示由 cobbler 会根据 dhcp.template 生成 dhcp.conf 文件。

/var/www/cobbler/ks_mirror 是存放 repo 的地方,需要比较大的空间。如果 /var 空间本身比较小,可以修改 cobbler 的配置以更改 repo 的存放位置,不过这个不是最佳的方案,尤其是升级的时候。比较好的是将文件放到比较大的 /opt/cobbler_data/ 下面,然后做一个软连接。

上面这些搞定了,可以 check, sync 看看有没有问题:
# cobbler check
# cobbler sync

cobbler 跟 httpd 绑定的很紧密,也就是说默认使用的是 apache2,而非 nginx。如果使用了 nginx 开启了 80 端口,在 cobbler check 的时候会出现如下的 log:
# cobbler check
httpd does not appear to be running and proxying cobbler, or SELinux is in the way. Original traceback:
Traceback (most recent call last):
  File "/usr/lib/python2.6/site-packages/cobbler/cli.py", line 184, in check_setup
    s.ping()
  File "/usr/lib64/python2.6/xmlrpclib.py", line 1199, in __call__
    return self.__send(self.__name, args)
  File "/usr/lib64/python2.6/xmlrpclib.py", line 1489, in __request
    verbose=self.__verbose
  File "/usr/lib64/python2.6/xmlrpclib.py", line 1243, in request
    headers
ProtocolError: <ProtocolError for 10.18.10.90:80/cobbler_api: 404 Not Found>

暂时就使用 apache2 了。

cobbler sync 的时候会重启 dhcpd 的服务,但是不会重启 xinetd 的服务,因此需要手动重启:
# /etc/init.d/xinetd start
确认开启了 rsync 的 873 以及 tftp 的 69 端口

如果没有开启 tftp 的话,client 在 pxe 的时候会出现如下的 error:
PXE-E32:TFTP open timeout

可以使用下面的命令测试:
# tftp 192.168.1.1
tftp> get images/rhel/vmlinuz
tftp> quit

import 镜像:
# mount -o loop /isofile/rhel-server-6.2-x86_64-dvd.iso /mnt
# cobbler import --name=rh_6.2_x86_64 --arch=x86_64 --path=/mnt

import 的详细使用可以看这里

接着比较重要的步骤就是添加各种 distros, profiles 以及最终的 systems 了。这个同样 RTFM 就可以了,官方的这部分写的很详细。

根据实践的经验,在添加、修改 system 的时候,比较好的做法是加上 –dns-name 和 –hostname,需要注意的是,–dns-name 是针对每个网络接口的(–interface) 的,而 –hostname 则是针对整个 OS 的:
# cobbler system edit --name=test --interface=eth0 --mac=00:11:22:AA:BB:CC --ip-address=192.168.1.100 --netmask=255.255.255.0 --static=1 --dns-name=test.mydomain.com
# cobbler system edit --name=test --hostname=test.mydomain.com

在添加 system 的时候可以指定端口,当然也可以删除端口:
# cobbler system edit --name=foo --interface=eth2 --delete-interface

需要注意将 ks 文件里面出现 "$" 的地方使用 “\” 将其转义,像下面这样:
rootpw –iscrypted \$2\$4fSlqzf7$iWAMVj8E35/G3PBs9nPjm/

写完 ks 文件之后,先通过 validateks 测试一下有没有语法错误:
# cobbler validateks

通过下面这个命令查看 ks 文件,发现一些逻辑上的问题:
# cobbler system getks --name=test

记得修改完之后执行 cobbler sync 来确保 dhcpd.conf 以及 tftp 的文件的配置是最新的。

上面三个是 cobbler 最重要的功能,除此之外,cobbler 还具备一个简单的配置管理系统,可以通过内置的 mgmtclass 实现:
# cobbler mgmtclass add --name=string --comment=string [--packages=list] [--files=list]

system 多了以后,自然需要有搜索的功能,除了使用 cobbler list, cobbler report 这种比较粗放的方式查找需要的信息,cobbler 还提供了专门的 find 查找选项,这样可以比较方便的查找需要的信息,比如像下面这样:
# cobbler system find --mac=AA:BB:CC:DD:EE:FF

cobbler 安装过程中的 log 监控,可以使用 Anaconda(anaconda monitoring) 来实现,除了 setting 开启对应的选项之外,还需要在 kickstart 里面加入 snippets。

对于 cobbler 的简单的配置管理系统,我并不推荐使用,因为有比他更好更强大的 puppet 来替代他工作,在安装 puppet 之前,包括 hostname, dns, ntp 等问题,就需要 cobbler 的 snippet 来帮我们完成。

可以使用 triggers 机制来做一些定制化的工具。这个用得到不是很多,而且当 triggers 规模大到一定程度后,cobbler 的性能会出现下降(这个不是主要问题)。

虽然 trigger 不是很好用,但是有一个 repo 的管理确实异常的方便,通过 cobbler repo 可以帮你同步 http, rsync 的源,这个在后续的包管理方面会发挥作用:
# cobbler repo add --arch=x86_64 --mirror=rsync://mirrors.ustc.edu.cn/epel/6/x86_64 --name=epel --breed=rsync
# cobbler reposync --only=epel

这个博客记录了不少安装使用过程中遇到的问题,可以参考一下。