Create a configuration model¶
This guide explains how to create a basic configuration model to manage an infrastructure: the Inmanta hello world. Each configuration model is completely defined in source code: infrastructure-as-code.
Create a new source project¶
The Inmanta compiler expects a project with basic configuration. This project is a directory that contains the source code of the configuration model. This project also matches with a project defined on the server, from which multiple environments can be deployed.
Note
Inmanta requires that a project is a git repository. This is not strictly required when using the embedded or push to server model (see Architecture). However in the autonomous server model, this is the only method to get the configuration code on the server. Additionally, it is also a good practive to version control your infrastructure code.
Typically branches in this git repository are used to define multiple environments (if the differ in code)
1 2 3 | mkdir hello-world
cd hello-world
git init
|
Inside the project the compiler expects a project.yml
file that defines metadata about the project,
the location to store modules, repositories where to find modules and possibly specific versions of
modules. project.yml defines the following settings:
name
An optional name of the project.
description
An optional description of the project
modulepath
This value is a list of paths where Inmanta should search for modules. Paths are separated with:
downloadpath
This value determines the path where Inmanta should download modules from repositories. This path is not automatically included in in modulepath!
install_mode
This key determines what version of a module should be selected when a module is downloaded. This is used when the module version is not “pinned” in therequires
list. The available values are:
release (default): Only use a released version, that is compatible with the current compiler. A version is released when there is a tag on a commit. This tag should be a valid version identifier (PEP440) and should not be a prerelease version. Inmanta selects the latest available version (version sort based on PEP440).
prerelease: Similar to release, but also prerelease versions are allowed.
master: Use the master branch.
repo
This key requires a list (a yaml list) of repositories where Inmanta can find modules. Inmanta creates the git repo url by formatting {} or {0} with the name of the repo. If no formatter is present it appends the name of the module. Inmanta tries to clone a module in the order in which it is defined in this value.
requires
Model files import other modules. These imports do not determine a version, this is based on the install_model setting. Modules and projects can constrain a version in the requires setting. Similar to the module, version constraints are defined using PEP440 syntax.
For more information see ‘Compiler Configuration Reference’_.
An example project.yml
could be:
1 2 3 4 5 6 | name: Hello world
description: An Inmanta hello world like project!
modulepath: libs
downloadpath: libs
repo:
- https://github.com/inmanta/
|
Initial model¶
Most infrastructure code is contained in modules, but the compiler needs an entrypoint. This entrypoint is the main.cf file in the toplevel directory of the project.
The main.cf
below calls the print plugin from the std module.
1 | std::print("hello world")
|
Note
The std module is the only module that does not have to be imported explicitly.
This example can be executed with inmanta compile
This prints out “hello world” on stdout. The first execution takes longer because Inmanta needs to fetch (clone) the std module from github. Subsequently compiles will use the std module downloaded to the libs directory.
Deploy a file¶
The main.cf
below is a small project that creates a file on a machine:
1 2 3 | std::AgentConfig(agentname=host.name, autostart=true)
host = std::Host(name="localhost", os=std::linux)
std::File(host=host, path="/tmp/test", owner="user", group="group", mode=600, content="abcde")
|
Note
Replace user and group in the main.cf
above. The user and group should exist. If this
command is not executed as root, make sure that user and group have the value of the current
user.
Deploy the configuration by exporting the model to an orchestration server. Either commit the code to the git repository and configure an inmanta instance to deploy the model (see Autonomous server) or export the compiled model to an orchestrator (see Push to server)