descriptionTools for creating deployable scripts/programs
last changeWed, 4 Feb 2015 19:42:23 +0000
Content tags:


deployable is a suite of programs that help easing the system administrator life.

It is based upon the following workflow to distribute changes in a molteplicity of servers:

For the first issue, you'll probably have various files/scripts/programs that you will need to perform a given activity. The deployable script helps you select all the needed components that you need in the target server, and bundles them all inside a single, self-contained script that is ready to be run in the target machine. In this way, you'll only have to worry about taking one single file. Think about making an archive, but adding some logic to make it executable and instruct it to execute some specific programs.

For the second issue, it's mainly a matter of handling the transfer of the deploy script to the target servers, and execute them. This is obviously only a matter of sftp/ssh, but if you have more than 2 servers you'll quickly get tired of writing shell commands and passwords. To ease your life in this field, deploy is your friend: just tell it which is the script, and the list of target servers.


The deployable project contains the following files:

deployable (the script)
generates self-contained scripts with all the files that you want to ship as part of your deployment task;
helps you distribute and execute the deploy script generated with deployable above in all the relevant servers;
bundles Perl modules inside a Perl script, in order to ensure that those modules will be available in the target system (works only for Pure Perl modules);
script that is used by deployable to generate the self-contained scripts that can be distributed like advanced tarballs;
support file for embedding Archive::Tar inside remote


In a typical usage, you check some upgrade procedure in a staging environment, and come up with:

Suppose that you come up with the following situation:

  # files that must be simply installed under "/", after stripping
  # the initial "/project/target-root/" part
  # scripts to be executed in the target directory, set as executable
  # files to support scripts, not set as executable

In order to put all this stuff into a single executable perl file you use deployable. In particular, you can instruct this program about where you would like to put all the relevant stuff:

  cd /project
  deployable --all-exec -o --root target-root *.sh userlist

This command produces the script that is compound of two parts:

The tarball is organised as follows:

In the example above, all the suff in target-root is placed under root; all the other files (the three scripts and the support file) are put inside the here directory:


The first part of the produced script is able to extract this tarball from itself and figure out where the different pieces have to be put. In particular, stuff under the root directory will be installed in /, and the other files in a temporary directory for further processing.

After the extraction is completed, the produced script checks if any program should be executed. Having passed the --all-exec, all executable files in the temporary directory will be executed; the order will be that resulting froma lexicographical sorting of the file names, so it's a good idea to put a leading number in order to control the execution closely.

Once you have this single script containing all what you need, plus the logic to start the deploy process in the target machine, you can put it in the target and execute it. If it's a matter of one-two servers, you can upload it, login and execute it. If you have more servers, you can use deploy:

   deploy -s host1 host2 host3

Calling this program will initially ask you for a password if you pass an empty password on the command line. If you're relying on SSH certificates, just hit return. After this, it will begin uploading and executing in all the given servers.

Thus, in a matter of two commands, you can pack all your stuff and deploy it!

2015-02-04 Flavio Polettifixed minor bugsmaster
2015-02-04 Flavio Polettiusing Makefile to do Makefile stuff
2015-02-04 Flavio Polettimade deployable bundled
2015-02-04 Flavio Polettiadded repo file for ignoring files
2015-02-04 Flavio Polettimaking deployable hopefully mobundable
2015-01-29 Flavio Polettifixed issue with inspect with bundle
2014-12-15 Flavio Polettibugfix and more documentation
2014-12-04 Flavio Polettihopefully made tar concatenation work with Archive...
2014-12-03 Flavio Polettiperltidy
2014-12-03 Flavio Polettiadded missing documentation bit
2014-12-03 Flavio Polettiadded --tarfile|-F option
2014-12-03 Flavio Polettichanged default working directory and set permissions...
2013-11-18 Flavio Polettiretrofitted from mobundle project
2013-08-27 Flavio Polettiadded support for DEPLOYABLE_DISABLE_PASSTHROUGH
2013-08-27 Flavio Poletticoped with empty archives
2013-08-27 Flavio Polettiadded short option for passthrough
7 weeks ago master
19 months ago generic-remote
19 months ago better-tar