glean information about the target system (such as operating system, init system, and hostname) Types, which describe reusable chunks of configuration. Types are instantiated in manifests and are the only way to actually run code on the target machines. The name "type" is meant as an analog to "class" in an object-oriented language, because a type can be turned into multiple "objects" depending on what parameters are passed to it. For instance, the __file type can be turned into multiple "objects", each one representing the creation of a certain file. Ansible's "roles" are the equivalent of cdist's types. Types can have many components: Object ID: When a type is turned into an object, it is passed a unique object ID. The same type cannot be instantiated twice with the same ID. This ID is not random like a UUID, but rather is some unique identifier that is meaningful in relation to the type. For example, the __file type's ID is the absolute path to the file. Parameters: Many types cannot be fully described by the object ID, and take additional information in the form of parameters. The __file type takes a group parameter which specifies to which Unix group should own the file. Explorers: In addition to the global explorers described above, types sometimes have their own explorers that collect type-specific information from the remote machine. The __file type uses explorers to determine whether the file being created already exists. It sometimes uses this information to skip creation of the file. Manifest: A type manifest can instantiate other types, making code re-use easy. Gencode Scripts: The gencode-remote script is the main way to actually update the configuration of target nodes. gencode-remote runs on the local machine, but its standard output is sent to the remote machine and executed as a shell script. There is also a less frequently used gencode-local script which outputs code to be run locally. Shell is the de facto language for writing cdist configuration scripts, but most of the scripts can be written in any language if they contain a suitable shebang line. Shell scripting is favored because of how simple it is to access environment variables, read files, and execute system commands. Configuration language 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 proficient in reading and writing shell scripts.