Using Mustache template system with CFEngine

Mustache is a template system logic-less(no ifs, else's or for loops) and can be used for HTML, config files, source code and so on.

CFEngine 3.6.x have support for Mustache, in this tutorial we will create a template and a CFEngine rule to parse the template and generate the file that we want.

Create the template file

/tmp/template.mustache

My hostname is: {{hostname}}  
My name is: {{name}}  
Fruits that I like: {{fruits}}  

Our CFEngine file

/tmp/parse_template.cf

body common control  
{
  bundlesequence => { "main", };
}

bundle agent main  
{
  methods:
      "any" usebundle => parse;
}

bundle agent parse  
{
  files:
      "/tmp/template.conf"
        edit_template => "/tmp/template.mustache",
        create => "true",
        template_method => "mustache",
        template_data => parsejson('{"hostname": "$(sys.uqhost)", "name": "Danilo", "fruits": "apple,banana,watermelon" }');
}

Lets run it and check the result

[root@myserver ~]# cf-agent -f template_parser.cf 

[root@myserver ~]# cat /tmp/template.conf
My hostname is: myserver  
My name is: Danilo  
Fruits that I like: apple,banana,watermelon  

It’s simple yet powerful. You can use it in many ways, I use for configuration files(httpd.conf, nginx.conf, etc.).