如何让 OpenNebula 虚拟机自动获得 IP 等网络配置信息?

制作完 OpenNebula 的 Ubuntu 虚拟机镜像后需要对镜像配置一下以适应所在的网络运行环境,因为我们的 OpenNebula 虚拟机使用的是网桥的方式,所以虚拟机启动后会使用现有网络,并企图从 DHCP 服务器那里获得 IP 地址,如果 DHCP 服务器不做绑定的话这样随便获得的 IP 地址并不符合我们在 small_network.net (onevnet create small_network.net) 定义的要求,我们希望虚拟机启动后能从 small_network.net 这个网络配置文件中获得相应的 IP 地址。OpenNebula 里面的 Contextualizing 部分就是用来对付这种情况的,不过 VPSee 在这里介绍一个更简单的偷懒办法:直接用一个启动脚本来搞定。OpenNebula 已经为我们准备了类似的脚本,只需要根据自己的要求调整一下就可以了,这里介绍 for ubuntu 和 for centos 两个版本的脚本,还有 for debian 和 opensuse 的。

Ubuntu 虚拟机

下载 for ubuntu 的 context 文件后放在合适的地方,这个脚本有点问题需要在下载的 vmcontext.sh 文件最后加上重启网络(/etc/init.d/networking restart)这行:

$ wget http://dev.opennebula.org/attachments/download/378/vmcontext.sh 

$ sudo -i

# mv vmcontext.sh /etc/init.d/vmcontext
# chmod +x /etc/init.d/vmcontext
# ln -sf /etc/init.d/vmcontext /etc/rc2.d/S01vmcontext

# echo "/etc/init.d/networking restart" >> /etc/init.d/vmcontext

CentOS 虚拟机

下载 for centos 的 context 文件后放在合适的地方:

# wget http://dev.opennebula.org/projects/opennebula/repository/revisions/master/raw/share/scripts/centos-5/net-vmcontext/vmcontext

# mv vmcontext.sh /etc/init.d/vmcontext
# chmod +x /etc/init.d/vmcontext
# chkconfig --add vmcontext

# reboot

还记得上次说的给 OpenNebula 虚拟机增加 swap 分区的问题吗,直接把激活 swap 的部分放在 vmcontext 里就不必每次创建虚拟机后再增加 swap 的繁琐工作了。

# echo "swapon /dev/sdb" >> /etc/init.d/vmcontext

在 Ubuntu 11.10 上安装 Sun Grid Engine

Sun Grid Engine(现在叫做 Oracle Gird Engine)是一套开源的分布式资源管理软件,用来统一管理和利用所有(愿意被管理的)电脑上的资源,使得这些电脑(集群)使用起来就像一台电脑一样,好处是可以随意扩展总的计算资源(买更多的电脑加入集群),并且管理上就像使用一台电脑一样方便。使用者只需要把需要计算的工作准备好,提交到 Sun Grid Engine (SGE),SGE 就会根据已经订好的管理策略以及使用者的需求在集群里找到合适的电脑来完成计算工作。SGE 主要用在高性能计算、网格计算等领域。

我们云计算项目里面有个想法就是能在我们的云计算平台上快速创建多个高配置虚拟机并自动接入到 SGE 集群,能迅速满足整个实验室高峰时期的计算需求。目前我们的 SGE 集群包含 2 台 IBM 超级计算机,n 台 PC 服务器和多个刀片服务器,以后为了临时满足高峰时期的计算要求会从云里申请多个虚拟机并自动配置到 SGE 集群里。

安装 Sun Grid Engine 需要 Java 的支持(最好是 SUN 的 Java 版本),所以所有结点都需要安装 Java 包。Ubuntu 从 11.10 版本不在提供 SUN 的官方 Java 版本,需要另外的源:

$ sudo apt-get install python-software-properties
$ sudo add-apt-repository ppa:ferramroberto/java
$ sudo apt-get update
$ sudo apt-get install sun-java6-jre

首先在所有结点上修改 /etc/hosts,grid00 是主控结点,grid01 和 grid02 是执行结点(我们一般把主控结点叫做 master 或者 head,执行结点叫做 client):

$sudo vi /etc/hosts
127.0.0.1	localhost.localdomain	localhost
192.168.2.10	grid00.vpsee.com	grid00
192.168.2.11	grid01.vpsee.com	grid01
192.168.2.12	grid02.vpsee.com	grid02

在主控结点(grid00)上安装 gridengine-master 以及一些管理工具 qhost/qconf/qstat 等(包含在 gridengine-client 中):

$ sudo apt-get install gridengine-client gridengine-common gridengine-master

如果不习惯命令行界面,可以在主控结点上装个 qmon 图形管理工具,界面如下:

$ sudo apt-get install xserver-xorg gridengine-qmon

sun grid engine qmon guy

在所有执行结点(grid01 和 grid02)上安装 gridengine-exec:

$ sudo apt-get install gridengine-exec

在主控结点上执行以下操作把所有的执行结点加到集群里:

$ sudo -i

# qconf -ah grid01
# qconf -ah grid02

在所有执行结点执行以下操作,通过 act_qmaster 这个文件识别主控结点,然后启动服务:

$ sudo echo "grid00.vpsee.com" > /var/lib/gridengine/default/common/act_qmaster

$ sudo /etc/init.d/gridengine-exec start

最后在主控结点上查看一下是否成功:

# qhost
HOSTNAME                ARCH         NCPU  LOAD  MEMTOT  MEMUSE  SWAPTO  SWAPUS
-------------------------------------------------------------------------------
global                  -               -     -       -       -       -       -
grid00.vpsee.com        -               -     -       -       -       -       -
grid01.vpsee.com        lx26-amd64     24 24.00   63.0G    1.7G    3.7G     0.0
grid02.vpsee.com        lx26-amd64      8  0.01   55.2G  642.2M    1.0G     0.0

测试

如何知道这个集群是否能正常工作呢?提交一个任务(job)测试一下。在主控结点上写一个简单脚本打印当前 Linux 内核版本:

# vi uname.sge 
#!/bin/bash
uname -a

然后用 qsub 提交这个脚本到 SGE 集群:

# vi uname.sge 
#!/bin/bash
uname -a

# qsub uname.sge
qsub uname.sge 
Your job 3557 ("uname.sge") has been submitted

如果运行成功就会在某个执行结点的自己目录下面(我这里用的是 root 帐号,所以是 /root 目录)得到2个文件,执行结果就在 uname.sge.o3557 这个文件里:

# ls
uname.sge.e3557  uname.sge.o3557

# cat uname.sge.o3557 
Linux grid02 3.0.0-16-server #29-Ubuntu SMP Tue Feb 14 13:08:12 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

Red Hat 正在悄悄贡献 OpenStack 代码

red hat

据说 OpenStack 刚开始启动的时候 Red Hat 拒绝加入,主要是因为不喜欢 OpenStack 的管理模式(牢牢被抓在 Rackspace 手里),也可能是为了保护自己的云计算产品。不过随着 OpenStack 社区模式日益清晰,Rackspace 将会逐步把 OpenStack 交给社区或基金管理和运作,Red Hat 可能放了点心,从一月份的一篇 Red Hat Quietly Joins the OpenStack Effort 看出,Red Hat 的几个开发人员正在悄悄贡献 OpenStack 代码,估计是为 OpenStack on Fedora 的需要投入了不少人力,也可能是为了以后把 OpenStack 加入到自己的 RHEL 企业版。大家做了什么,看 git 日志最能说明问题。我们来证实一下:

$ git clone https://github.com/openstack/nova.git
$ cd nova
$ git log --since="6 months ago" --pretty=format:"%ae" | grep -v \
"review.openstack.org" | cut -d@ -f2 | sort -n | uniq -c | sort -n | tail -10
     26 jk0.org
     27 canonical.com
     32 nicira.com
     35 citrix.com
     37 openstack.org
     43 codestud.com
     47 cloudscaling.com
    156 redhat.com
    310 gmail.com
    352 rackspace.com

从开发人员的邮件地址来看,显然 Rackspace 贡献最多,有很多人不用公司邮箱用 Gmail,然后就是 Red Hat 了(看这个样子,不像是打几个包修改几个 bug 这么简单),那个貌似和 OpenStack 打的火热的 Ubuntu 公司 Canonical 在哪里?嗯,差不多第9位,让人感到困惑的是 Ubuntu 云计算宣传做的倒是挺足,Ubuntu 还是 OpenStack 开发团队的默认开发测试平台,怎么仔细一看没做啥呢,不会就是把 OpenStack 打包后方便大家 apt-get install 吧?Ubuntu 在 Linux 内核方面没贡献,在 OpenStack 也贡献不多,在忙啥呢~~奇怪没有看到 Dell,貌似 Dell 对 OpenStack 很积极,还集成到了自己的开源项目 Crowbar 里,可能和 Canonical 一样,更多的是集成,而不是开发吧。

今天刚拿到空邮过来的杂志了,貌似作者可以免费收到一本,看了一下自己的文章被改成繁体术语有点别扭,排版出来居然整整正反两面有三页 A4 的纸。

linuxpilot

VMware ESXi 上使用内存预留减少 vswap 文件大小

VMware ESXi 上创建的虚拟机会自动根据虚拟机的内存大小创建一个同等大小的 swap 文件,这个文件通常和虚拟机镜像文件在同一个目录,文件名以 .vswp 结尾。比如创建一个内存为 8GB 的虚拟机,那么 .vswap 就会自动创建,并且大小也是 8GB,保存在同一个 datastore 里。现在问题来了,如果我要创建一个内存为 512GB 的虚拟机,那么 VMware ESXi 就会自动创建一个 512GB 的 .vswap 文件,本地硬盘(datastore)只有 500GB 容不下 .vswap 文件怎么办?前段时间 VPSee 就碰到这个 insufficient disk space on datastore 问题,原因是 VMware ESXi 企图创建一个大小为 512GB 的交换文件,结果 datastore 只有 500GB,所以硬盘空间不够,创建失败:

vmware esxi insufficient disk space

有两个解决办法:

  • 把 .vswap 文件从本机移到其他的 datastore 或者 NFS/SAN 存储上;
  • 修改内存预留值为最大值,点击左边列表的 host,选择右边 Resource Allocation 页面,右键点击 vpsee.com 这个虚拟机后选择 Edit Resource Settings… 出现如下对话框,然后调整 Memory Resources 栏的 Reservation 至最大值 501760MB.

vmware esxi memory reservation

修改后可以在上面这张图的 Resource Allocation 页面的 Memory 部分看到 Reserved Capacity 由 0 变成了 505531 MB,再次启动虚拟机就应该会得到一个内存大小为 500GB 的虚拟机了(host 需要一点内存,所以 512GB 的 host 不能创建 512GB 的虚拟机哦)。

VMware vSphere 标准版1个授权可以用在1个物理 CPU 和 32GB VRAM 上,每台虚拟机最多支持8个 VCPU。这台 512GB 服务器虽然只有4个物理 CPU 却需要 512/32=16 个授权(VMware 新的授权政策是按照 VRAM 算而不是 RAM)。每个标准版授权995美元,16个授权需要约1.6万美元,可能比这台服务器还贵。

如何在 Cobbler 上导入和启动 Ubuntu

Cobbler 在 CentOS/RHEL/Fedora 系的发行版上工作良好,在 CentOS/RHEL/Fedora 上安装 Cobbler 以后可以直接导入 CentOS/RHEL/Fedora ISO 文件,很顺利,不过导入 Ubuntu/Debian ISO 就不是那么幸运了,直接导入 ubuntu-11.10-server-amd64.iso 的话会报错:

# cobbler import –path=/mnt/ –name=ubuntu-11.10-server-amd64
...
sent 710595315 bytes  received 36388 bytes  52639385.41 bytes/sec
total size is 710349452  speedup is 1.00
...
!!! TASK FAILED !!!

忽略上面的错误,会发现在 ks_mirror 下面已经导入了 ubuntu-11.10-server-amd64 整个 ubuntu 目录:

# ls /var/www/cobbler/ks_mirror/
config  ubuntu-11.10-server-amd64

如果对上面已经导入的 ubuntu 目录还不放心的话,可以删除这个目录后手动导入(直接 cp 就行):

# rm -rf /var/www/cobbler/ks_mirror/ubuntu-11.10-server-amd64

# mount -o loop -t iso9660 ubuntu-11.10-server-amd64.iso /mnt

# cp -r /mnt/ /var/www/cobbler/ks_mirror/ubuntu-11.10-server-amd64

完成导入(拷贝)后,做个链接:

# cd /var/www/cobbler/links/
# ln -s /var/www/cobbler/ks_mirror/ubuntu-11.10-server-amd64 ubuntu-11.10-server-amd64

然后加入 distro 和 profile:

# cobbler distro add \
--name=ubuntu-11.10-server-amd64 \
--kernel=/var/www/cobbler/ks_mirror/ubuntu-11.10-server-amd64/install/netboot/ubuntu-installer/amd64/linux \
--initrd=/var/www/cobbler/ks_mirror/ubuntu-11.10-server-amd64/install/netboot/ubuntu-installer/amd64/initrd.gz \
--arch=x86_64 \
--breed=ubuntu \
--ksmeta="directory=/cblr/links/ubuntu-11.10-server-amd64"

# cobbler profile add \
--name=ubuntu-11.10-server-amd64 \
--distro=ubuntu-11.10-server-amd64 \
--kickstart=/var/lib/cobbler/kickstarts/ubuntu-11.10-server-amd64.seed

最后我们需要 ubuntu 能完成自动安装,加入以下 kickstart 脚本 ubuntu-11.10-server-amd64.seed 到 /var/lib/cobbler/kickstarts/ :

# vi /var/lib/cobbler/kickstarts/ubuntu-11.10-server-amd64.seed
d-i     debian-installer/locale string en_US.UTF-8
d-i     debian-installer/splash boolean false
d-i     console-setup/ask_detect        boolean false
d-i     console-setup/layoutcode        string us
d-i     console-setup/variantcode       string
d-i     netcfg/get_nameservers  string
d-i     netcfg/get_ipaddress    string
d-i     netcfg/get_netmask      string 255.255.255.0
d-i     netcfg/get_gateway      string
d-i     netcfg/confirm_static   boolean true
d-i     clock-setup/utc boolean true
d-i     partman-auto/method string regular
d-i     partman-lvm/device_remove_lvm boolean true
d-i     partman-lvm/confirm boolean true
d-i     partman/confirm_write_new_label boolean true
d-i     partman/choose_partition        select Finish partitioning and write changes to disk
d-i     partman/confirm boolean true
d-i     partman/confirm_nooverwrite boolean true
d-i     partman/default_filesystem string ext3
d-i     clock-setup/utc boolean true
d-i     clock-setup/ntp boolean true
d-i     clock-setup/ntp-server  string ntp.ubuntu.com
d-i     base-installer/kernel/image     string linux-server
d-i     passwd/root-login       boolean false
d-i     passwd/make-user        boolean true
d-i     passwd/user-fullname    string ubuntu
d-i     passwd/username string ubuntu
d-i     passwd/user-password-crypted    password $default_password_crypted
d-i     passwd/user-uid string
d-i     user-setup/allow-password-weak  boolean false
d-i     user-setup/encrypt-home boolean false
d-i     passwd/user-default-groups      string adm cdrom dialout lpadmin plugdev sambashare
d-i     apt-setup/services-select       multiselect security
d-i     apt-setup/security_host string security.ubuntu.com
d-i     apt-setup/security_path string /ubuntu
d-i     debian-installer/allow_unauthenticated  string false
d-i     pkgsel/upgrade  select safe-upgrade
d-i     pkgsel/language-packs   multiselect
d-i     pkgsel/update-policy    select none
d-i     pkgsel/updatedb boolean true
d-i     grub-installer/skip     boolean false
d-i     lilo-installer/skip     boolean false
d-i     grub-installer/only_debian      boolean true
d-i     grub-installer/with_other_os    boolean true
d-i     finish-install/keep-consoles    boolean false
d-i     finish-install/reboot_in_progress       note
d-i     cdrom-detect/eject      boolean true
d-i     debian-installer/exit/halt      boolean false
d-i     debian-installer/exit/poweroff  boolean false
d-i     pkgsel/include string openssh-server

Ubuntu 自建「Amazon EC2」私有云

linuxpilot 111

VPSee 上次写的一篇密码保护的文章已经发表在 Linuxpilot 月刊第111期,标题是:Ubuntu 自建「Amazon EC2」私有云,3月14日出版,文章图文并茂详细的描述了如何架设 OpenStack 私有云。这本杂志主要在香港和台湾发行,在香港书报摊、7 Eleven、OK 便利店、书店和多个台湾销售点都能买到,售价是40元港币。我不太清楚大陆书店或报刊亭是否能买到,望买到的朋友能留言告知~~

Linuxpilot月刊第111期簡介

名稱:Linuxpilot 國際中文版
售價:HK$40/NT$160
編輯:蕭友強 主筆:麥經倫
出版:Linux Pilot Ltd.
出版日期:2012年3月14日
對象:企業用戶及進階用戶
頁數:Linuxpilot 76頁+2頁海報+商智謀略 16頁 (全彩印刷)
尺寸:280mm高 x 205mm闊 (A4 Size)
網址:www.linuxpilot.com 電郵:[email protected]
地址:香港九龍觀塘鯉魚門道2號新城工商中心2樓9室

在 CentOS 6.2 上安装 Cobbler

每次給自己的电脑重装系统都是一件很无聊的事情,如果需要重装上百台虚拟机和服务器不但很无聊而且很耗时,面对现在云时代大量服务器和虚拟机的出现,运维必须要自动化。现在有很多开源工具可以帮助我们实现自动化安装系统,比如 FAI, Cobbler, Spacewalk, Ubuntu Orchestra 等,我们打算把 Cobbler 安装在某台虚拟机上,为我们新购的16台刀片服务器自动安装系统。

Cobbler 是一个系统启动服务(boot server),可以通过网络启动(PXE)的方式用来快速安装、重装物理服务器和虚拟机,支持安装不同的 Linux 发行版和 Windows. Cobbler 是个轻量级 Python 程序,总共大概1.5万行代码,还可以用来管理 DHCP, DNS, yum 源等。Cobbler 使用命令行方式管理,也提供了基于 Web 的界面管理工具(cobbler-web),不过命令行方式已经很方便,实在没有必要为了不实用的 Web 界面再添加一个 Web 服务器。

修改 DHCP 服务器配置

使用 Cobbler 最好配合现有局域网上的 DHCP 服务器一起使用,这样不会因为 Cobbler 干扰现有局域网。我们不打算用 Cobbler 来管理整个网络的 DHCP,因为我们已经有了 DHCP 服务器,所以只要在现有的 DHCP 服务器上做以下配置即可,下面记得调整 192.168.2.22 这个 IP 地址指向 Cobbler 服务器:

# for Cobbler setup
host cobbler {
    option host-name "cobbler";
    ddns-hostname "cobbler";
    hardware ethernet 00:0c:29:2d:2c:39; #MAC address of cobbler server
            fixed-address 192.168.2.22; #IP of Cobbler server
            allow booting;
    allow bootp;
    class "PXE" {
        match if substring(option vendor-class-identifier, 0, 9) = "PXEClient";
        next-server 192.168.2.22; #IP of Cobbler server
            filename "pxelinux.0";
    }
}

安装和配置 Cobbler

Cobbler 不在 CentOS 6.2 的基本源中,需要导入 EPEL 源:

# rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-5.noarch.rpm
Retrieving http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-5.noarch.rpm
warning: /var/tmp/rpm-tmp.lo2Hd0: Header V3 RSA/SHA256 Signature, key ID 0608b895: NOKEY
Preparing...                ########################################### [100%]
   1:epel-release           ########################################### [100%]

# yum update
# yum upgrade

安装 cobbler:

# yum install cobbler

修改配置,主要修改 cobbler 服务器所在的 IP 地址:

# vi /etc/cobbler/settings
...
next_server: 192.168.2.22 #IP of Cobbler server
server: 192.168.2.22 #IP of Cobbler server
...

启用 httpd, xinetd 和 cobbler 服务并确认已经加到系统自动启动服务中:

# /etc/init.d/httpd start
# /etc/init.d/xinetd start
# /etc/init.d/cobblerd start

# chkconfig httpd on
# chkconfig xinetd on
# chkconfig cobblerd on

修改 rsync 和 tftp 这两个服务的 xinetd 配置:

# vi /etc/xinetd.d/rsync
service rsync
{
        disable = no
...
}

# vi /etc/xinetd.d/tftp
service tftp
{
        ...
        disable = no
        ...
}

关闭防火墙和 SELinux 后重启系统:

# /etc/init.d/iptables stop
# chkconfig iptables off

# vi /etc/sysconfig/selinux
...
SELINUX=disabled
...

# reboot

检查和修改 Cobbler 配置

系统重启后用 cobbler check 检查发现3个配置信息问题,第一个是如果要部署 debian/ubuntu 系统需要 debmirror 软件包;第二个是需要修改 cobbler 的默认密码;第三个是可选,想使用电源管理功能的话需要安装 cman 或 fence-agents:

# cobbler get-loaders

# cobbler check
The following are potential configuration items that you may want to fix:

1 : debmirror package is not installed, it will be required to manage debian deployments and repositories
2 : The default password used by the sample templates for newly installed machines (default_password_crypted in /etc/cobbler/settings) is still set to 'cobbler' and should be changed, try: "openssl passwd -1 -salt 'random-phrase-here' 'your-password-here'" to generate new one
3 : fencing tools were not found, and are required to use the (optional) power management features. install cman or fence-agents to use them

Restart cobblerd and then run 'cobbler sync' to apply changes.

现在来修复上面三个问题,我们希望能让这台 cobbler 服务器能同时部署 CentOS/Fedora 和 Debian/Ubuntu 系统,所以需要安装 debmirror,安装 debmirror-20090807-1.el5.noarch.rpm 前需要先安装依赖包:

# yum install wget
# yum install ed patch perl perl-Compress-Zlib perl-Cwd perl-Digest-MD5 \
perl-Digest-SHA1 perl-LockFile-Simple perl-libwww-perl

# wget ftp://fr2.rpmfind.net/linux/epel/5/ppc/debmirror-20090807-1.el5.noarch.rpm

# rpm -ivh debmirror-20090807-1.el5.noarch.rpm 

修改 /etc/debmirror.conf 配置文件,注释掉 @dists 和 @arches 两行:

# vi /etc/debmirror.conf
...
#@dists="sid";
@sections="main,main/debian-installer,contrib,non-free";
#@arches="i386";
...

用 openssl 生成一串密码后加入到 cobbler 的配置文件(/etc/cobbler/settings)里,替换 default_password_crypted 字段:

# openssl passwd -1 -salt 'www.vpsee.com' 'vpsee'
$1$www.vpsee$T5FgCHY2P0NDr6JmbN0Bl0

# vi /etc/cobbler/settings
default_password_crypted: "$1$www.vpsee$T5FgCHY2P0NDr6JmbN0Bl0"

安装 cman:

# yum install cman

修复完成,再用 cobbler check 检查一下,确认没问题后用 cobbler sync 做同步操作:

# cobbler check
No configuration problems found.  All systems go.

# cobbler sync

导入 ISO

挂载 CentOS-6.2-x86_64-bin-DVD1.iso 安装光盘然后导入到 cobbler(注意这个 iso 文件有 4GB 多,导入可能需要一段时间),导入成功后 cobbler list 查看一下:

# mount -o loop -t iso9660 CentOS-6.2-x86_64-bin-DVD1.iso /mnt

# cobbler import --path=/mnt --name=CentOS-6.2-x86_64-bin-DVD1 –arch=x86_64

# cobbler sync

# cobbler list
distros:
   CentOS-6.2-bin-DVD1-x86_64

profiles:
   CentOS-6.2-bin-DVD1-x86_64

systems:

repos:

images:

测试

最后创建一台虚拟机测试一下,把虚拟机设置成网络 PXE 启动(和 cobbler 在同一个网络),启动后就可以看到 Cobbler 引导界面,看到界面后选择 CentOS-6.2-bin-DVD1-x86_64 条目就可以顺利开始无人工干预安装系统,Cobbler 引导界面如下:

boot os from cobbler net pxe

安装完系统后默认的密码是啥呢?根据 sample.ks 的配置提示,这个密码 $default_password_crypted 就是我们上面用 openssl passwd -1 -salt ‘www.vpsee.com’ ‘vpsee’ 生成的密码,所以这里的 root 密码是 vpsee:

# cat /var/lib/cobbler/kickstarts/sample.ks
...
#Root password
rootpw --iscrypted $default_password_crypted

在 CentOS 6.2 上安装 Puppet 配置管理工具

puppet logo

云计算时代系统管理员会经常陷入一系列的重复任务中,创建虚拟机,安装或重装系统,升级软件包,管理配置文件,添加、管理和配置系统服务等。这些任务低效而且无聊,我们需要把他们自动化,于是就出现了系统管理员自己写的脚本,用定制脚本实现自动化,但是自己写的脚本要保证能顺利运行在不同的平台上不是一件轻松的工作,每次操作系统更新都需要重新测试定制脚本,耗费大量时间和精力,灵活性和功能也很难保证。而且脚本语言虽然简单,但是自己写的脚本不一定别的管理员就能马上看懂,有时候自己看别人写的脚本或代码不是一件愉快的事情。所以出现了类似 Puppet, Chef 这样的自动化配置管理工具。为啥 Linode 只有19人就能应付上千服务器上万用户,这就是自动化带来的好处。

Puppet 是一个客户端/服务器(C/S)架构的配置管理工具,在中央服务器上安装 puppet-server 服务器(puppet master),在需要被管理的目标服务器上安装 puppet 客户端软件(puppet client)。当客户端连接上服务器后,定义在服务器上的配置文件会被编译,然后在客户端上运行。客户端每隔半小时主动会和服务器通信一次,确认配置信息的更新情况,如果有新的配置信息(或者配置有变化),配置文件将会被重新编译并分发到客户端执行。当然,也可以在服务器上主动触发更新指令来强制各客户端进行配置更新。

以下安装采用两台服务器,一台是 master.vpsee.com 用来安装 puppet-server 服务;一台是 client.vpsee.com 用来安装 puppet 客户端。

Puppet 要求所有机器有完整的域名(FQDN),如果没有 DNS 服务器提供域名的话,可以在两台机器上设置主机名(注意要先设置主机名再安装 Puppet,因为安装 Puppet 时会把主机名写入证书,客户端和服务端通信需要这个证书):

# vi /etc/hosts
192.168.2.10    master master.vpsee.com
192.168.2.11    client client.vpsee.com

Puppet 要求所有机器上的时钟保持同步,所以需要安装和启用 ntp 服务(如果采用 CentOS-6.2-x86_64-minimal.iso 最小化安装,需要额外安装这个软件包)。

# yum install ntp

# chkconfig ntpd on

# ntpdate pool.ntp.org
29 Feb 15:22:47 ntpdate[15867]: step time server 196.25.1.1 offset 98.750417 sec

# service ntpd start
Starting ntpd:                                             [  OK  ]

安装 puppet 服务

Puppet 需要 Ruby 的支持,如果要查看命令行帮助的话需要额外 ruby-rdoc 这个软件包:

# yum install ruby ruby-libs ruby-rdoc

Puppet 不在 CentOS 的基本源中,需要加入 PuppetLabs 提供的官方源:

# yum -y install wget

# wget http://yum.puppetlabs.com/el/6/products/x86_64/puppetlabs-release-6-1.noarch.rpm

# yum install puppetlabs-release-6-1.noarch.rpm

# yum update

在 master 上安装和启用 puppet 服务:

# yum install puppet-server

# chkconfig puppet on

# service puppetmaster start
Starting puppetmaster:                                     [  OK  ]

关闭 iptables:

# /etc/init.d/iptables stop
iptables: Flushing firewall rules:                         [  OK  ]
iptables: Setting chains to policy ACCEPT: filter          [  OK  ]
iptables: Unloading modules:                               [  OK  ]

安装 puppet 客户端

在 client 上安装 puppet 客户端:

# yum install puppet

Puppet 客户端使用 HTTPS 和服务端(master)通信,为了和服务器端通信必须有合法的 SSL 认证,第一次运行 puppet 客户端的时候会生成一个 SSL 证书并指定发给 Puppet 服务端。

# puppet agent --no-daemonize --onetime --verbose --debug --server=master.vpsee.com

Puppet 服务端接受到客户端的证书后必须签字(sign)才能允许客户端接入,sign 后用 puppet cert list –all 查看会发现 client.vpsee.com 前面多了一个 + 后,表示 “加入” 成功:

# puppet cert list --all
  client.vpsee.com (65:3C:20:82:AE:F6:23:A8:0A:0B:09:EF:05:64:1D:BB)
+ master.vpsee.com   (AF:A0:32:78:D4:EB:D3:EE:02:1C:62:1C:83:3C:46:EC) (alt names: DNS:master, DNS:master.vpsee.com)

# puppet cert --sign client.vpsee.com
notice: Signed certificate request for client.vpsee.com
notice: Removing file Puppet::SSL::CertificateRequest client.vpsee.com at '/var/lib/puppet/ssl/ca/requests/client.vpsee.com.pem'

# puppet cert list --all
+ client.vpsee.com (65:3C:20:82:AE:F6:23:A8:0A:0B:09:EF:05:64:1D:BB)
+ master.vpsee.com   (AF:A0:32:78:D4:EB:D3:EE:02:1C:62:1C:83:3C:46:EC) (alt names: DNS:master, DNS:master.vpsee.com)

这样,客户端和服务端就配置好了,双方可以通信了。

Hello, world

现在可以在服务端写个小例子来测试一下。这个例子作用很简单,用来在客户端的 /tmp 目录下新建一个 helloworld.txt 文件,内容为 hello, world. 在服务端编写代码:

# vi /etc/puppet/manifests/site.pp
node default {
        file {
                "/tmp/helloworld.txt": content => "hello, world";
        }
}

在客户端上执行 puppet,运行成功后会在 /tmp 看到新生成的 helloworld.txt:

$ puppet agent --test --server=master.vpsee.com
warning: peer certificate won't be verified in this SSL session
info: Caching certificate for client.vpsee.com
info: Caching certificate_revocation_list for ca
info: Caching catalog for client.vpsee.com
info: Applying configuration version '1330668451'
notice: /Stage[main]//Node[default]/File[/tmp/helloworld.txt]/ensure: defined content as '{md5}e4d7f1b4ed2e42d15898f4b27b019da4'
info: Creating state file /home/vpsee/.puppet/var/state/state.yaml
notice: Finished catalog run in 0.03 seconds

$ cat /tmp/helloworld.txt 
hello, world

如果想偷懒,可以直接使用 Example42 的开源 Puppet 模块

在 VMware ESXi 5.0 上安装网卡驱动

昨天刚发现新购的 Dell PowerEdge R710 服务器上配的 Intel Ethernet Server Adapter X520-T2 万兆网卡居然在 VMware ESXi 里找不到,查了一下有 VMware 的官方驱动,不过需要另外安装。

到 VMWare 官方网站下载网卡驱动,然后上传到 VMware ESXi 服务器的一个临时目录 /tmp(用 scp 上传的话当然首先要开启 VMware ESXi 的 SSH 服务):

$ scp ixgbe-3.4.23-458775.zip [email protected]:/tmp

ssh 登陆到 VMware ESXi 服务器后解压驱动包,解压后会得到后缀为 .vib 的驱动文件:

$ ssh [email protected]
Password: 
The time and date of this login have been sent to the system logs.

VMware offers supported, powerful system administration tools.  Please
see www.vmware.com/go/sysadmintools for details.

The ESXi Shell can be disabled by an administrative user. See the
vSphere Security documentation for more information.
~ # cd /tmp/
/tmp # unzip ixgbe-3.4.23-458775.zip 
Archive:  ixgbe-3.4.23-458775.zip
  inflating: ixgbe-3.4.23-offline_bundle-458775.zip
  inflating: net-ixgbe-3.4.23-1OEM.500.0.0.406165.x86_64.vib
  inflating: doc/README.txt
  inflating: source/driver_source_net-ixgbe_3.4.23-1OEM.500.0.0.406165.tgz
  inflating: doc/open_source_licenses_net-ixgbe_3.4.23-1OEM.500.0.0.406165.txt
  inflating: doc/release_note_net-ixgbe_3.4.23-1OEM.500.0.0.406165.txt

使用 esxcli 命令行安装 vib 驱动并检查是否安装成功:

/tmp # esxcli software vib install -v /tmp/net-ixgbe-3.4.23-1OEM.500.0.0.406165.x86_64.vib 
Installation Result
   Message: The update completed successfully, but the system needs to be rebooted for the changes to be effective.
   Reboot Required: true
   VIBs Installed: Intel_bootbank_net-ixgbe_3.4.23-1OEM.500.0.0.406165
   VIBs Removed: 
   VIBs Skipped: 

/tmp # esxcli software vib list
Name                  Version                             Vendor  Acceptance Level  Install Date
--------------------  ----------------------------------  ------  ----------------  ------------
net-ixgbe             3.4.23-1OEM.500.0.0.406165          Intel   VMwareCertified   2012-02-24
...

安装成功后重启 VMware ESXi,然后查看一下 Intel Corporation 10-Gigabit 网卡驱动是否能被正确识别出来:

/tmp # lspci | grep 'Network controller'
000:001:00.0 Network controller: Broadcom Corporation Broadcom NetXtreme II BCM5709 1000Base-T [vmnic0]
000:001:00.1 Network controller: Broadcom Corporation Broadcom NetXtreme II BCM5709 1000Base-T [vmnic1]
000:002:00.0 Network controller: Broadcom Corporation Broadcom NetXtreme II BCM5709 1000Base-T [vmnic2]
000:002:00.1 Network controller: Broadcom Corporation Broadcom NetXtreme II BCM5709 1000Base-T [vmnic3]
000:007:00.0 Network controller: Intel Corporation 82599EB 10-Gigabit SFI/SFP+ Network Connection [vmnic4]
000:007:00.1 Network controller: Intel Corporation 82599EB 10-Gigabit SFI/SFP+ Network Connection [vmnic5]
000:008:00.0 Network controller: Intel Corporation 82599EB 10-Gigabit SFI/SFP+ Network Connection [vmnic6]
000:008:00.1 Network controller: Intel Corporation 82599EB 10-Gigabit SFI/SFP+ Network Connection [vmnic7]

使用 vSphere Client 客户端登入 VMware ESXi 以后,进入 Configuration 页面的 Network Adapters 应该会看到新安装的 vmnic4, vmnic5, vmnic6, vmnic7 4个网卡接口了,或者直接在 ESXi 上用命令行界面:

~ # esxcfg-nics -l
Name    PCI           Driver      Link Speed     Duplex MAC Address       MTU    Description                   
...
vmnic4  0000:07:00.00 ixgbe       Up   10000Mbps Full   90:e2:ba:05:2d:fc 1500   Intel Corporation 82599EB 10-Gigabit SFI/SFP+ Network Connection
vmnic5  0000:07:00.01 ixgbe       Down 0Mbps     Half   90:e2:ba:05:2d:fd 1500   Intel Corporation 82599EB 10-Gigabit SFI/SFP+ Network Connection
vmnic6  0000:08:00.00 ixgbe       Down 0Mbps     Half   90:e2:ba:05:29:98 1500   Intel Corporation 82599EB 10-Gigabit SFI/SFP+ Network Connection
vmnic7  0000:08:00.01 ixgbe       Up   10000Mbps Full   90:e2:ba:05:29:99 1500   Intel Corporation 82599EB 10-Gigabit SFI/SFP+ Network Connection

Protected: OpenStack 杂志稿(已在杂志上发表,editors only)

This content is password protected. To view it please enter your password below: