6.3 引导(Bootstrapping)
引导层启动服务器的 OS,使服务器达到我们所需要的状态。这个层次包括了 OS 的种类、磁盘容量以及网络配置等。本节我们将介绍利用服务器自动化安装以及虚拟化技术来构建环境的自动化工具。
6.3.1 Kickstart
假如你所在的开发现场添置了 100 台服务器。如果所有的服务器都必须设定同样的磁盘分区、选择初始化安装包、添加账户以及设置密码,你应该怎么做?
虽然也可以为 100 台服务器插入安装 CD,接上键盘,一台一台地配置磁盘分区,但这样会耗费大量的时间。在这种情况下,比较有用的工具就是 Kickstart。
●…… Kickstart 的使用方法
Kickstart 的使用方法 是:安装 Linux 时, 在 kernel 参数中加上 [ks=… ] 这样的选项,就可以从 USB、外置硬盘等外部存储器或 HTTP、FTP 站点加载配置文件以实现安装自动化。
结合 PXE4 启动,只要在插着网线和电源线的状态下按下电源开关,即可自动完成安装。并且不仅限于物理服务器,Kickstart 同样也可用于虚拟机的安装,因此通用性非常好。
4 Preboot Execution Environment,网络启动规格的一种。
●…… 使用时的注意事项
需要注意的是,Kickstart 只能用于 Red Hat Enterprise Linux 系列(以下简称 RHEL 系列)Linux 发布版本的安装。Debian GNU/Linux 系列的 Preseed、Solaris 需要使用 JumpStart 这种其他的安装形式。
有时还需要根据磁盘容量等硬件规格的不同来设置不同的分区方式。在引导层还需要意识到:根据所用的工具以及内容的不同,可以选择的硬件及 OS 等也是有所差异的。
●…… Kickstart 的配置示例
下列代码是在连接网络的状态下,安装并启动服务器的简单配置示例。Kickstart 的内容是将 CD 中安装向导所问的问题以配置文件的形式确定下来。
# Kickstart file automatically generated by anaconda. install url —url=ftp://ftp.jaist.ac.jp/pub/Linux/CentOS/6/os/x8664/ ↑指定通过FTP来安装 lang ja_JP.UTF-8 network —bootproto dhcp keyboard jp106 zerombr clearpart —all part / —fstype ext4 —size=1 —grow —asprimary ↑分区配置的描述。设置为grow的话会将剩余所有的磁盘空间都分配给该分区 part /var —fstype ext4 —size=40960 part /home —fstype ext4 —size=81920 part /boot —fstype ext4 —size=400 part swap —size=4096 bootloader —location=mbr —driveorder=sda —append="crashkernel=auto rhgb quiet" timezone —utc Asia/Tokyo rootpw password ←设置root的初始密码 user —name=defaultuser —groups=users —password=userpass ↑设置首次登陆的用户 selinux —disabled firewall —disabled authconfig —enableshadow —passalgo=sha512 reboot ←安装完成后重启 repo —name="CentOS" —baseurl=ftp://ftp.jaist.ac.jp/pub/Linux/CentOS/6/ os/x86_64/ —cost=100 %packages ←指定安装包的顺序 @base @console-internet @core @debugging @japanese-support @large-systems @network-file-system-client @server-platform @server-policy pax oddjob sgpio certmonger pam_krb5 krb5-workstation #setup start ←包安装完成后运行shell脚本 %post —log=/tmp/anaconda-post.log #—erroronfail function log_mesg() { /bin/echo /bin/echo %POST: $* } log_mesg "Start server setup" yum -y update log_mesg "End server setup" /sbin/ifconfig | /bin/mail -s "Complete Server installation." user_email address@example.com log_mesg "END %POST SCRIPT"可以在 part 部分记载分区配置,在 user 部分创建初始用户并设置密码。还可以配置初始安装的软件包,并且在安装完成后自由地执行 shell 脚本。这里用 yum 命令将包更新到最新状态,最后通过 mail 命令通知 ifconfig 命令的执行结果。
6.3.2 Vagrant
开发人员想试着运行下最新代码的效果时,应该准备怎样的环境才好呢?
●…… 为每一位开发人员准备实体电脑比较困难
有了 Kickstart 这样的机制,为实体电脑安装 OS 已经变得比较简单,但如果为每一位开发人员准备一台专用服务器的话,成本会非常高。另外还有物理上的限制,诸如没有放置的空间或供电不足等问题,因此为每一位开发人员提供一台服务器是并不太现实的。
●…… 使用虚拟机时的注意事项
解决上述问题的办法之一就是将测试环境构建在虚拟机上,但虚拟机的运用、操作多少需要具备特殊的知识,有时可能无法顺利地使用虚拟机。
在还不能方便地使用虚拟机的情况下,可以在和 staging 环境以及手头的开发环境大致相同的运行环境下 checkout 最新的代码,试着确认程序的动作。但各个环境上应用程序所依赖的模块的安装版本存在差异,无法进行验证的情况也是常有的。
轻松地搭建虚拟机,在不影响当前使用环境的前提下就能够进行尝试,安装所需要的模块并实施验证。下面就来介绍一下能够实现上述功能的软件 Vagrant。
●…… 什么是 Vagrant
Vagrant5 主要是通过 CLI(Command Line Interface)来操作名为 VirtualBox6 的虚拟机软件的工具,由 Ruby 编写。这里说“主要”,是因为 Vagrant 还支持 VMware fusion 的操作,并且通过安装插件,还可以实现类似于 AWS 的 IaaS 虚拟机的操作。
Vagrant 不需要特殊的配置,也无需通过鼠标进行复杂的操作。VirtualBox 的运行环境是多种平台的,Windows、Mac、Linux 等只要是 x86 架构的 OS 都可以运行,因此能在多种 OS 上使用。
●…… Vagrant 的安装及运行方法
旧版本(1.1 版以前)的 Vagrant 采用 gem 命令的形式来安装。最新版本以 RPM 或 DEB 包的形式提供,因此可以从官网 7 下载并安装,安装完成后即可开始使用。安装包中除了 Vagrant 的代码之外,还包括 Ruby 的本体等,因此不会和安装对象机器上安装的 Ruby 版本发生冲突。无论在运行有怎样的应用程序的环境上都能方便地运行。
首先就让我们访问 Vagrant 的主页,下载最新的包并安装。安装完成后,从 VagrantBox 支持的 OS 模板列表 8 确认镜像的 URL,并启动虚拟机。
$ vagrant box add centos http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.3-x86_64-v20130101.box $ vagrant init centos $ vagrant up只需这几步操作就能在本地机器上构筑起虚拟的 CentOS 环境。执行 vagrant box add 命令的部分就是将 OS 的镜像加载到 Vagrant 中。vagrant box add 支持多种镜像,可以通过运行 vagrant box list 命令来确认所支持的镜像列表。本例中设置了 CentOS 镜像的 URL,其他如 Ubuntu、BSD 的镜像等也可以在网上找到。
接着让我们试着登录到启动后的虚拟机环境。
$ vagrant sshMac 和 Linux 环境下可以直接登录。Windows 环境因为没有安装 ssh 命令,所以无法通过 vagrant ssh 命令来进行。
在 Windows 环境下登录虚拟机的方法有通过 Tera Term9 等终端进行 SSH 登录,或者在 Cygwin 环境下安装 ssh 命令,通过执行 vagrant ssh 命令进行登录。
9 http://sourceforge.jp/projects/ttssh2/
登录后可以对环境进行各类验证,如果不再需要该镜像或者验证失败、环境损坏的话,能够直接删除虚拟机。
$ vagrant halt $ vagrant destroy像这样,虚拟机的关闭以及删除也可以通过命令轻松地实现。如果还想在新的干净的环境上进行尝试的话,只需执行 vagrant up 命令,就能创建新的虚拟机环境,这样就可以反复地进行尝试。
因为 Vagrant 是由 Ruby 编写的,所以和稍后介绍的 Configuration 工具 Chef 的配合度很高。结合使用 Vagrant 和 Chef,能够反复地实施环境的构建及服务器、中间件的配置的验证。比起在本地环境上实施上述处 理,建议准备好实施 CI 的专用环境,具体的内容将稍后讲解。
