从源码包自动构建软件
源码压缩包(tarball)会严重损害你的健康。你既可以使用 发行版(distro)或第三方软件包, 同时从源码包构建你自己的软件包也是可取的,这有时还会有许多工作要做。 创建 Debian 软件包(或者其他风格的软件包)会是一个漫长而容易出错的过程, 而且你可能没有时间或预算构建它。
如果你必须从源代码构建你的程序,至少 Puppet 可以帮你实现这一过程。 一般地构建过程是自动化的,否则你就得手工构建:
下载源码包
解压源码包
配置(Configure)并构建(build)程序
安装已构建的程序
在下面的例子中,我们将从源码构建 OpenSSL(虽然在生产环境中你应该使用发行版提供的软件包, 但这是一个有用的演示示例)。
操作步骤
添加如下代码到你的配置清单:
exec { "build-openssl": cwd => "/root", command => "/usr/bin/wget ftp://ftp.openssl.org/source/ openssl-0.9.8p.tar.gz && /bin/tar xvzf openssl-0.9.8p.tar. gz && cd openssl-0.9.8p && ./Configure linux-generic32 && make install", creates => "/usr/local/ssl/bin/openssl", logoutput => on_failure, timeout => 0, }
运行 Puppet (这可能会执行一段时间!):
# puppet agent --test info: Retrieving plugin info: Caching catalog for cookbook.bitfieldconsulting.com info: Applying configuration version '1304954159' notice: /Stage[main]//Node[cookbook]/Exec[build-openssl]/returns: executed successfully notice: Finished catalog run in 554.00 seconds
工作原理
exec 命令被 && 运算符分割成了五个阶段。也就是说每个阶段的命令若执行失败, 整个命令将会失败且停止运行。 当你想确保每个子命令都成功运行之后才运行下一个子命令时,这是一种有用的构造方法。
第一阶段,下载源码包:
/usr/bin/wget ftp://ftp.openssl.org/source/openssl-0.9.8p.tar.gz
第二阶段,解压源码包:
/bin/tar xvzf openssl-0.9.8p.tar.gz
第三阶段,进入源码树的目录:
cd openssl-0.9.8p
第四阶段,运行配置脚本(通常还会指定一些自定义选项):
./Configure linux-generic32
最后阶段,创建并安装软件:
make install
由于这是一个漫长的过程,你不想每次运行 Puppet 时都运行它,我们指定了一个条件, 即被创建的文件是否应经存在:
creates => "/usr/local/ssl/bin/openssl",
无论出于任何原因,如果需要重建,你可以删除此文件。
错误并非只发生在首次编译的情况。在出现问题时,我们指定了 logoutput 参数, 它将为我们显示编译或构建过程中的出错信息:
logoutput => on_failure,
最后,因为编译过程可能会持续一段时间,所以将 timeout 参数设置成了 0 (默认情况下,Puppet 执行 exec 命令 5 分钟后就会超时):
timeout => 0,
更多用法
如果你有一批必须从源代码构建的软件,那么将上述的 exec 放入一个 define 函数会使这一构建过程变得更方便,因为你可以使用大致相同的代码构建每个包。