.. -*- mode: rst -*- .. _server-plugins-grouping-metadata: ======== Metadata ======== The metadata mechanism has two types of information, client metadata and group metadata. The client metadata describes which top level group a client is associated with.The group metadata describes groups in terms of what bundles and other groups they include. Each aspect grouping and clients' memberships are reflected in the ``Metadata/groups.xml`` and ``Metadata/clients.xml`` files, respectively. Usage of Groups in Metadata =========================== Clients are assigned membership of groups in the Metadata descriptions. Clients can be directly assigned to *'profile'* or *'public'* groups. Client membership of all other groups is by those groups being associated with the profile or public groups. This file can be indirectly modified from clients through use of the ``-p`` flag to ``bcfg2``. Clients are associated with profile groups in ``Metadata/clients.xml`` as shown below. .. _server-plugins-grouping-metadata-clients-xml: Metadata/clients.xml ==================== The ``Metadata/clients.xml`` file contains the mappings of Profile Groups to clients. The file is just a series of ** tags, each of which describe one host. A sample file is below: .. code-block:: xml Clients Tag ----------- The Clients tag has the following possible attributes: +---------+-----------------------+--------+ | Name | Description | Values | +=========+=======================+========+ | version | Client schema version | String | +---------+-----------------------+--------+ Client Tag ---------- Each entry in ``clients.xml`` **must** have the following properties: +---------+---------------------------------------+--------+ | Name | Description | Values | +=========+=======================================+========+ | name | Host name of client. This needs to be | String | | | the name (possibly a FQDN) returned | | | | by a reverse lookup on the connecting | | | | IP address. | | +---------+---------------------------------------+--------+ | profile | Profile group name to associate this | String | | | client with. | | +---------+---------------------------------------+--------+ Additionally, the following properties can be specified: +----------+----------------------------------------+----------------+ | Name | Description | Values | +==========+========================================+================+ | Alias | Alternative name and address for the | XML Element | | | client. | | +----------+----------------------------------------+----------------+ | address | Establishes an extra IP address that | ip address | | | resolves to this client. | | +----------+----------------------------------------+----------------+ | location | Requires requests to come from an IP | fixed|floating | | | address that matches the client | | | | record. | | +----------+----------------------------------------+----------------+ | password | Establishes a per-node password that | String | | | can be used instead of the global | | | | password. | | +----------+----------------------------------------+----------------+ | pingable | If the client is pingable (deprecated; | Y|N | | | for old reporting system) | | +----------+----------------------------------------+----------------+ | pingtime | Last time the client was pingable | String | | | (deprecated; for old reporting system) | | +----------+----------------------------------------+----------------+ | secure | Requires the use of the per-client | true|false | | | password for this client. | | +----------+----------------------------------------+----------------+ | uuid | Establishes a per-node name that can | String | | | be used to bypass dns-based client | | | | resolution. | | +----------+----------------------------------------+----------------+ For detailed information on client authentication see :ref:`appendix-guides-authentication` Metadata/groups.xml =================== The ``Metadata/groups.xml`` file contains Group and Profile definitions. Here's a simple ``Metadata/groups.xml`` file: .. code-block:: xml Nested/chained groups definitions are conjunctive (logical and). For instance, in the above example, a client associated with the Profile Group ``mail-server`` is also a member of the ``apache-server``, ``rhel-as-5-x86``, ``nfs-client``, ``server``, and ``rhel`` groups. Groups describe clients in terms for abstract, disjoint aspects. Groups can be combined to form complex descriptions of clients that use configuration commonality and inheritance. Groups have several attributes, described below: Metadata Groups Tag ------------------- The Groups tag has the following possible attributes: +----------+---------------------------------+--------+ | Name | Description | Values | +==========+=================================+========+ | version | Group schema version | String | +----------+---------------------------------+--------+ | origin | URL of master version | String | | | (for common repository) | | +----------+---------------------------------+--------+ | revision | Master version control revision | String | +----------+---------------------------------+--------+ Metadata Group Tag ------------------ The Group Tag has the following possible attributes: +----------+------------------------------------------+--------------+ | Name | Description | Values | +==========+==========================================+==============+ | name | Name of the group | String | +----------+------------------------------------------+--------------+ | profile | If a client can be directly associated | True|False | | | with this group | | +----------+------------------------------------------+--------------+ | public | If a client can freely associate itself | True|False | | | with this group. For use with the | | | | *bcfg2 -p* option on the client. | | +----------+------------------------------------------+--------------+ | category | A group can only contain one instance of | String | | | a group in any one category. This | | | | provides the basis for representing | | | | groups which are conjugates of one | | | | another in a rigorous way. It also | | | | provides the basis for negation. | | +----------+------------------------------------------+--------------+ | default | Set as the profile to use for clients | True|False | | | that are not associated with a profile | | | | in ``clients.xml`` | | +----------+------------------------------------------+--------------+ | comment | English text description of group | String | +----------+------------------------------------------+--------------+ Groups can also contain other groups and bundles. Use of XInclude =============== `XInclude `_ is a W3C specification for the inclusion of external XML documents into XML source files. Much like the use of ``#include`` in C, this allows complex definitions to be split into smaller, more manageable pieces. As of bcfg2-0.9.0pre1, the `Metadata`_ plugin supports the use of XInclude specifications to split the ``clients.xml`` and ``groups.xml`` files. This mechanism allows the following specification to produce useful results: .. code-block:: xml Each of the included groups files has the same format. These files are properly validated by ``bcfg2-lint``. This mechanism is useful for composing group definitions from multiple sources, or setting different permissions in an svn repository. Probes ====== The metadata plugin includes client-side probing functionality. This is fully documented :ref:`here `. .. _server-plugins-grouping-metadata-clientmetadata: ClientMetadata ============== A special client metadata class is available to the :ref:`TGenshi ` and :ref:`TCheetah ` plugins. +----------------------+------------------------------------------------+-------------------+ | Attribute | Description | Value | +======================+================================================+===================+ | hostname | Client hostname | String | +----------------------+------------------------------------------------+-------------------+ | profile | Client profile | String | +----------------------+------------------------------------------------+-------------------+ | aliases | Client aliases | List | +----------------------+------------------------------------------------+-------------------+ | addresses | Adresses this client is known by | List | +----------------------+------------------------------------------------+-------------------+ | groups | Groups this client is a member of | List | +----------------------+------------------------------------------------+-------------------+ | categories | Categories of this clients groups | List | +----------------------+------------------------------------------------+-------------------+ | uuid | uuid identifier for this client | String | +----------------------+------------------------------------------------+-------------------+ | password | bcfg password for this client | String | +----------------------+------------------------------------------------+-------------------+ | connectors | connector plugins known to this client | List | +----------------------+------------------------------------------------+-------------------+ | query | MetadataQuery object | MetadataQuery | +----------------------+------------------------------------------------+-------------------+ | +------------------------------+------------------------------------------------+-------------------+ | Method | Description | Value | +==============================+================================================+===================+ | inGroup(group) | True if this client is a memnber of 'group' | Boolean | +------------------------------+------------------------------------------------+-------------------+ | group_in_category(category) | Returns the group in 'category' if the client | String | | | is a member of 'category', otherwise '' | | +------------------------------+------------------------------------------------+-------------------+ MetadataQuery ------------- This class provides query methods for the metadata of all clients known to the Bcfg2 server. Note that ``*by_groups()`` and ``*by_profiles()`` behave differently; for a client to be included in the return value of a ``by_groups()`` method, it must be a member of *all* groups listed in the argument; for a client to be included in the return value of a ``by_profiles()`` method, it must have any group listed as its profile group. +------------------------------+------------------------------------------------+-------------------+ | Method | Description | Value | +==============================+================================================+===================+ | by_name(client) | Get ClientMetadata object for 'client' | ClientMetadata | +------------------------------+------------------------------------------------+-------------------+ | by_groups(groups) | Get ClientMetadata object for clients in all | List of | | | listed groups | ClientMetadata | +------------------------------+------------------------------------------------+-------------------+ | by_profiles(client) | Get ClientMetadata objects for clients whose | List of | | | profile matches any listed profile group | ClientMetadata | +------------------------------+------------------------------------------------+-------------------+ | names_by_groups(groups) | Get the names of all clients in all listed | List of strings | | | groups | | +------------------------------+------------------------------------------------+-------------------+ | names_by_profiles(profiles) | Get the names of clients whose profile matches | List of strings | | | any listed profile group | | +------------------------------+------------------------------------------------+-------------------+ | all_clients() | All known client hostnames | List of strings | +------------------------------+------------------------------------------------+-------------------+ | all_groups() | All known group names | List of strings | +------------------------------+------------------------------------------------+-------------------+ | all_groups_in_category(cat) | The names of all groups in category 'cat' | List of strings | +------------------------------+------------------------------------------------+-------------------+ | all() | Get ClientMetadata for all clients | List of | | | | ClientMetadata | +------------------------------+------------------------------------------------+-------------------+