Makefile and front-end to ease the deployment of configuration management files
Perl Makefile
Switch branches/tags
Nothing to show
Clone or download
Pull request Compare This branch is even with brontolinux:master.
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.


cf-deploy is a tool designed to deploy configuration files for configuration management tools (CFEngine policies, Puppet manifests...). The script itself is part of a wider strategy where the code repository is designed to support multiple projects at once, sharing common libraries and keeping project-specific code separated.

You can read more about this approach in my blog post "Git repository and deployment procedures for CFEngine policies". You can also take a look at the slides of my presentation at Config Management Camp 2015.


The code is perfectly functional but doesn't support a configuration file yet. Some support has been added in version 2 by means of environment variables. If environment variables are not set, the defaults hardcoded in the script and the Makefile are used.


You are more than welcome to fork this project and modify cf-deploy to add support for a configuration file and command line options. In that respect, I am personally fond of AppConfig, but feel free to use any library that does the job.


The components of the tool are currently the following:

  • a Makefile, the real workhorse of the system;
  • cf-deploy, a Perl frontend to the Makefile;
  • a configuration file called projects.db that establishes a correspondance between a project's name, the directory in which the files for those projects reside, and the type of project: remote (deploy the files to a remote server) or local (deploy the files in a local directory)
  • a configuration file called hub.db that associates each hub with its location, the project it is assigned to and the environment it serves: production (prod), preproduction (preprod), staging, test...

A sample for hub.db and projects.db is provided.

Current defaults

  • you are using git; you can use a different tool (e.g.: svn, hg...) by changing the Makefile;
  • your local copy of the git repository is checked out in $CFDEPLOY_GITDIR, or /var/cfengine/git if the environment variable is not set
  • cf-deploy and its database files are in $CFDEPLOY_GITDIR/$CFDEPLOY_TOOLDIR; if CFDEPLOY_TOOLDIR is not provided, the value common/tools/deploy is used;
  • the hub database is in $CFDEPLOY_GITDIR/$CFDEPLOY_TOOLDIR/$CFDEPLOY_HUBDBFILE; if CFDEPLOY_HUBDB is not provided, the value hub.db is used;
  • the projects database is in $CFDEPLOY_GITDIR/$CFDEPLOY_TOOLDIR/$CFDEPLOY_PROJDBFILE; if CFDEPLOY_PROJDB is not provided, the value projects.db is used;
  • by default, cf-deploy will check out the branch master, unless a different default branch is provided in the variable CFDEPLOY_BRANCH; you can also override that default with the branch operand on the command line`;
  • when deploying to a remote server, the destination directory is $CFDEPLOY_MASTERDIR, or /var/cfengine/masterfiles if the environment variable is not set;
  • the files are deployed using rsync; you can use a different tool/system or different options for rsync by changing the Makefile;
  • the options using when diff-ing files are set in the Makefile in the variable DIFF_OPTS.

How it works

Just run the command without operands and it will tell you. This is what it returns on my laptop where it is linked in /var/cfengine/bin:

$ cf-deploy 

  /var/cfengine/bin/cf-deploy PROJECT_NAME
    deploys project PROJECT_NAME on all hubs. It's a shortcut for
    /var/cfengine/bin/cf-deploy deploy PROJECT_NAME

  /var/cfengine/bin/cf-deploy deploy PROJECT_NAME [ branch BRANCH ] [ hub SERVER ]
    Deploys PROJECT_NAME with the specified options

  /var/cfengine/bin/cf-deploy preview PROJECT_NAME [ branch BRANCH ] [ hub SERVER ]
    preview the changes that would be applied

  /var/cfengine/bin/cf-deploy diff PROJECT_NAME hub SERVER [ branch BRANCH ]
    runs a diff for a project (hub is mandatory)

  /var/cfengine/bin/cf-deploy show PROJECT_NAME
    Describes the project PROJECT_NAME, other options are ignored

  /var/cfengine/bin/cf-deploy list projects
    Lists all defined projects, other options are ignored

  /var/cfengine/bin/cf-deploy list hubs
    Lists all but the test hubs (normally they are the one you are
    mostly interested in, but in case you are more curious...)

  /var/cfengine/bin/cf-deploy list all_hubs
    List absolutely all hubs, skipping none of them.

  You can override the default branch of a project by using the keyword
  branch. You can also override the project's hub list by specifying an
  hub with the hub keyword -- notice that specifying a hub for a local
  project is pointless