restore cdist-type.text
Signed-off-by: Nico Schottelius <nico@bento.schottelius.org>
This commit is contained in:
		
					parent
					
						
							
								ff9b2fe6f4
							
						
					
				
			
			
				commit
				
					
						c7811fb056
					
				
			
		
					 1 changed files with 280 additions and 0 deletions
				
			
		
							
								
								
									
										280
									
								
								docs/man/man7/cdist-type.text
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										280
									
								
								docs/man/man7/cdist-type.text
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,280 @@ | |||
| cdist-type(7) | ||||
| ============= | ||||
| Nico Schottelius <nico-cdist--@--schottelius.org> | ||||
| 
 | ||||
| 
 | ||||
| NAME | ||||
| ---- | ||||
| cdist-type - Functionality bundled | ||||
| 
 | ||||
| 
 | ||||
| SYNOPSIS | ||||
| -------- | ||||
| __TYPE ID --parameter value [--parameter value ...] | ||||
| 
 | ||||
| __TYPE --parameter value [--parameter value ...] (for singletons) | ||||
| 
 | ||||
| 
 | ||||
| DESCRIPTION | ||||
| ----------- | ||||
| Types are the main component of cdist and define functionality. If you | ||||
| use cdist, you'll write a type for every functionality you would like | ||||
| to use. | ||||
| 
 | ||||
| 
 | ||||
| HOW TO USE A TYPE | ||||
| ----------------- | ||||
| You can use types from the initial manifest or the type manifest like a | ||||
| normal command: | ||||
| 
 | ||||
| -------------------------------------------------------------------------------- | ||||
| # Creates empty file /etc/cdist-configured | ||||
| __file /etc/cdist-configured --type file | ||||
| 
 | ||||
| # Ensure tree is installed | ||||
| __package tree --state installed | ||||
| -------------------------------------------------------------------------------- | ||||
| 
 | ||||
| A list of supported types can be found in the cdist-reference(7) manpage. | ||||
| 
 | ||||
| 
 | ||||
| SINGLETON TYPES | ||||
| --------------- | ||||
| If a type is flagged as a singleton, it may be used only | ||||
| once per host. This is useful for types which can be used only once on a | ||||
| system. Singleton types do not take an object name as argument. | ||||
| 
 | ||||
| Example: | ||||
| -------------------------------------------------------------------------------- | ||||
| # __issue type manages /etc/issue | ||||
| __issue | ||||
| 
 | ||||
| # Probably your own type - singletons may use parameters | ||||
| __myfancysingleton --colour green | ||||
| -------------------------------------------------------------------------------- | ||||
| 
 | ||||
| 
 | ||||
| HOW TO WRITE A NEW TYPE | ||||
| ----------------------- | ||||
| A type consists of | ||||
| 
 | ||||
| - parameter (optional) | ||||
| - manifest  (optional) | ||||
| - singleton (optional) | ||||
| - explorer  (optional) | ||||
| - gencode   (optional) | ||||
| 
 | ||||
| Types are stored below cdist/conf/type/. Their name should always be prefixed with | ||||
| two underscores (__) to prevent collisions with other executables in $PATH. | ||||
| 
 | ||||
| To implement a new type, create the directory **cdist/conf/type/__NAME**. | ||||
| 
 | ||||
| 
 | ||||
| DEFINING PARAMETERS | ||||
| ------------------- | ||||
| Every type consists of required, optional and boolean parameters, which must | ||||
| each be declared in a newline separated file in ***parameter/required***, | ||||
| ***parameter/required_multiple***, ***parameter/optional***,  | ||||
| ***parameter/optional_multiple*** and ***parameter/boolean***. | ||||
| Parameters which are allowed multiple times should be listed in | ||||
| required_multiple or optional_multiple respectively. All other parameters | ||||
| follow the standard unix behaviour "the last given wins". | ||||
| If either is missing, the type will have no required, no optional, no boolean | ||||
| or no parameters at all.  | ||||
| 
 | ||||
| Example: | ||||
| -------------------------------------------------------------------------------- | ||||
| echo servername >> cdist/conf/type/__nginx_vhost/parameter/required | ||||
| echo logdirectory >> cdist/conf/type/__nginx_vhost/parameter/optional | ||||
| echo server_alias >> cdist/conf/type/__nginx_vhost/parameter/optional_multiple | ||||
| echo use_ssl >> cdist/conf/type/__nginx_vhost/parameter/boolean | ||||
| -------------------------------------------------------------------------------- | ||||
| 
 | ||||
| 
 | ||||
| USING PARAMETERS | ||||
| ---------------- | ||||
| The parameters given to a type can be accessed and used in all type scripts | ||||
| (e.g manifest, gencode-*, explorer/*). Note that boolean parameters are | ||||
| represented by file existence. File exists -> True, | ||||
| file does not exist -> False | ||||
| 
 | ||||
| Example: (e.g. in cdist/conf/type/__nginx_vhost/manifest) | ||||
| -------------------------------------------------------------------------------- | ||||
| # required parameter | ||||
| servername="$(cat "$__object/parameter/servername")" | ||||
| 
 | ||||
| # optional parameter | ||||
| if [ -f "$__object/parameter/logdirectory" ]; then | ||||
|    logdirectory="$(cat "$__object/parameter/logdirectory")" | ||||
| fi | ||||
| 
 | ||||
| # boolean parameter | ||||
| if [ -f "$__object/parameter/use_ssl" ]; then | ||||
|    # file exists -> True | ||||
|    # do some fancy ssl stuff | ||||
| fi | ||||
| 
 | ||||
| # parameter with multiple values | ||||
| if [ -f "$__object/parameter/server_alias" ]; then | ||||
|    for alias in $(cat "$__object/parameter/server_alias"); do | ||||
|       echo $alias > /some/where/usefull | ||||
|    done | ||||
| fi | ||||
| 
 | ||||
| -------------------------------------------------------------------------------- | ||||
| 
 | ||||
| 
 | ||||
| INPUT FROM STDIN | ||||
| ---------------- | ||||
| Every type can access what has been written on stdin when it has been called. | ||||
| The result is saved into the ***stdin*** file in the object directory. | ||||
| 
 | ||||
| Example use of a type: (e.g. in cdist/conf/type/__archlinux_hostname) | ||||
| -------------------------------------------------------------------------------- | ||||
| __file /etc/rc.conf --source - << eof | ||||
| ... | ||||
| HOSTNAME="$__target_host" | ||||
| ... | ||||
| eof | ||||
| -------------------------------------------------------------------------------- | ||||
| If you have not seen this syntax (<< eof) before, it may help you to read | ||||
| about "here documents". | ||||
| 
 | ||||
| In the __file type, stdin is used as source for the file, if - is used for source: | ||||
| 
 | ||||
| -------------------------------------------------------------------------------- | ||||
|     if [ -f "$__object/parameter/source" ]; then | ||||
|         source="$(cat "$__object/parameter/source")" | ||||
|         if [ "$source" = "-" ]; then | ||||
|             source="$__object/stdin" | ||||
|         fi   | ||||
|     .... | ||||
| -------------------------------------------------------------------------------- | ||||
| 
 | ||||
| 
 | ||||
| WRITING THE MANIFEST | ||||
| -------------------- | ||||
| In the manifest of a type you can use other types, so your type extends | ||||
| their functionality. A good example is the __package type, which in | ||||
| a shortened version looks like this: | ||||
| 
 | ||||
| -------------------------------------------------------------------------------- | ||||
| os="$(cat "$__global/explorer/os")" | ||||
| case "$os" in | ||||
|       archlinux) type="pacman" ;; | ||||
|       debian|ubuntu) type="apt" ;; | ||||
|       gentoo) type="emerge" ;; | ||||
|       *) | ||||
|          echo "Don't know how to manage packages on: $os" >&2 | ||||
|          exit 1 | ||||
|       ;; | ||||
| esac | ||||
| 
 | ||||
| __package_$type "$@" | ||||
| -------------------------------------------------------------------------------- | ||||
| 
 | ||||
| As you can see, the type can reference different environment variables, | ||||
| which are documented in cdist-reference(7). | ||||
| 
 | ||||
| Always ensure the manifest is executable, otherwise cdist will not be able | ||||
| to execute it. For more information about manifests see cdist-manifest(7). | ||||
| 
 | ||||
| 
 | ||||
| SINGLETON - ONE INSTANCE ONLY | ||||
| ----------------------------- | ||||
| If you want to ensure that a type can only be used once per target, you can | ||||
| mark it as a singleton: Just create the (empty) file "singleton" in your type | ||||
| directory: | ||||
| 
 | ||||
| -------------------------------------------------------------------------------- | ||||
| touch cdist/conf/type/__NAME/singleton | ||||
| -------------------------------------------------------------------------------- | ||||
| 
 | ||||
| This will also change the way your type must be called: | ||||
| 
 | ||||
| -------------------------------------------------------------------------------- | ||||
| __YOURTYPE --parameter value | ||||
| -------------------------------------------------------------------------------- | ||||
| 
 | ||||
| As you can see, the object ID is omitted, because it does not make any sense, | ||||
| if your type can be used only once. | ||||
| 
 | ||||
| 
 | ||||
| THE TYPE EXPLORERS | ||||
| ------------------ | ||||
| If a type needs to explore specific details, it can provide type specific | ||||
| explorers, which will be executed on the target for every created object. | ||||
| 
 | ||||
| The explorers are stored under the "explorer" directory below the type. | ||||
| It could for instance contain code to check the md5sum of a file on the | ||||
| client, like this (shortened version from the type __file): | ||||
| 
 | ||||
| -------------------------------------------------------------------------------- | ||||
| if [ -f "$__object/parameter/destination" ]; then | ||||
|    destination="$(cat "$__object/parameter/destination")" | ||||
| else | ||||
|    destination="/$__object_id" | ||||
| fi | ||||
| 
 | ||||
| if [ -e "$destination" ]; then | ||||
|    md5sum < "$destination" | ||||
| fi | ||||
| -------------------------------------------------------------------------------- | ||||
| 
 | ||||
| 
 | ||||
| WRITING THE GENCODE SCRIPT | ||||
| -------------------------- | ||||
| There are two gencode scripts: ***gencode-local*** and ***gencode-remote***. | ||||
| The output of gencode-local is executed locally, whereas | ||||
| the output of gencode-remote is executed on the target. | ||||
| The gencode scripts can make use of the parameters, the global explorers | ||||
| and the type specific explorers. | ||||
| 
 | ||||
| If the gencode scripts encounters an error, it should print diagnostic | ||||
| messages to stderr and exit non-zero. If you need to debug the gencode | ||||
| script, you can write to stderr: | ||||
| 
 | ||||
| -------------------------------------------------------------------------------- | ||||
| # Debug output to stderr | ||||
| echo "My fancy debug line" >&2 | ||||
| 
 | ||||
| # Output to be saved by cdist for execution on the target | ||||
| echo "touch /etc/cdist-configured" | ||||
| -------------------------------------------------------------------------------- | ||||
| 
 | ||||
| 
 | ||||
| HINTS FOR TYPEWRITERS | ||||
| ---------------------- | ||||
| It must be assumed that the target is pretty dumb and thus does not have high | ||||
| level tools like ruby installed. If a type requires specific tools to be present | ||||
| on the target, there must be another type that provides this tool and the first | ||||
| type should create an object of the specific type. | ||||
| 
 | ||||
| If your type wants to save temporary data, that may be used by other types | ||||
| later on (for instance __file), you can save them in the subdirectory | ||||
| "files" below $__object (but you must create it yourself). | ||||
| cdist will not touch this directory. | ||||
| 
 | ||||
| If your type contains static files, it's also recommended to place them in | ||||
| a folder named "files" within the type (again, because cdist guarantees to | ||||
| never ever touch this folder). | ||||
| 
 | ||||
| 
 | ||||
| HOW TO INCLUDE A TYPE INTO UPSTREAM CDIST | ||||
| ----------------------------------------- | ||||
| If you think your type may be useful for others, ensure it works with the | ||||
| current master branch of cdist and have a look at cdist-hacker(7) on | ||||
| how to submit it. | ||||
| 
 | ||||
| SEE ALSO | ||||
| -------- | ||||
| - cdist-explorer(7) | ||||
| - cdist-hacker(7) | ||||
| - cdist-stages(7) | ||||
| - cdist-tutorial(7) | ||||
| 
 | ||||
| 
 | ||||
| COPYING | ||||
| ------- | ||||
| Copyright \(C) 2011-2012 Nico Schottelius. Free use of this software is | ||||
| granted under the terms of the GNU General Public License version 3 (GPLv3). | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue