Modules
Modules allow users to extend the capabilities of CFEngine in a modular way, they can be easily added and upgraded independently of when you upgrade your CFEngine version. Several different types of modules are available.
Promise modules
Promise modules allow for the implementation of custom promise types, extending the CFEngine Language. They communicate with cf-agent using the Promise Module Protocol.
History:
- Introduced 3.17.0
Package modules
Package modules implement the logic behind packages type promises, superseding the package_method based implementation. They interact with package managers like yum, apt, msiexec, and pip to determine which packages are currently installed or have updates available as well as installing, upgrading or un-installing packages.
Package modules communicate with cf-agent via the Package Module Protocol.
History:
- Introduced 3.7.0
Variables and classes modules
Variables and classes modules are the original way to extend CFEngine. The Variable and Class Module Protocol allows for variables and classes to be defined. The protocol can be interpreted by functions like usemodule() and read_module_protocol() as well as output from commands type promises with the module => "true" attribute.
The choice of interpretation can depend on many factors but a primary differentiate between functions and classes relate to CFEngine's evaluation details. Functions are evaluated early during policy execution unless they are explicitly guarded to delay execution. Commands promises are not executed until the bundle is actuated for it's three pass evaluation.
Variables and classes modules are intended for use as system probes rather than additional configuration promises, especially now that promise modules are available.
Specification
The protocol is line based. Lines that begin with ^ apply to all following lines.
-
^context=BundleName: Sets the bundle scope in which variables will be defined -
^meta=Tag1,Tag2: Sets a comma separated list of tags that are applied to defined variables and classes -
^persistence=X: Sets the number of minutes for which classes should persist -
+ClassName: Defines a namespace scoped class -
-ClassName: Undefines a class -
=VariableName=: Defines a string variable -
VariableName[KEY]=: Defines an associative array key value -
@VariableName=: Defines a list of strings -
%VariableName=: Must be valid JSON and defines a data container
Notes:
- It is not possible to define variables or classes in a namespace other than the default (
default). - If no context is provided, the context is the canonified leaf name of the module. For example, if the module is
/tmp/path/my-module.shthe default context would bemy_module_shin thedefaultnamespace (default:my_module_sh). - All variables and classes will be tagged with
source=modulein addition to any specified tags. - All lines of output that do not match the module protocol are treated as errors.
- Variable names defined by the module protocol are limited to alphanumeric characters and
_,.,-,[,],@, and/.
Examples:
A Variables and Classes module written in shell:
#!/bin/sh
/bin/echo "@mylist= { \"one\", \"two\", \"three\" }"
/bin/echo "=myscalar= scalar val"
/bin/echo "=myarray[key]= array key val"
/bin/echo "%mydata=[1,2,3]"
/bin/echo "+module_class"
/bin/echo "^persistence=10"
/bin/echo "+persistent_10_minute_class"
History:
- Introduced in 3.0.0
-
^context,^metaAdded in 3.6.0 -
^persistenceAdded in 3.8.0 -
@allowed in variables (intended for keys in classic array) 3.15.0, 3.12.3, 3.10.7 (2019) -
/allowed in variables (intended for keys in classic array) 3.14.0, 3.12.2, 3.10.6 (2019)