配置 GEM 仓库

使用另外的不兼容的包系统是每个系统管理员的梦想。 如果你要管理 Ruby 或 Rails 应用程序,就需要处理 Rubygems。 与维护自己的 APT 仓库一样,维护你自己的 gem 仓库 会有很多优点。 你可以控制包的可用性和包的版本,也可以根据需要发布你自己的 Rubygems。

操作步骤

  1. 使用如下内容创建 /etc/puppet/modules/repo/manifests/gem-server.pp 文件:

    class repo::gem-server {
        include apache
    
        file { "/etc/apache2/sites-available/gemrepo":
            source  => "puppet:///modules/repo/gemrepo.conf",
            require => Package["apache2-mpm-worker"],
            notify  => Service["apache2"],
        }
    
        file { "/etc/apache2/sites-enabled/gemrepo":
            ensure  => symlink,
            target  => "/etc/apache2/sites-available/gemrepo",
            require => File["/etc/apache2/sites-available/gemrepo"],
            notify  => Service["apache2"],
        }
    
        file { "/var/gemrepo":
            ensure => directory,
        }
    }
    
  2. 使用如下内容创建 /etc/puppet/modules/repo/files/gemrepo.conf 文件:

    <VirtualHost *:80>
        ServerAdmin [email protected]
        ServerName gems.bitfieldconsulting.com
        ErrorLog logs/gems.bitfieldconsulting.com-error_log
        CustomLog logs/gems.bitfieldconsulting.com-access_log common
    
        Alias / /var/gemrepo/
        <Location />
            Options Indexes
        </Location>
    </VirtualHost>
    
  3. 在配置清单的节点中添加如下代码:

    node cookbook {
        include repo::gem-server
    }
    
  4. 运行 Puppet:

    # puppet agent --test
    info: Retrieving plugin
    info: Caching catalog for cookbook.bitfieldconsulting.com
    info: Applying configuration version '1304949279'
    
    notice: /Stage[main]/Repo::Gem-server/File[/etc/apache2/
    sites-available/gemrepo]/ensure: defined content as '{md5}
    ae1fd948098f14503de02441d02a825d'
    
    info: /Stage[main]/Repo::Gem-server/File[/etc/apache2/sitesavailable/
    gemrepo]: Scheduling refresh of Service[apache2]
    
    notice: /Stage[main]/Repo::Gem-server/File[/etc/apache2/sitesenabled/
    gemrepo]/ensure: created
    
    info: /Stage[main]/Repo::Gem-server/File[/etc/apache2/sitesenabled/
    gemrepo]: Scheduling refresh of Service[apache2]
    
    notice: /Stage[main]/Apache/Service[apache2]: Triggered 'refresh'
    from 2 events
    
    notice: /Stage[main]/Repo::Gem-server/File[/var/gemrepo]/ensure:
    created
    
    notice: Finished catalog run in 6.52 seconds
    

工作原理

其原理与 APT 仓库的例子是完全一样的。我们首先定义了一个 gem 仓库的存放目录, 然后定义了一个 Apache 的虚拟主机,使其能够响应 gems.bitfieldconsulting.com 的请求。

更多用法

与 APT 仓库类似,仅有空仓库是无用的,下面将演示如何将 gem 包纳入仓库, 以及如何配置你的节点访问自己的 gem 仓库。

添加 gem 仓库

向你的仓库添加新的 gems 包很简单。将 gem 文件存入 /var/gemrepo/gems 目录, 然后在 /var/gemrepo 目录下运行如下命令即可:

# gem generate_index
使用 gem 仓库

像使用 APT 仓库一样,首先确保你的节点能够解析主机名 gems.bitfieldconsulting.com, 既可以使用 Puppet 部署 host 资源,也可以通过配置 DNS 实现。

然后在 Puppet 中使用如下代码指定一个 gem 软件包:

package { "json":
    provider => "gem",
    source => "http://gems.bitfieldconsulting.com ",
}