Why should I use cdist? ======================= There are several motivations to use cdist, these are probably the most popular ones. No need to learn a new language ------------------------------- When adopting cdist, your staff does not need to learn a new `DSL `_ or programming language, as cdist can be configured and extended in **any scripting language**, the recommended one being `shell scripts `_. Shell scripts enjoy ubiquity: they have been widely used by UNIX system engineers for decades, and a suitable interpreter (:code:`/bin/sh`) is all but guaranteed to be widely available on target hosts. Easy idempotance -- without having to give up control ----------------------------------------------------------------------------- For the sake of `idempotence `_, many **contemporary SCMs** choose to ditch the power and versatality of general purpose programming languages, and adopt some form of declarative `DSL `_ for describing the desired end states on target systems. :program:`Cdist` takes a quite different approach, enabling *both* `idempotence `_ *and* a decent level of programming power. Unlike other SCMs, :program:`cdist` allows you to use a general purpose scripting language (POSIX shell is recommended) for describing the desired end states on target systems, instead of some declarative `DSL `_. Unlike regular scripting, however, you are not left on your own for ensuring `idempotence `_. :program:`Cdist` makes this really easy. It does not matter how many times you "invoke" **cdist types** and in which order: :program:`cdist` will ensure that the actual code associated with each type will be executed only once (in dependency order) which, in turn, may effectively end up becoming a no-op, if the actual state is already the same as the desired one. .. TODO: It would be great if there were an "architectural overview" page which could be referenced from here. Powerful language -------------------- Compared to a typical `DSL `_, shell scripts feature a much more powerful language. Here are some features which make daily work easy: * Ability to dynamically adapt configuration based on information *explored* from target hosts; * High level string manipulation (using sed, awk, grep) * Conditional support (**if, case**) * Loop support (**for, while**) * Variable expansion * Support for dependencies between cdist types and objects If and when needed, it's always possible to simply make use of **any other scripting language** at your disposal *(albeit at the expense of adding a dependency on the corresponding interpreter and libraries)*. Zero dependency configuration management ----------------------------------------- Cdist requires very little on a target system. Even better, in almost all cases all dependencies are usually already fulfilled. Cdist does not require an agent or high level programming languages on the target host: it will run on any host that has a **ssh server running** and a POSIX compatible shell (**/bin/sh**). Compared to other configuration management systems, it does not require to open up an additional port. Push based distribution ----------------------- Cdist uses the push based model for configuration. In this scenario, one (or more) computers connect to the target hosts and apply the configuration. That way the source host has very little requirements: Cdist can even run on a sysadmin notebook that is loosely connected to the network and has limited amount of resources. Furthermore, from a security point of view, only one machine needs access to the target hosts. No target hosts will ever need to connect back to the source host, which contains the full configuration. Highly scalable --------------- If at some point you manage more hosts than can be handled from a single source host, you can simply add more resources: Either add more cores to one host or add hosts. Cdist will utilise the given resources in parallel.