drrb/puppet-library

View on GitHub
README.md

Summary

Maintainability
Test Coverage
# Puppet Library

A private Puppet Forge. Compatible with [librarian-puppet](http://librarian-puppet.com).

[![Build Status](https://api.travis-ci.org/drrb/puppet-library.svg)](https://travis-ci.org/drrb/puppet-library)
[![Coverage Status](https://img.shields.io/coveralls/drrb/puppet-library.svg)](https://coveralls.io/r/drrb/puppet-library)
[![Code Climate](https://img.shields.io/codeclimate/github/drrb/puppet-library.svg)](https://codeclimate.com/github/drrb/puppet-library)

[![Gem Version](https://badge.fury.io/rb/puppet-library.svg)](http://badge.fury.io/rb/puppet-library)
[![Dependency Status](https://gemnasium.com/drrb/puppet-library.svg)](https://gemnasium.com/drrb/puppet-library)

Puppet Library serves Puppet modules in the same format as [the Puppet Forge](http://forge.puppetlabs.com). This allows you to create a private Puppet Forge and manage all the modules you use completely within your infrastructure.

Plugins can be created to serve modules from arbitrary sources. Puppet Library contains built-in support for:
 - serving packaged (`.tar.gz`) modules from a directory (or directories) of your choosing
 - proxying a remote forge (or forges)
 - caching proxied forges to disk
 - serving modules from source on disk
 - serving modules from Git repositories using tags as version numbers!

## Demo

Puppet Library has a web UI to browse the modules. A demo is available [here](http://puppet-library.herokuapp.com).

## Installation

Install the server as a Gem:

    $ gem install puppet-library

Or, to get the latest, you can install from source

    $ git clone https://github.com/drrb/puppet-library.git
    $ cd puppet-library
    $ rake install

## Getting Started

Create a module directory and add the modules to it

    $ mkdir modules
    $ wget -P modules/ forge.puppetlabs.com/system/releases/p/puppetlabs/puppetlabs-apache-0.9.0.tar.gz
    $ wget -P modules/ forge.puppetlabs.com/system/releases/p/puppetlabs/puppetlabs-concat-1.0.0.tar.gz
    $ wget -P modules/ forge.puppetlabs.com/system/releases/p/puppetlabs/puppetlabs-stdlib-2.4.0.tar.gz

Start the server

    $ puppet-library --port 9292 --module-dir ./modules

Point librarian-puppet to the server

    $ cat > Puppetfile <<EOF
    forge 'http://localhost:9292'

    mod 'puppetlabs/apache', '0.9.0'
    EOF

Resolve and download the modules

    $ librarian-puppet install

## Usage

Run the server (proxies the Puppet Forge by default)

    $ puppet-library

Serve modules from a specific directory

    $ puppet-library --module-dir /var/puppet-modules

Serve modules from a remote forge as a proxy

    $ puppet-library --proxy http://forge.puppetlabs.com

Proxy a remote forge, caching downloaded modules on disk

    $ puppet-library --proxy http://forge.puppetlabs.com --cache-basedir

Serve a module from source

    $ puppet-library --source-dir ~/code/puppetlabs-apache

Serve modules on a specific port

    $ puppet-library --port 8888

See all options

    $ puppet-library --help

## Back-Ends

Puppet Library contains built-in support for:
 - serving packaged (`.tar.gz`) modules from a directory (or directories) of your choosing
 - proxying a remote forge (or forges)
 - serving modules from source on disk
 - serving modules from Git repositories using tags as version numbers!
 - serving modules from a combination of the above

## Compatibility with other tools

### Dependency Resolution/Installation

Puppet Library currently supports:
- search with Puppet (`puppet module search apache`)
- dependency resolution and installation with Puppet (`puppet module install puppetlabs/apache`)
- dependency resolution and installation with [librarian-puppet](http://librarian-puppet.com)
- installation with [r10k](https://github.com/adrienthebo/r10k)

### Ruby

Puppet Library is tested against Ruby versions:
- 1.8.7
- 1.9.3
- 2.0.0
- 2.1.0

### Puppet

Puppet Library implements version 1 of the Forge API, and supports reading
module metadata from modules' Modulefiles. This means that Puppet Library
can currently only work with Puppet < 3.6, which uses the new Forge API (v3)
and has switched to using `metadata.json` instead of `Modulefile`. Progress
can be tracked [here](https://github.com/drrb/puppet-library/issues?milestone=1).

## Config file (EXPERIMENTAL)

Instead of specifying command-line options, you can configure Puppet Library with a configuration file.
To use a configuration file, point to it on the command line:

```sh
puppet-library --config-file my-puppet-library-config.yml
```

A configuration file looks like this:

```yaml
port: 4567
hostname: example.com
server: thin
daemonize: true
pidfile: /var/run/puppetlibrary.pid
forges:
    - Directory: /var/lib/modules
    - Directory: /var/lib/other-modules
    - Source: /var/code/puppetlabs-apache
    - Proxy: http://forge.puppetlabs.com
```

## Running with Phusion Passenger (EXPERIMENTAL)

To run Puppet Library with [Phusion Passenger](https://www.phusionpassenger.com):

```sh
# Install Puppet Library
sudo gem install puppet-library

# Create a Passenger-compatible directory structure
mkdir -p /webapps/puppet-library/{public,tmp}

# Create a Rack config file to point Puppet Library to your modules
cat > /webapps/puppet-library/config.ru <<EOF
require "rubygems"
require "puppet_library"

# NB: this config API is not yet stable, and may change without notice.
# The format shown is valid from Puppet Library v0.11.0. See below for
# all valid config items
server = PuppetLibrary::Server.configure do
    # Proxy the Puppet Forge
    forge :proxy do
        url "http://forge.puppetlabs.com"
    end
end

run server
EOF

# Create an Apache virtual host pointing at Puppet Library
cat > /etc/httpd/conf.d/puppetlibrary.conf <<EOF
<VirtualHost *:80>
    ServerName privateforge.example.com
    DocumentRoot /webapps/puppet-library/public
    <Directory /webapps/puppet-library/public>
        Allow from all
        Options -MultiViews
    </Directory>
</VirtualHost>
EOF
```

The following config items will currently work with the Rack config format (see above):

```ruby
# NB: this config API is not yet stable, and may change without notice.
# The format shown is valid from Puppet Library v0.11.0
server = PuppetLibrary::Server.configure do
    # Serve modules from a directory on disk
    forge :directory do
        path "/var/lib/modules"
    end

    # Serve module versions from a Git repository
    forge :git_repository do
        source "http://github.com/example/puppetlabs-apache-fork.git"
        include_tags /[0-9.]+/
    end

    # Proxy a remote forge
    forge :proxy do
        url "http://forge.example.com"
    end

    # Proxy a remote forge, caching modules to disk
    forge :cache do
        url "http://forge.puppetlabs.com"
        path "/var/puppet/modules/cache"
    end
end
```


## Contributing

1. Fork it
2. Create your feature branch (`git checkout -b my-new-feature`)
3. Make your changes, and add tests for them
4. Test your changes (`rake`)
5. Commit your changes (`git commit -am 'Add some feature'`)
6. Push to the branch (`git push origin my-new-feature`)
7. Create new Pull Request

## Acknowledgements

This project was inspired by [dalen/simple-puppet-forge](https://github.com/dalen/simple-puppet-forge).

## License

Puppet Library
Copyright (C) 2014 drrb

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.