135 lines
5.7 KiB

{{Infobox software
|name = cdist
|logo =
|screenshot =
|caption =
|collapsible =
|author = Nico Schottelius, Steven Armstrong
|developer =
|released = 2010
|latest release version = 2.0.13
|latest release date = 05-Jun-2012
|frequently updated =
|programming language = [[Python_(programming_language)|Python]], [[Bourne shell]]
|operating system = [[GNU/Linux]], [[Unix-like]]
|platform =
|size =
|language =
|status =
|genre = [[Configuration management]]
|license = [[GPLv3]].
|website =
'''cdist''' is a configuration management system, which adheres to the [[KISS_principle]]. It is being used in small up to enterprise grade environments.
cdist is an alternative to other configuration management systems [[CFEngine]], [[Bcfg2]], [[Chef (software)|Chef]] and [[Puppet (software)|Puppet]].
cdist development started in 2010 at [[ETH Zurich]] and is actively being developed by a lot of [[FOSS]] contributors
and maintained by the two main developers Nico Schottelius and
Steven Armstrong. cdist is being watched on github by more than 100 people and has more than 30 forks.<ref>cdist development at</ref>
The major part of the discussion about cdist happens on the mailinglist<ref>cdist mailinglist</ref>
and on the IRC channel #cstar in the [[Freenode]] network. cdist is being used at various companies in Switzerland (for instance at [[ETH Zurich]]), the USA, Germany and France.
Its core is written in [[Python (programming language)|Python]] and the types are
written in [[Bourne Shell]]. Cdist is released under the [[GNU General Public License|GPL]].
cdist has been a no. 1 topic on [[Hacker News]] for some time.<ref>cdist on [[Hacker News]]</ref>
== Architecture ==
cdist is split into two components:
* The core
* The configuration
=== Core ===
The core of cdist is implemented in Python 3 and provides the executables to configure target hosts. The core operates in a push model: It connects
from the source host '''to''' the target hosts and configures the machines. For communication and file transfer [[SSH]] is being used.
To allow parallel configuration of hosts, the core supports a parallel mode in which it creates a child process for every connection.
This model allows cdist to scale horizontally with the available computing resources: If at a certain limit is reached and the capacity of the
available CPUs has been used, adding another CPU or distributing cdist to multiple hosts allows to configure more hosts in parallel.
=== Configuration ===
The configuration is written in [[Bourne Shell]] and consists of
* The initial manifest (which defines which host is assigned which types)
* Global Explorers (to gain information about the target system)
* Types (which provide all functionality and consist of a manifest, type explorers and gencode scripts)
Although all of these are written in Shell script, the order of execution in the manifests does not matter: cdist employs a idempotent
=== Comparison ===
In comparison to most other configuration management software, cdist does not have any requirements on the target host besides SSH and a bourne shell.
It requires Python 3.2 on the source host, though.<ref>Why cdist requires Python 3.2 on the source host -</ref>
cdist operates in push based approach, in which a server pushes configurations to the client and the clients do not poll for updates.
== Configuration DSL ==
All user configurable parts are contained in manifests or gencode-scripts, which are shell scripts.
Shell scripts were chosen, because Unix System Administrators are usually profound in reading
and writing shell scripts.
cdist reads its configuration from the initial manifest ('''conf/manifest/init'''), in which hosts are mapped to
case "$__target_host" in
__package zsh --state present
__addifnosuchline /tmp/cdist-welcome --line "Welcome to cdist"
When using the types in cdist, they are called like normal programs in manifests and can make use of
advanced parameter parsing as well as reading from stdin:
# Provide a default file, but let the user change it
__file /home/frodo/.bashrc --source "/etc/skel/.bashrc" \
--state exists \
--owner frodo --mode 0600
# Take file content from stdin
__file /tmp/whatever --owner root --group root --mode 644 --source - << DONE
Here goes the content for /tmp/whatever
Dependencies are expressed by setting up the '''require''' environment variable:
__directory /tmp/foobar
require="__directory//tmp/foobar" __file /tmp/foobar/baz
Access to paths and files within types is given by environment variables like $__object.
== See also ==
{{Portal|Free software}}
* [[Comparison of open source configuration management software]]
== References ==
== External links ==
* [ cdist Website]
* [ Github home]
* [ cdist mailinglist]
* [ cdist on freecode]
[[Category:Configuration management]]
[[Category:Free software programmed in Python]]
[[Category:2010 software]]
[[Category:Linux configuration utilities]]
[[Category:Mac OS X]]
[[Category:Linux package management-related software]]
[[Category:Unix package management-related software]]