A helper for writing cdist manifests in Python.
Writing complex manifests in shell can be painful and laborious. With Python and a proper abstraction layer, we can write manifests more easily.
First of all make sure your manifest is executable and contains
#!/usr/bin/env python shebang.
To use type __directory, import directory (without leading underscores)
from cdist_manifestation.types like this:
from cdist_manifestation.types import directoryEvery type is a function accepting a single positional argument, object_id
which is optional, and arbitrary amount of keyword arguments, which are the
type parameters.
So, one could create a cdist object of type __directory like this:
from cdist_manifestation.types import directory
directory('/my/dir', mode=755, owner='me', parents=True)This is equivalent to __directory /my/dir --mode 755 --owner me --parents.
When you want to use the same parameter multiple times, just provide an iterable like this:
from cdist_manifestation.types import user_groups
user_groups('me', group=['group1', 'group2'])This is equivalent to __user_groups me --group group1 --group group2.
To sum it up, these are the rules for using type parameters:
- Underscores in parameter name will be implicitly converted to hyphens
- Parameter values are implicitly converted to strings, except:
- Booleans, which simply denote a presence of a boolean parameter
- Iterables like lists and tuples, which denote presence of multiple instances of the same parameter. Items of these iterables will be converted to strings implicitly, disregarding these exceptions.
Every type returns its dependency string which can be passed to require
context manager from cdist_manifestation.dependencies. This function
emulates behavior of require environmental variable.
For example, if creating a file depends on creating its parent directory first,
you can use require() like this:
from cdist_manifestation.dependencies import require
from cdist_manifestation.types import directory, file
my_dir = directory('/my/dir')
with require(my_dir):
file('/my/dir/file')This is equivalent to:
__directory /my/dir
require="__directory/my/dir" __file /my/dir/fileYou can pass multiple requirements to require() or even nest one to another.
To emulate behavior of CDIST_ORDER_DEPENDENCY environmental variable, one
can use order_dependency context manager from
cdist_manifestation.dependencies.
For example, if you want to create three links in the same order you've defined them in, you can write some like this:
from cdist_manifestation.dependencies import order_dependency
from cdist_manifestation.types import link
with order_dependency():
link('/my/link1', source='/my/source', type='symbolic')
link('/my/link2', source='/my/source', type='symbolic')
link('/my/link3', source='/my/source', type='symbolic')Which is equivalent to this:
CDIST_ORDER_DEPENDENCY=on __link /my/link1 --source /my/source --type symbolic
CDIST_ORDER_DEPENDENCY=on __link /my/link2 --source /my/source --type symbolic
CDIST_ORDER_DEPENDENCY=on __link /my/link3 --source /my/source --type symbolicYou can also nest order_dependency into require or vice versa. Nesting
order_dependency into itself will not change the behavior.
cdist-specific environmental variables, such as __manifest or __target_host, can be
imported from cdist_manifestation.variables module.
Where trying to reference a file located in ${__manifest}/files/test, you can do it like this:
import os
from cdist_manifestation.types import file
from cdist_manifestation.variables import manifest
file('/test', source=os.path.join(manifest, 'files', 'test'))For more advanced configuration example, see example directory.
This library is not designed to be thread-safe.