Throughout this book we have focused on learning the basic concepts of CFEngine, those that will allow you to set up CFEngine and start using it in a productive manner as soon as possible. However, CFEngine is a vastly more complex framework for configuration management. In this last chapter, I would like to briefly introduce you to some of the more advanced features, so that you can get a taste for the sort of things you can achieve. I will not delve into the full details of the topics presented here, but rather give you some simple examples and pointers to the places where you can find more information.
Like any system that can modify the state of a running machine, CFEngine has the potential to seriously damage your systems if any errors are introduced in its configuration. Due to its very purpose, an error in a CFEngine configuration file can spread almost instantly to a very large number of machines, leaving them incorrectly configured or breaking them completely, rendering them inoperational.
For this reason, it is extremely important to thoroughly test CFEngine configuration files before deploying them to your production machines. One of the best ways to do this is to create different environments for development/testing and production. In this section we will go through some techniques that you can use to achieve this goal.
Ideally, testing environments should be as similar to the production environment as ...