.. -*- mode: rst -*-
.. _server-plugins-structures-bundler-index:
=======
Bundler
=======
Bundler is used to describe groups of inter-dependent configuration
entries, such as the combination of packages, configuration files,
and service activations that comprise typical Unix daemons. Bundles are
used to add groups of configuration entries to the inventory of client
configurations, as opposed to describing particular versions of those
entries. For example, a bundle could say that the configuration file
``/etc/passwd`` should be included in a configuration, but will not
describe the particular version of ``/etc/passwd`` that a given client
will receive.
Groups can be used inside of bundles to differentiate which entries
particular clients will recieve; this is useful for the case where
entries are named differently across systems; for example, one linux
distro may have a package called openssh while another uses the name
ssh. Configuration entries nested inside of Group elements only apply
to clients who are a member of those groups; multiple nested groups must
all apply. Also, groups may be negated; entries included in such groups
will only apply to clients who are not a member of said group.
The following is an annotated copy of a bundle:
.. code-block:: xml
In this bundle, most of the entries are common to all systems. Clients in
group **deb** get one extra package and service, while clients in group
**rpm** get two extra packages and an extra service. In addition, clients
in group **fedora** *and* group **rpm** get one extra package entries,
unless they are not in the **fc4** group, in which case, they get an
extra package. Notice that this file doesn't describe which versions
of these entries that clients should get, only that they should get
them. (Admittedly, this example is slightly contrived, but demonstrates
how group entries can be used in bundles)
+----------------------------+-------------------------------+
| Group | Entry |
+============================+===============================+
| all | /etc/ssh/ssh_host_dsa_key |
+----------------------------+-------------------------------+
| all | /etc/ssh/ssh_host_rsa_key |
+----------------------------+-------------------------------+
| all | /etc/ssh/ssh_host_dsa_key.pub |
+----------------------------+-------------------------------+
| all | /etc/ssh/ssh_host_rsa_key.pub |
+----------------------------+-------------------------------+
| all | /etc/ssh/ssh_host_key |
+----------------------------+-------------------------------+
| all | /etc/ssh/ssh_host_key.pub |
+----------------------------+-------------------------------+
| all | /etc/ssh/sshd_config |
+----------------------------+-------------------------------+
| all | /etc/ssh/ssh_config |
+----------------------------+-------------------------------+
| all | /etc/ssh/ssh_known_hosts |
+----------------------------+-------------------------------+
| rpm | Package openssh |
+----------------------------+-------------------------------+
| rpm | Package openssh-askpass |
+----------------------------+-------------------------------+
| rpm | Service sshd |
+----------------------------+-------------------------------+
| rpm and fedora | Package openssh-server |
+----------------------------+-------------------------------+
| rpm and fedora and not fc4 | Package openssh-clients |
+----------------------------+-------------------------------+
| deb | Package ssh |
+----------------------------+-------------------------------+
| deb | Service ssh |
+----------------------------+-------------------------------+
Genshi templates
================
Genshi templates are used by adding a Genshi xml-style template to the
Bundler directory with a ``.genshi`` file extension. Version 0.4 or newer
of genshi is required.
.. important:: The ``.genshi`` file extension is required in order for the
server to know that the Bundle should be rendered using
Genshi.
Motivation
----------
Static Bundles have served us relatively well, but have a relatively
weak set of interal per-client differentiation mechanisms. In static
Bundles, the group hierarchy (from the perspective of the current
client) is available for use via boolean constraints with negation. This
notion does not mesh well with the use of Probes, which can result in
freeform data. In the presence of probe results, clients can have a wide
array of data, and rendering down to a boolean logic may not always
be desirable. Moreover, while static Bundles allow entry inclusion or
exclusion based on group memberships, they do not allow programatic entry
rendering. Hence, Genshi templates not only provide more control options,
but it also provide the ability to perform new entry rendering operations.
The `Genshi templating system`_ is used internally.
.. _Genshi templating system: http://genshi.edgewall.org/
Use
---
Bcfg uses the Genshi API for templates, and performs a XML format
stream rendering of the template into an lxml entry, which is included
in the client configuration. :ref:`Client metadata `
is avilable inside of the template using the 'metadata' name. Note that
only the markup Genshi template format can be used, as the target output
format is XML.
A Genshi template looks much like a Bundler file, except the Bundle tag
has an additional `xmlns:py` attribute. See the examples.
Altsrc
======
.. toctree::
:maxdepth: 1
../altsrc
Examples
========
In some cases, configuration files need to include the client's hostname
in their name. The following template produces such a config file entry.
.. code-block:: xml
Depending on the circumstance, these configuration files can either be
handled by individual entries in :ref:`server-plugins-generators-cfg`,
:ref:`server-plugins-generators-tcheetah`, or
:ref:`server-plugins-generators-tgenshi-index`, or can be mapped to a
single entry by using the :ref:`server-plugins-structures-altsrc` feature.
In this example, configuration file names are built using probed results
from the client. getmac is a probe that gathers client MAC addresses
and returns them in a newline delimited string.
.. code-block:: xml
.. note::
* The use of the altsrc directive causes all ifcfg files to be handled by the same plugin and entry.
* The blocks have only been available in genshi since 0.4 (http://genshi.edgewall.org/ticket/84)
If you want a file to be only on a per-client basis, you can use an
if declaration:
.. code-block:: xml
or alternately:
.. code-block:: xml
The latter form is preferred if the if block contains multiple
files. While this example is simple, the test in the if block can in
fact be any python statement.
Other examples
==============
Some simple examples of Bundles can be found in the example repository
at the locations in the following table:
+--------------+---------------------+
| Bundle Name | Description |
+==============+=====================+
| `atxml`_ | At bundle |
+--------------+---------------------+
| `bcfgxml`_ | Bcfg2 client bundle |
+--------------+---------------------+
| `ntpxml`_ | NTP bundle |
+--------------+---------------------+
| `sshxml`_ | OpenSSH bundle |
+--------------+---------------------+
| `syslogxml`_ | syslog bundle |
+--------------+---------------------+
.. _atxml: http://trac.mcs.anl.gov/projects/bcfg2/browser/trunk/repository/Bundler/at.xml
.. _bcfgxml: http://trac.mcs.anl.gov/projects/bcfg2/browser/trunk/repository/Bundler/bcfg.xml
.. _ntpxml: http://trac.mcs.anl.gov/projects/bcfg2/browser/trunk/repository/Bundler/ntp.xml
.. _sshxml: http://trac.mcs.anl.gov/projects/bcfg2/browser/trunk/repository/Bundler/ssh.xml
.. _syslogxml: http://trac.mcs.anl.gov/projects/bcfg2/browser/trunk/repository/Bundler/syslog.xml
In addition to the example repository, the following is a list of some
more complex example Bundles.
.. toctree::
:maxdepth: 1
kernel
moab
nagios
ntp
snmpd
torque
yp