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