HTTP 资源的同步

breed 为 yum, deb, rsync 的都很好做,直接通过 cobbler 内置的 repo 同步很快就可以完成,即使没有 cobbler,一个脚本也能搞定,比如我们线上 Ubuntu 12.04 的就是通过 debmirror 的方式同步完成的。
但是对于 HTTP 的方式,我找了一圈没有找到很好的方式,最初我是使用的 wget,发现效率太低,后来有推友推荐使用 lftp,使用之后发现果真是半个神器,虽然达不到 rsync 那样的智能的增量,但是对于更新的不是那么频繁的资源的同步也基本能够满足要求了。
最初是写了一个 expect 脚本上去跑,后来发现还有 non-interactive 的方式,-c/-f 都可以,放到 cron 里面确实很方便:
$ cat  lftp.txt
open http://maven.twttr.com
mirror -c -n  –parallel=10 ./ ~/resources/maven
quit

$ lftp -f lftp.txt

除了上面这个问题还有个几年内无法突破的问题,方院士,自己的 PC 遇到,服务器自然也会遇到,同步到本地一是出于上面的考虑,另外一点还是为了节省带宽以及其他的机器资源消耗。目前专门有一台 VPS 供我们线上使用,在线上搞了一个 proxy,实现的方式太多了(shadowsocks + polipo),具体的就不说了,提供 http, https 的方式,基本能满足目前的需求了。

跨机房部署

跨机房的服务部署分两个小问题。第一个是系统(RAID、BIOS、OS) 的部署,另外一个则是 OS 上面的服务的部署。

系统
曾经想通过 dhcp over openvpn 来解决机房的"互联互通"问题,目前暂时仅仅解决了通过 openvpn 进行 lan to lan 的连接,而 over openvpn 的 dhcp(dhcrelay) 到目前为止还不清楚为什么获取不到 IP。

后来看 cobbler 的文档的时候发现可以通过 replicating 实现,这个需要在对端的 IDC 部署一台 cobbler server,由这台机器完成 tftp, dhcp 的功能,而由 central cobbler 实现统一的 system, repo 等配置。
部署起来也很简单。在对端部署一台跟 central cobbler 一样的 cobbler,默认不需要添加任何的 distro 等。该端所有的配置均从 central 拉取,因此需要足够的硬盘空间,尤其要同步 repo:
# cobbler replicate cobbler replicate –master=cobbler.example.org [–distros=pattern] [–profiles=pattern] [–systems=pattern] [–repos-pattern] [–images=pattern] [–prune] [–omit-data]

接下来该建立 RAID 的建立 RAID,该安装系统就安装系统。另外,官方推荐通过 trigger 机制来自动的同步 central 上的数据,这个我后来调研的时候发现并不是很好,如果有多个机房的话,会造成 system 的混乱。因此,暂时还是手动的在对端的 cobbler 上手动的执行一遍 replicating,每次机器上架的时候的才会用到,工作量并不大。

服务
这个相对就比较简单了,如果是通过 tunnel 形成的一个三层结构,那么通过 puppet master 或者类似的 saltstack 就能很轻松的完成,前提是注意 ntp 以及 dns(hosts) 的统一正确。

使用 DTK 自动批量建立 RAID

一直想能否通过自动化的方式完成 RAID 的配置以及 BIOS 的升级,g 一下发现果真有一个叫 DTK(dell openmanage deployment toolkit) 的套件。他包含了 raidcfg 这个工具,使用他就可以自动化的完成 RAID 卡的设置,以及 syscfg 这个用来修改 BIOS 的工具。
之前我们几百台机器上的 raid 全部是人肉操作,一台机器从启动到配置完成关机最少 10min,非常的耗时低效。自从用了 dtk 之后,效率大大的提升。raidcfg 可以对机器上的磁盘的 raid 做增删,非常方便,适合大规模的机器部署,减少人肉操作出错的概率。
这里主要谈的是 RAID 卡的建立,因此主要涉及 raidcfg 的使用。要安装 dell 附带的这个工具有很多方式,最简单的是去 dell.com 下载。这里我们同步了 dell 的整个 deb, yum 源,因此直接通过包管理器安装 raidcfg 就可以了,包括前面说的 racadm 等都可以通过这个源安装。

接着是要去下载 dtk 这个 iso,解压:
# mount -o loop dtk_4.2_new_320_Linux.iso /mnt

在 isolinux/ 目录下会发现有 SA.1, SA.2 两个文件,file 一看分别是 kernel 和 initrd 文件,后来也证实这其实是 CentOS 6.2 定制的一个 busybox。在添加到 cobbler 的时候,使用 import 会出问题,索性直接手动添加,将 iso 的内容直接复制到 cobbler/ks_mirror/dtk_4.2-x86_64 下,然后再添加 distro 等:
# cp /mnt/* cobbler/ks_mirror/dtk_4.2-x86_64
# cobbler distro add –name=dtk_4.2 –kernel=cobbler/ks_mirror/dtk_4.2-x86_64/isolinux/SA.1 –initrd=cobbler/ks_mirror/dtk_4.2-x86_64/isolinux/SA.2
# cobbler profile add –name=dtk_4.2 –distro=dtk_4.2

到上面为止都比较顺利,接下来添加 system 需要做一些改进,跟之前一样,–name, –profile, –mac-address 等这些肯定是要添加的,–hostname, –dns-name 可以选择性的添加。最重要的是要在 –kopts 后面添加上 tftp 的相关脚本,否则需要做 raid 的机器获取不到配置文件:
# cobbler system edit –name=jaseywang –kopts="share_type=tftp share_location=/raidcfg share_script=raid10_6.sh tftp_ip=192.168.1.1"

Continue reading

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
Continue reading

使用 UEFI 取代 BIOS

dell 12G 的机器默认已经通过 UEFI 来取代了 BIOS 了。这个起初没注意,后来在 batch 安装的过程中发现一个都没起来,开 idrac 才发现连 pxe 都没进去,调查了下情况,发现 12G 的产品已经用 UEFI 替代了 BIOS 了,这篇博客的作者讲述了这个情况的心酸经历。根据之前的调研来看,目前 UEFI 还未广泛的使用,并且该技术还相对的年轻,RH 6.0 以后支持的 2.2 的版本。

先来看下最原始的 BIOS 的方式是怎么做的。在使用 BIOS 的情况下,/var/lib/tftp/ 目录下的情况是这样的:
# tree
.
├── etc
├── grub
│   ├── 01-14-FE-B1-DA-74-0F
│   ├── 01-90-B1-3C-43-29-7C
│   ├── efidefault
│   └── images -> ../images
├── images
│   └── rhel-x86_64
│       ├── initrd.img
│       └── vmlinuz
├── memdisk
├── menu.c32
├── ppc
├── pxelinux.0
├── pxelinux.cfg
│   ├── 01-14-fe-b1-da-74-0f
│   ├── 01-90-b1-3c-43-29-7c
│   └── default
└── s390x
    └── profile_list

BIOS 默认会使用 SYSLINUX 作为 boot image,也就是 pxelinux.0 这个文件。要获取该文件很简单:
# mount -t iso9660 /path_to_image/name_of_image.iso /mnt -o loop,ro
# cp -pr syslinux-4.02-4.el6.x86_64.rpm /tmp
# umount /mnt
# rpm2cpio syslinux-4.02-4.el6.x86_64 | cpio -imdv
# mkidr /var/lib/tftp/pxelinux
# cp /tmp/usr/share/syslinux/pxelinux.0 /var/lib/tftp/pxelinux

这样,dhcpd.conf 里面的 filename 则应该如下定义:
host xxxx {
    …
    filename "pxelinux/pxelinux.0";
    …
}

将其余的文件拷贝至 tftp 目录:
# cp /boot/grub/splash.xpm.gz /var/lib/tftpboot/pxelinux/splash.xpm.gz
# cp /mnt/images/pxeboot/{vmlinuz,initrd.img} /var/lib/tftpboot/pxelinux/rhel6/

上面所有的步骤其实 cobbler 已经帮我们做好了。2.2.3 的默认是不支持 UEFI 的,这里是他的一个 patch

# cobbler get-loaders
trying hardlink /var/lib/cobbler/loaders/grub-x86_64.efi -> /var/lib/tftpboot/grub/grub-x86_64.efi
trying hardlink /var/lib/cobbler/loaders/grub-x86.efi -> /var/lib/tftpboot/grub/grub-x86.efi

此时如果还需要修改 grub 的话,修改的是 /boot/efi/grub/grub.conf 这个文件而非 /boot/grub.conf。下面就是 ks 文件的书写了。

bootloader --location=partition --driveorder=sda --append="crashkernel=auto rhgb quiet"

part /boot/efi --fstype efi --size 128 --asprimary --ondisk=sda
part /boot --fstype="ext4" --size=150 --ondisk=sda
part / --fstype="ext4" --size=20000 --fsoptions="defaults,noatime" --ondisk=sda
part /var --fstype="ext4" --size=40000 --fsoptions="defaults,noatime" --ondisk=sda
part /home --fstype="ext4" --grow --size=1 --fsoptions="defaults,noatime" --ondisk=sda

sda 的第一块分区 sda1 需要制定给 UEFI 分区,格式化为 efi 或者 vfat 格式,并将其挂载到 /boot/efi/ 目录下面;第二块分区 sda2 则需要分配给 /boot/ 目录,此分区不能分配的太大,否则会出现问题(具体的我也不清楚),官方推荐在 500M 或者同等的量级。接下分区可以随意。
另外,还需要将下面两行注释掉:
#zerombr
#clearpart –all –initlabel

UEFI 的启动流程如下:

基本上需要注意的就是上面这两点,其他的分区选项看 manual 就好了。

ref:
https://access.redhat.com/site/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Installation_Guide/s1-netboot-pxe-config.html
https://access.redhat.com/site/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Installation_Guide/s1-netboot-pxe-config-efi.html
https://access.redhat.com/site/solutions/315133

cobbler 的电源管理

cobbler 的电源管理是通过 ipmi 实现的,因此在 cobbler server 上安装好 ipmitool 就好了。不过对于 2.2.3 的版本来说,并不是很好用,问题比较多。
后来我们研究了一下,还是决定直接使用 dell 的 racadm 工具来管理机器的电源。写个脚本就可以直接 pxe,之后的启动都从 hd 启动了。
$ cat pxe2hd.sh
#! /bin/bash

USER=root
PASSWD=calvin

echo "———————————- change to pxe boot ———————————–"
/opt/dell/srvadmin/sbin/racadm -r $1:22 -u $USER -p $PASSWD config -g cfgServerInfo -o cfgServerBootOnce 1
/opt/dell/srvadmin/sbin/racadm -r $1:22 -u $USER -p $PASSWD config -g cfgServerInfo -o cfgServerFirstBootDevice PXE
/opt/dell/srvadmin/sbin/racadm -r $1:22 -u $USER -p $PASSWD serveraction powercycle
echo "———————————— pxe boot done —————————————"

sleep 200

echo "———————————- change to hd boot ———————————–"
/opt/dell/srvadmin/sbin/racadm -r $1:22 -u $USER -p $PASSWD config -g cfgServerInfo -o cfgSErverFirstBootDevice "HDD"
/opt/dell/srvadmin/sbin/racadm -r $1:22 -u $USER -p $PASSWD config -g cfgServerInfo -o cfgServerBootOnce 0
echo "———————————-  hd boot done —————————————-"

写这篇博客的目的就是告诉大家,2.2.3 的电源管理不好用,自己找其他方案代替。上面是其中一种可行的,经过考验的方案。