从源码包自动构建软件

源码压缩包(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 函数会使这一构建过程变得更方便,因为你可以使用大致相同的代码构建每个包。