No Dependencies

The machines being managed require no special dependencies to be installed. As long as they have bash and ssh running, they can be used with pallet. For me this was important - it means that you can use pretty much any image out there, which is great for ad-hoc testing and development.

No Server

Pallet has no central server to set up and maintain - it simply runs on demand. You can run it from anywhere, even over a remote REPL connection.

Everything in Version Control

In pallet, all your configuration is handled in SCM controlled files - there is no database involved. This means that your configuration can always be kept in step with the development of your crates, and the versions of the external crates that you use.

Jar File Distribution of Crates

Custom crates can be distributed as jar files, and so can be published in maven repositories, and be consumed in a version controlled manner. Hopefully this will promote shared crates.

Provisioning, Configuration and Administration

Pallet aims quite wide. You can use it for starting and stopping nodes, for configuring nodes, deploying projects and also for running administration tasks. To be honest, this wasn't an initial design goal, but has come out of the wash that way.

How it works

Pallet is written in Clojure, and so runs in a JVM. You can embed it in any JVM based project, or use it directly at the REPL.

Pallet talks to a cloud provider , in order to start up new nodes, etc. It does this using the excellent jclouds library. Once the nodes are running, Pallet uses SSH to communicate with the nodes.

To execute actions on the nodes, pallet executes shell scripts. These scripts are generated in clojure. At the lowest level, Pallet embeds shell script in clojure, and wraps shell script fragments into clojure functions, creating reusable resources.

Of course, no two operating systems are identical, so Pallet allows dispatching of the functions based on packager, etc, enabling abstraction of a node's operating system.

Higher level crates are then put together, that use the resources to install packages, etc. Crates can also be implemented using the same machinery as resource functions.

Node types are defined that specify a tag and the sequence of crates to apply for each of a number of phases. By default, pallet defines bootstrap and configure phases, but you can add as many phases as you like (e.g. backup).

Phases are executed using either the converge or lift commands, with converge also adjusting the number of nodes running for each tag.