To start using CFD you need to define a few nodes and add types to them. This is done the following way:
from cfd.types import CFDFile
from cfd.nodes import CFDNode
class YourServer(CFDNode):
"""
You can include any comments here and automatically generate a full documentation of your infrastructure from
it.
"""
modules = [
CFDFile("/etc/motd", content="This is a CFD managed server"),
]
You can subclass your new class if you want, e.g.:
from cfd_package.types import CFDPackage
class AnotherServer(YourServer):
"""
This server subclasses the other server and will already have the file declared above, in addition to
any types declared in this class.
"""
modules = [
CFDPackage("nginx"),
]
This class of servers will now both have the file /etc/motd and the package nginx installed. To match this class with a specific server, you have to register it in the node_registry. This is done the following way:
from cfd.pool import node_registry
node_registry.register(AnotherServer, 'server-1.organization.org')
Make sure the cfd-server is running and then you are ready to run the cfd agent on server-1.organization.org:
cfd-agent
You should receive Wrong credentials for server-1.organization.org. You need to create create an api key for the server and place it in /etc/cfd/config.yaml.
$ cfd-server create-api-key server-1.organization.org
xcxcxcxcxcxcxcxxcxc
/etc/cfd/conf.yaml:
---
api-key: xcxcxcxcxcxcxcxxcxc
Now run cfd-agent again and it should add the package and the file.
An important part of CFD is the ability to write plugable modules that can be shared with everyone else. Lets create a small module to handle our MOTD file.
from cfd.modules import CFDModule
from cfd.types import CFDFile
class MOTD(CFDModule):
def __init__(self, content):
self.add(CFDFile("", content=content))
While this is obviously a very simple example, you can customize the __init__ method to accept whatever argument you want, such as providing all the possible configurations for a software and generating configuration files depending on it. The module can then be imported and added to the module list on the node.
class SomeNode(CFDNode):
modules = [
MOTD('hello'),
]
Congrats, you’re done!