Although it is a very bad idea to directly run shell commands with Cfengine 3 (see here why), there might be a few situations where this is still the best attempt, e.g. when performing custom maintenance work which really can not be done by Cfengine 3. Writing the Cfengine 3 code body common control { […]

Although it is a very bad idea to directly run shell commands with Cfengine 3 (see here why), there might be a few situations where this is still the best attempt, e.g. when performing custom maintenance work which really can not be done by Cfengine 3.

Save the file (I used the file name “example6.cf”) and make sure that it is located in the right directory (e.g. /var/lib/cfengine3/inputs or /etc/cfengine3).
Let’s see if the syntax is correct:

cf-promises -f /var/lib/cfengine/inputs/example6.cf

No output or error message? Great, let’s run it then:

cf-agent -f /var/lib/cfengine3/inputs/example6.cf
Q: "...it.d/mysql star": Rather than invoking init scripts through /etc/init.d, use the service(8)
Q: "...it.d/mysql star": utility, e.g. service mysql start
Q: "...it.d/mysql star": Since the script you are attempting to invoke has been converted to an
Q: "...it.d/mysql star": Upstart job, you may also use the start(8) utility, e.g. start mysql
Q: "...it.d/mysql star": mysql start/running, process 4521
I: Last 5 quoted lines were generated by promiser "/etc/init.d/mysql start"

As you can see, the cf-agent is able to run our simple shell command and also shows you its output. As stated above, it is a really bad idea to start services in this way. Cfengine 3 is able to do that for you, but we just needed a simple example here.

Analyzing the Cfengine 3 code snippet
We jump directly to the interesting part: