forked from ungleich-public/cdist
merge from upstream
Signed-off-by: Steven Armstrong <steven@icarus.ethz.ch>
This commit is contained in:
commit
b9b90dad36
25 changed files with 420 additions and 176 deletions
10
.gitignore
vendored
10
.gitignore
vendored
|
@ -3,13 +3,13 @@
|
||||||
|
|
||||||
# Ignore generated manpages
|
# Ignore generated manpages
|
||||||
doc/man/.marker
|
doc/man/.marker
|
||||||
doc/man/man*/*.1
|
doc/man/man1/*.1
|
||||||
doc/man/man*/*.7
|
doc/man/man7/*.7
|
||||||
doc/man/man*/*.html
|
doc/man/man*/*.html
|
||||||
doc/man/man*/*.xml
|
doc/man/man*/*.xml
|
||||||
doc/man/man*/cdist-reference.text
|
doc/man/man7/cdist-type__*.text
|
||||||
# Ignore type manpages
|
doc/man/man7/cdist-reference.text
|
||||||
doc/man/man*/*__*.text
|
doc/man/man*/docbook-xsl.css
|
||||||
|
|
||||||
# Ignore cache for version control
|
# Ignore cache for version control
|
||||||
cache/
|
cache/
|
||||||
|
|
69
README
69
README
|
@ -24,63 +24,42 @@ other configuration management systems like
|
||||||
[cfengine](http://www.cfengine.org/),
|
[cfengine](http://www.cfengine.org/),
|
||||||
[bcfg2](http://trac.mcs.anl.gov/projects/bcfg2),
|
[bcfg2](http://trac.mcs.anl.gov/projects/bcfg2),
|
||||||
[chef](http://wiki.opscode.com/display/chef/)
|
[chef](http://wiki.opscode.com/display/chef/)
|
||||||
and [puppet](http://www.puppetlabs.com/), but
|
and [puppet](http://www.puppetlabs.com/), but it ticks differently.
|
||||||
it ticks differently:
|
Here are some features that makes it unique:
|
||||||
|
|
||||||
* cdist sticks completly to the KISS (keep it simple and stupid) paradigma
|
[[!table data="""
|
||||||
* cdist's core is very small (< 1k lines of code)
|
Keywords | Description
|
||||||
* There is only one type to extend cdist called ***type***.
|
Simplicity | There is only one type to extend cdist called ***type***
|
||||||
* One main development target: ***It must be incredible easy to add new types.***
|
Design | Type and core cleanly seperated
|
||||||
* cdist is UNIX
|
Design | Sticks completly to the KISS (keep it simple and stupid) paradigma
|
||||||
* It reuses existing tools like cat, find, mv, ...
|
Design | Meaningful error messages - do not lose time debugging error messages
|
||||||
* cdist's documentation is bundled as manpages
|
Design | Consistency in behaviour, naming and documentation
|
||||||
* cdist is written in POSIX shell
|
Design | No surprise factor: Only do what is obviously clear, no magic
|
||||||
* No special requirements like high level interpreters needed on server or target
|
Design | Define target state, do not focus on methods or scripts
|
||||||
|
Small core | cdist's core is very small - less code, less bugs
|
||||||
|
Fast development | Focus on straightforwardness of type creation is a main development objective
|
||||||
|
Requirements, Scalability | No central server needed, cdist operates in push mode and can be run from any computer
|
||||||
|
Requirements, Scalability, Upgrade | cdist only needs to be updated on the master, not on the target hosts
|
||||||
|
Requirements, Security | Uses well-know [SSH](http://www.openssh.com/) as transport protocol
|
||||||
|
Requirements, Simplicity | Requires only shell and SSH server on the target
|
||||||
|
UNIX | Reuse of existing tools like cat, find, mv, ...
|
||||||
|
UNIX, familar environment, documentation | Is available as manpages and HTML
|
||||||
|
UNIX, simplicity, familar environment | cdist is written in POSIX shell
|
||||||
|
UNIX, simplicity, familar environment | cdist is configured in POSIX shell
|
||||||
|
"""]]
|
||||||
|
|
||||||
### Documentation
|
### Documentation
|
||||||
|
|
||||||
The cdist documentation is included as manpages in the distribution.
|
The cdist documentation is included as manpages in the distribution.
|
||||||
You can [browse the documentation for the latest version online](man) as well.
|
You can [browse the documentation for the latest version online](man) as well.
|
||||||
|
|
||||||
### Architecture
|
|
||||||
|
|
||||||
* Push mode (server pushes configuration)
|
|
||||||
* User defines configuration in shell scripts (called ***manifests***)
|
|
||||||
* Generates internal configuration (cconfig style)
|
|
||||||
* Uses ***types*** to generate code be executed on the target
|
|
||||||
* And finally executes the code on the target / applies the configuration
|
|
||||||
|
|
||||||
### Features
|
|
||||||
|
|
||||||
* Elegant code and clean design
|
|
||||||
* Type and core cleanly seperated
|
|
||||||
* Small codebase in core
|
|
||||||
* Good documentation (man pages)
|
|
||||||
* Consistency in behaviour, naming and documentation
|
|
||||||
* Meaningful error messages
|
|
||||||
* Either standard error messages from tools or added description for clearification
|
|
||||||
* The no surprise factor
|
|
||||||
* No magic guessing of what the user wants
|
|
||||||
* Simple and well-known DSL
|
|
||||||
* Posix shell
|
|
||||||
* Easy integration into bare metal installations
|
|
||||||
* requires only ssh + sh
|
|
||||||
* Easy upgrade
|
|
||||||
* ***There is no need to update cdist on target hosts!***
|
|
||||||
* cdist only needs to be updated on the master server(s)
|
|
||||||
* Very easy to extend
|
|
||||||
* Can be done via types, which can be stacked on top of others
|
|
||||||
* Reuse of existing functionality
|
|
||||||
* sh, ssh, find, rm, mv, ...
|
|
||||||
* Very easy to debug
|
|
||||||
* Just add set -x in the scripts
|
|
||||||
|
|
||||||
### OS support
|
### OS support
|
||||||
|
|
||||||
cdist was tested or is know to run on at least
|
cdist was tested or is know to run on at least
|
||||||
|
|
||||||
* [Archlinux](http://www.archlinux.org/)
|
* [Archlinux](http://www.archlinux.org/)
|
||||||
* [Debian](http://www.debian.org/)
|
* [Debian](http://www.debian.org/)
|
||||||
|
* [Fedora](http://fedoraproject.org/)
|
||||||
* [Gentoo](http://www.gentoo.org/)
|
* [Gentoo](http://www.gentoo.org/)
|
||||||
* [Mac OS X](http://www.apple.com/macosx/)
|
* [Mac OS X](http://www.apple.com/macosx/)
|
||||||
* [OpenBSD](http://www.openbsd.org)
|
* [OpenBSD](http://www.openbsd.org)
|
||||||
|
@ -230,7 +209,7 @@ Yes, I'm actually eating my own dogfood and currently managing
|
||||||
* [xfce](http://www.xfce.org/) (lightweight desktop environment)
|
* [xfce](http://www.xfce.org/) (lightweight desktop environment)
|
||||||
* [slim](http://slim.berlios.de/) (graphical login manager for X11)
|
* [slim](http://slim.berlios.de/) (graphical login manager for X11)
|
||||||
|
|
||||||
with cdist on a total of **9** production machines of the
|
with cdist on a total of **20** production machines of the
|
||||||
[Systems Group](http://www.systems.ethz.ch) at the
|
[Systems Group](http://www.systems.ethz.ch) at the
|
||||||
[ETH Zurich](http://www.ethz.ch) as well at home.
|
[ETH Zurich](http://www.ethz.ch) as well at home.
|
||||||
|
|
||||||
|
|
|
@ -158,7 +158,7 @@ __cdist_debug_echo()
|
||||||
__cdist_exec_fail_on_error()
|
__cdist_exec_fail_on_error()
|
||||||
{
|
{
|
||||||
sh -e "$@"
|
sh -e "$@"
|
||||||
[ "$?" -eq 0 ] || __cdist_exit_err "Error: $1 exited non-zero."
|
[ "$?" -eq 0 ] || __cdist_exit_err "$1 exited non-zero."
|
||||||
}
|
}
|
||||||
|
|
||||||
__cdist_exit_err()
|
__cdist_exit_err()
|
||||||
|
|
|
@ -43,6 +43,12 @@ if [ -f /etc/gentoo-release ]; then
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Fedora is also Redhat, thus return before redhat!
|
||||||
|
if grep -q ^Fedora /etc/redhat-release 2>/dev/null; then
|
||||||
|
echo fedora
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
if [ -f /etc/redhat-release ]; then
|
if [ -f /etc/redhat-release ]; then
|
||||||
echo redhat
|
echo redhat
|
||||||
exit 0
|
exit 0
|
||||||
|
|
26
conf/type/__debconf_set_selections/gencode-remote
Executable file
26
conf/type/__debconf_set_selections/gencode-remote
Executable file
|
@ -0,0 +1,26 @@
|
||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# 2011 Nico Schottelius (nico-cdist at schottelius.org)
|
||||||
|
#
|
||||||
|
# This file is part of cdist.
|
||||||
|
#
|
||||||
|
# cdist is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# cdist is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with cdist. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# Setup selections
|
||||||
|
#
|
||||||
|
|
||||||
|
echo "debconf-set-selections << __file-eof"
|
||||||
|
cat "$__object/parameter/file"
|
||||||
|
echo "__file-eof"
|
43
conf/type/__debconf_set_selections/man.text
Normal file
43
conf/type/__debconf_set_selections/man.text
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
cdist-type__debconf_set_selections(7)
|
||||||
|
=====================================
|
||||||
|
Nico Schottelius <nico-cdist--@--schottelius.org>
|
||||||
|
|
||||||
|
|
||||||
|
NAME
|
||||||
|
----
|
||||||
|
cdist-type__debconf_set_selections - Setup debconf selections
|
||||||
|
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
-----------
|
||||||
|
On Debian and alike systems debconf-set-selections(1) can be used
|
||||||
|
to setup configuration parameters.
|
||||||
|
|
||||||
|
|
||||||
|
REQUIRED PARAMETERS
|
||||||
|
-------------------
|
||||||
|
file::
|
||||||
|
If supplied, use the given filename as input for debconf-set-selections(1)
|
||||||
|
|
||||||
|
|
||||||
|
EXAMPLES
|
||||||
|
--------
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
# Setup configuration for nslcd
|
||||||
|
__debconf_set_selections nslcd --file /path/to/file
|
||||||
|
|
||||||
|
# Setup configuration for nslcd from another type
|
||||||
|
__debconf_set_selections nslcd --file "$__type/files/preseed/nslcd"
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
SEE ALSO
|
||||||
|
--------
|
||||||
|
- cdist-type(7)
|
||||||
|
|
||||||
|
|
||||||
|
COPYING
|
||||||
|
-------
|
||||||
|
Copyright \(C) 2011 Nico Schottelius. Free use of this software is
|
||||||
|
granted under the terms of the GNU General Public License version 3 (GPLv3).
|
1
conf/type/__debconf_set_selections/parameter/required
Normal file
1
conf/type/__debconf_set_selections/parameter/required
Normal file
|
@ -0,0 +1 @@
|
||||||
|
file
|
|
@ -1,6 +1,7 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
#
|
#
|
||||||
# 2011 Steven Armstrong (steven-cdist at armstrong.cc)
|
# 2011 Steven Armstrong (steven-cdist at armstrong.cc)
|
||||||
|
# 2011 Nico Schottelius (nico-cdist at schottelius.org)
|
||||||
#
|
#
|
||||||
# This file is part of cdist.
|
# This file is part of cdist.
|
||||||
#
|
#
|
||||||
|
@ -23,44 +24,31 @@
|
||||||
|
|
||||||
name="$__object_id"
|
name="$__object_id"
|
||||||
|
|
||||||
command=
|
|
||||||
if grep -q "^$name" "$__object/explorer/group"; then
|
|
||||||
# group exists
|
|
||||||
command="groupmod"
|
|
||||||
else
|
|
||||||
# group does not exist
|
|
||||||
command="groupadd"
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
get_current_value() {
|
|
||||||
local key="$1"
|
|
||||||
local index
|
|
||||||
case "$key" in
|
|
||||||
password)
|
|
||||||
cut -d':' -f 2 "$__object/explorer/gshadow"
|
|
||||||
break
|
|
||||||
;;
|
|
||||||
gid) index=3;;
|
|
||||||
esac
|
|
||||||
cut -d':' -f $index "$__object/explorer/group"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
set -- "$@"
|
|
||||||
cd "$__object/parameter"
|
cd "$__object/parameter"
|
||||||
for property in $(ls .); do
|
if grep -q "^${name}:" "$__object/explorer/group"; then
|
||||||
current_value=$(get_current_value "$property")
|
for property in $(ls .); do
|
||||||
new_value="$(cat "$property")"
|
new_value="$(cat "$property")"
|
||||||
if [ "$new_value" != "$current_value" ]; then
|
|
||||||
# Shedule changed properties for update
|
case "$key" in
|
||||||
|
password)
|
||||||
|
current_value="$(awk -F: '{ print $2 }' < "$__object/explorer/gshadow")"
|
||||||
|
;;
|
||||||
|
gid)
|
||||||
|
current_value="$(awk -F: '{ print $3 }' < "$__object/explorer/group")"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if [ "$new_value" != "$current_value" ]; then
|
||||||
|
set -- "$@" "--$property" \"$new_value\"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
[ $# -gt 0 ] && echo groupmod $@ $name
|
||||||
|
else
|
||||||
|
for property in $(ls .); do
|
||||||
|
new_value="$(cat "$property")"
|
||||||
set -- "$@" "--$property" \"$new_value\"
|
set -- "$@" "--$property" \"$new_value\"
|
||||||
fi
|
done
|
||||||
done
|
|
||||||
|
|
||||||
|
echo groupadd "$@" "$name"
|
||||||
if [ $# -gt 0 ]; then
|
|
||||||
# Update changed properties
|
|
||||||
echo $command $@ $name
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
|
@ -33,6 +33,7 @@ else
|
||||||
archlinux) type="pacman" ;;
|
archlinux) type="pacman" ;;
|
||||||
debian|ubuntu) type="apt" ;;
|
debian|ubuntu) type="apt" ;;
|
||||||
gentoo) type="emerge" ;;
|
gentoo) type="emerge" ;;
|
||||||
|
fedora) type="yum" ;;
|
||||||
*)
|
*)
|
||||||
echo "Don't know how to manage packages on: $os" >&2
|
echo "Don't know how to manage packages on: $os" >&2
|
||||||
exit 1
|
exit 1
|
||||||
|
|
|
@ -37,17 +37,19 @@ fi
|
||||||
state="$(cat "$__object/parameter/state")"
|
state="$(cat "$__object/parameter/state")"
|
||||||
is_installed="$(grep "^Status: install ok installed" "$__object/explorer/pkg_status" || true)"
|
is_installed="$(grep "^Status: install ok installed" "$__object/explorer/pkg_status" || true)"
|
||||||
|
|
||||||
|
aptget="DEBIAN_FRONTEND=noninteractive apt-get --quiet --yes"
|
||||||
|
|
||||||
case "$state" in
|
case "$state" in
|
||||||
installed)
|
installed)
|
||||||
# Install only if non-existent
|
# Install only if non-existent
|
||||||
if [ -z "$is_installed" ]; then
|
if [ -z "$is_installed" ]; then
|
||||||
echo apt-get --quiet --yes install \"$name\"
|
echo $aptget install \"$name\"
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
uninstalled)
|
uninstalled)
|
||||||
# Remove only if existent
|
# Remove only if existent
|
||||||
if [ -n "$is_installed" ]; then
|
if [ -n "$is_installed" ]; then
|
||||||
echo apt-get --quiet --yes remove \"$name\"
|
echo $aptget remove \"$name\"
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
|
@ -25,9 +25,6 @@ OPTIONAL PARAMETERS
|
||||||
name::
|
name::
|
||||||
If supplied, use the name and not the object id as the package name.
|
If supplied, use the name and not the object id as the package name.
|
||||||
|
|
||||||
preseed::
|
|
||||||
If supplied, use the given filename as input for debconf-set-selections(1)
|
|
||||||
|
|
||||||
|
|
||||||
EXAMPLES
|
EXAMPLES
|
||||||
--------
|
--------
|
||||||
|
@ -39,9 +36,6 @@ __package_apt zsh --state installed
|
||||||
# In case you only want *a* webserver, but don't care which one
|
# In case you only want *a* webserver, but don't care which one
|
||||||
__package_apt webserver --state installed --name nginx
|
__package_apt webserver --state installed --name nginx
|
||||||
|
|
||||||
# Install package with defaults (from a type)
|
|
||||||
__package_apt postfix --state installed --preseed "$__type/files/postfix-seed"
|
|
||||||
|
|
||||||
# Remove obsolete package
|
# Remove obsolete package
|
||||||
__package_apt puppet --state deinstalled
|
__package_apt puppet --state deinstalled
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
|
|
@ -1,3 +1,2 @@
|
||||||
name
|
name
|
||||||
preseed
|
|
||||||
version
|
version
|
||||||
|
|
30
conf/type/__package_yum/explorer/pkg_version
Executable file
30
conf/type/__package_yum/explorer/pkg_version
Executable file
|
@ -0,0 +1,30 @@
|
||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# 2011 Nico Schottelius (nico-cdist at schottelius.org)
|
||||||
|
#
|
||||||
|
# This file is part of cdist.
|
||||||
|
#
|
||||||
|
# cdist is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# cdist is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with cdist. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# Retrieve the status of a package - parsed dpkg output
|
||||||
|
#
|
||||||
|
|
||||||
|
if [ -f "$__object/parameter/name" ]; then
|
||||||
|
name="$(cat "$__object/parameter/name")"
|
||||||
|
else
|
||||||
|
name="$__object_id"
|
||||||
|
fi
|
||||||
|
|
||||||
|
rpm -q --whatprovides "$name" 2>/dev/null || true
|
47
conf/type/__package_yum/gencode-remote
Executable file
47
conf/type/__package_yum/gencode-remote
Executable file
|
@ -0,0 +1,47 @@
|
||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# 2011 Nico Schottelius (nico-cdist at schottelius.org)
|
||||||
|
#
|
||||||
|
# This file is part of cdist.
|
||||||
|
#
|
||||||
|
# cdist is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# cdist is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with cdist. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# Manage packages with yum (mostly Fedora)
|
||||||
|
#
|
||||||
|
|
||||||
|
if [ -f "$__object/parameter/name" ]; then
|
||||||
|
name="$__object/parameter/name"
|
||||||
|
else
|
||||||
|
name="$__object_id"
|
||||||
|
fi
|
||||||
|
|
||||||
|
state="$(cat "$__object/parameter/state")"
|
||||||
|
|
||||||
|
opts="--assumeyes --quiet"
|
||||||
|
|
||||||
|
not_installed="^no package provides"
|
||||||
|
|
||||||
|
case "$state" in
|
||||||
|
installed)
|
||||||
|
if grep -q "$not_installed" "$__object/explorer/pkg_version"; then
|
||||||
|
echo yum $opts install \"$name\"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
uninstalled)
|
||||||
|
if ! grep -q "$not_installed" "$__object/explorer/pkg_version"; then
|
||||||
|
echo yum $opts remove \"$name\"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
54
conf/type/__package_yum/man.text
Normal file
54
conf/type/__package_yum/man.text
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
cdist-type__package_yum(7)
|
||||||
|
==========================
|
||||||
|
Nico Schottelius <nico-cdist--@--schottelius.org>
|
||||||
|
|
||||||
|
|
||||||
|
NAME
|
||||||
|
----
|
||||||
|
cdist-type__package_yum - Manage packages with yum
|
||||||
|
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
-----------
|
||||||
|
Yum is usually used on the Fedora distribution to manage packages.
|
||||||
|
If you specify an unknown package, yum will display the
|
||||||
|
slightly confusing error message "Error: Nothing to do".
|
||||||
|
|
||||||
|
|
||||||
|
REQUIRED PARAMETERS
|
||||||
|
-------------------
|
||||||
|
state::
|
||||||
|
Either "installed" or "deinstalled".
|
||||||
|
|
||||||
|
|
||||||
|
OPTIONAL PARAMETERS
|
||||||
|
-------------------
|
||||||
|
name::
|
||||||
|
If supplied, use the name and not the object id as the package name.
|
||||||
|
|
||||||
|
|
||||||
|
EXAMPLES
|
||||||
|
--------
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
# Ensure zsh in installed
|
||||||
|
__package_yum zsh --state installed
|
||||||
|
|
||||||
|
# If you don't want to follow pythonX packages, but always use python
|
||||||
|
__package_yum python --state installed --name python2
|
||||||
|
|
||||||
|
# Remove obsolete package
|
||||||
|
__package_yum puppet --state deinstalled
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
SEE ALSO
|
||||||
|
--------
|
||||||
|
- cdist-type(7)
|
||||||
|
- cdist-type__package(7)
|
||||||
|
|
||||||
|
|
||||||
|
COPYING
|
||||||
|
-------
|
||||||
|
Copyright \(C) 2011 Nico Schottelius. Free use of this software is
|
||||||
|
granted under the terms of the GNU General Public License version 3 (GPLv3).
|
1
conf/type/__package_yum/parameter/optional
Normal file
1
conf/type/__package_yum/parameter/optional
Normal file
|
@ -0,0 +1 @@
|
||||||
|
name
|
1
conf/type/__package_yum/parameter/required
Normal file
1
conf/type/__package_yum/parameter/required
Normal file
|
@ -0,0 +1 @@
|
||||||
|
state
|
|
@ -1,6 +1,7 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
#
|
#
|
||||||
# 2011 Steven Armstrong (steven-cdist at armstrong.cc)
|
# 2011 Steven Armstrong (steven-cdist at armstrong.cc)
|
||||||
|
# 2011 Nico Schottelius (nico-cdist at schottelius.org)
|
||||||
#
|
#
|
||||||
# This file is part of cdist.
|
# This file is part of cdist.
|
||||||
#
|
#
|
||||||
|
@ -23,60 +24,47 @@
|
||||||
|
|
||||||
name="$__object_id"
|
name="$__object_id"
|
||||||
|
|
||||||
command=
|
|
||||||
if grep -q "^$name" "$__object/explorer/passwd"; then
|
|
||||||
# user exists
|
|
||||||
command="usermod"
|
|
||||||
else
|
|
||||||
# user does not exist
|
|
||||||
command="useradd"
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
get_current_value() {
|
|
||||||
local key="$1"
|
|
||||||
local new_value="$2"
|
|
||||||
|
|
||||||
local explorer="$__object/explorer/passwd"
|
|
||||||
local index
|
|
||||||
case "$key" in
|
|
||||||
password)
|
|
||||||
explorer="$__object/explorer/shadow"
|
|
||||||
index=2
|
|
||||||
;;
|
|
||||||
uid) index=3;;
|
|
||||||
gid)
|
|
||||||
if [[ $new_value =~ ^[0-9]+$ ]]; then
|
|
||||||
# numeric gid
|
|
||||||
index=4
|
|
||||||
else
|
|
||||||
# group name
|
|
||||||
explorer="$__object/explorer/group"
|
|
||||||
index=1
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
comment) index=5;;
|
|
||||||
home) index=6;;
|
|
||||||
shell) index=7;;
|
|
||||||
esac
|
|
||||||
cut -d':' -f $index "$explorer"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
set -- "$@"
|
|
||||||
cd "$__object/parameter"
|
cd "$__object/parameter"
|
||||||
for property in $(ls .); do
|
if grep -q "^${name}:" "$__object/explorer/passwd"; then
|
||||||
new_value="$(cat "$property")"
|
for property in $(ls .); do
|
||||||
current_value=$(get_current_value "$property" "$new_value")
|
new_value="$(cat "$property")"
|
||||||
if [ "$new_value" != "$current_value" ]; then
|
|
||||||
# Shedule changed properties for update
|
file="$__object/explorer/passwd"
|
||||||
|
|
||||||
|
case "$property" in
|
||||||
|
password)
|
||||||
|
field=3
|
||||||
|
file="$__object/explorer/shadow"
|
||||||
|
;;
|
||||||
|
gid)
|
||||||
|
if $(echo "$new_value" | grep -q '^[0-9][0-9]*$'); then
|
||||||
|
field=4
|
||||||
|
else
|
||||||
|
# group name
|
||||||
|
file="$__object/explorer/group"
|
||||||
|
field=1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
uid) field=3 ;;
|
||||||
|
comment) field=5 ;;
|
||||||
|
home) field=6 ;;
|
||||||
|
shell) field=7 ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
export field
|
||||||
|
current_value="$(awk -F: '{ print $ENVIRON["field"] }' < "$file")"
|
||||||
|
|
||||||
|
if [ "$new_value" != "$current_value" ]; then
|
||||||
|
set -- "$@" "--$property" \"$new_value\"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
[ $# -gt 0 ] && echo usermod "$@" "$name"
|
||||||
|
else
|
||||||
|
for property in $(ls .); do
|
||||||
|
new_value="$(cat "$property")"
|
||||||
set -- "$@" "--$property" \"$new_value\"
|
set -- "$@" "--$property" \"$new_value\"
|
||||||
fi
|
done
|
||||||
done
|
|
||||||
|
|
||||||
|
echo useradd "$@" "$name"
|
||||||
if [ $# -gt 0 ]; then
|
|
||||||
# Update changed properties
|
|
||||||
echo $command $@ $name
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,12 @@
|
||||||
|
1.6.0:
|
||||||
|
* New Type __package_yum
|
||||||
|
* New type __debconf_set_selections
|
||||||
|
* Fix Type __group in case of __group NAME syntax
|
||||||
|
* Type __package gained Fedora support
|
||||||
|
* Removed --preseed support from __package_apt
|
||||||
|
* explorer/os: gained Fedora support
|
||||||
|
* Simplified types __user and __group
|
||||||
|
|
||||||
1.5.0: 2011-04-01
|
1.5.0: 2011-04-01
|
||||||
* Add basic cache functionality
|
* Add basic cache functionality
|
||||||
* New type __process
|
* New type __process
|
||||||
|
|
9
doc/dev/logs/2011-04-02.yum
Normal file
9
doc/dev/logs/2011-04-02.yum
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
Fun with yum:
|
||||||
|
|
||||||
|
[root@brett ~]# yum --assumeyes --quiet install "vim"
|
||||||
|
Package 2:vim-enhanced-7.3.056-1.fc14.x86_64 already installed and latest version
|
||||||
|
[root@brett ~]# rpm -q vim
|
||||||
|
package vim is not installed
|
||||||
|
[root@brett ~]#
|
||||||
|
|
||||||
|
(Me || yum) == dumb?
|
1
doc/dev/todo/1.6
Normal file
1
doc/dev/todo/1.6
Normal file
|
@ -0,0 +1 @@
|
||||||
|
- adjust documentation / stages
|
|
@ -26,13 +26,14 @@ CORE
|
||||||
|
|
||||||
TYPES
|
TYPES
|
||||||
------
|
------
|
||||||
Types to be written/extended:
|
- __ssh-keys (host/user)
|
||||||
- __ssh-keys (host/user)
|
- __file_edit
|
||||||
- Think about __service - necessary?
|
- regexp replace (can probably cover all?)
|
||||||
- __file_edit
|
-> aka sed.
|
||||||
- regexp replace (can probably cover all?)
|
- __cron
|
||||||
-> aka sed.
|
- __user:
|
||||||
- __cron
|
add option to include --create-home
|
||||||
|
fix __user NAME case (same issue as __group)
|
||||||
|
|
||||||
DOCUMENTATION
|
DOCUMENTATION
|
||||||
--------------
|
--------------
|
||||||
|
@ -45,7 +46,3 @@ Cache:
|
||||||
- export variable $__cache
|
- export variable $__cache
|
||||||
-> for current host
|
-> for current host
|
||||||
-> add function to cdist-config, import from cdist-cache
|
-> add function to cdist-config, import from cdist-cache
|
||||||
|
|
||||||
|
|
||||||
remove --preseed from package_apt and add debconf_set_selection or similar
|
|
||||||
-> much cleaner!
|
|
||||||
|
|
|
@ -1 +1,2 @@
|
||||||
Release 1.5.0 correctly :-)
|
remove --preseed from package_apt and add debconf_set_selection or similar
|
||||||
|
-> much cleaner!
|
||||||
|
|
|
@ -135,19 +135,8 @@ tmp_dir::
|
||||||
|
|
||||||
TYPES
|
TYPES
|
||||||
-----
|
-----
|
||||||
The following types are available:
|
The available types are listed in the SEE ALSO section
|
||||||
|
and are referenced as cdist-type__TYPENAME.
|
||||||
eof
|
|
||||||
for type in man7/cdist-type__*; do
|
|
||||||
name_1="${type#man7/cdist-type}"
|
|
||||||
name_2="${name_1%.7}"
|
|
||||||
|
|
||||||
name="$name_2"
|
|
||||||
echo "- $name"
|
|
||||||
done
|
|
||||||
|
|
||||||
cat << eof
|
|
||||||
|
|
||||||
|
|
||||||
VARIABLES
|
VARIABLES
|
||||||
---------
|
---------
|
||||||
|
@ -187,7 +176,7 @@ SEE ALSO
|
||||||
--------
|
--------
|
||||||
- cdist(7)
|
- cdist(7)
|
||||||
eof
|
eof
|
||||||
for type in man7/cdist-type__*; do
|
for type in man7/cdist-type__*.7; do
|
||||||
name_1="${type#man7/}"
|
name_1="${type#man7/}"
|
||||||
name_2="${name_1%.7}"
|
name_2="${name_1%.7}"
|
||||||
|
|
||||||
|
|
|
@ -60,6 +60,84 @@ machine-a % git clone git://your-git-server/cdist
|
||||||
machine-b % git clone git://your-git-server/cdist
|
machine-b % git clone git://your-git-server/cdist
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
SEPERATING WORK BY GROUPS
|
||||||
|
-------------------------
|
||||||
|
If you are working with different groups on one cdist-configuration,
|
||||||
|
you can delegate to other manifests and have the groups edit only
|
||||||
|
their manifests. You can use the following snippet in
|
||||||
|
**conf/manifests/init**:
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
# Include other groups
|
||||||
|
sh -e "$__manifest/systems"
|
||||||
|
|
||||||
|
sh -e "$__manifest/cbrg"
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
MAINTAINING MULTIPLE CONFIGURATIONS
|
||||||
|
-----------------------------------
|
||||||
|
When you need to manage multiple sites with cdist, like company_a, company_b
|
||||||
|
and private for instance, you can easily use git for this purpose.
|
||||||
|
Including a possible common base that is reused accross the different sites:
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
# create branches
|
||||||
|
git branch company_a company_b common private
|
||||||
|
|
||||||
|
# make stuff for company a
|
||||||
|
git checkout company_a
|
||||||
|
# work, commit, etc.
|
||||||
|
|
||||||
|
# make stuff for company b
|
||||||
|
git checkout company_b
|
||||||
|
# work, commit, etc.
|
||||||
|
|
||||||
|
# make stuff relevant for all sites
|
||||||
|
git checkout common
|
||||||
|
# work, commit, etc.
|
||||||
|
|
||||||
|
# change to private and include latest common stuff
|
||||||
|
git checkout private
|
||||||
|
git merge common
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
The following **.git/config** is taken from a a real world scenario:
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
# Track upstream, merge from time to time
|
||||||
|
[remote "upstream"]
|
||||||
|
url = git://git.schottelius.org/cdist
|
||||||
|
fetch = +refs/heads/*:refs/remotes/upstream/*
|
||||||
|
|
||||||
|
# Same as upstream, but works when being offline
|
||||||
|
[remote "local"]
|
||||||
|
fetch = +refs/heads/*:refs/remotes/local/*
|
||||||
|
url = /home/users/nico/p/cdist
|
||||||
|
|
||||||
|
# Remote containing various ETH internal branches
|
||||||
|
[remote "eth"]
|
||||||
|
url = sans.ethz.ch:/home/services/sans/git/cdist-eth
|
||||||
|
fetch = +refs/heads/*:refs/remotes/eth/*
|
||||||
|
|
||||||
|
# Public remote that contains my private changes to cdist upstream
|
||||||
|
[remote "nico"]
|
||||||
|
url = git.schottelius.org:/home/services/git/cdist-nico
|
||||||
|
fetch = +refs/heads/*:refs/remotes/nico/*
|
||||||
|
|
||||||
|
# The "nico" branch will be synced with the remote nico, branch master
|
||||||
|
[branch "nico"]
|
||||||
|
remote = nico
|
||||||
|
merge = refs/heads/master
|
||||||
|
|
||||||
|
# ETH stable contains rock solid configurations used in various places
|
||||||
|
[branch "eth-stable"]
|
||||||
|
remote = eth
|
||||||
|
merge = refs/heads/stable
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Have a look at git-remote(1) to adjust the remote configuration, which allows
|
||||||
|
you to push certain branches to certain remotes.
|
||||||
|
|
||||||
|
|
||||||
SEE ALSO
|
SEE ALSO
|
||||||
--------
|
--------
|
||||||
|
|
Loading…
Reference in a new issue