Instructions pour configurer DPM avec ncm-puppet

au dernier WC LCG-FR (Nov 2017), pendant la session QVPDQ certain sites ont manifesté l’intérêt pour la méthode de configuration de DPM via ncm-puppet. Cette méthode permet d'utiliser, à l’intérieur de quattor, les modules puppet standard fournis par les développeurs DPM.
Actuellement la méthode est utilisée en production à GRIF_LLR et GRIF_LPNHE.
Après discussion nous avons décidé trois actions à faire avant (et afin) que les autres sites puissent tester (et éventuellement adopter) ce système de configuration:

1. terminer le développement de la composante quattor ncm-puppet pour la rendre compatible avec puppet v5. done
2. changer les templates standard pour DPM de façon qu'ils utilisent la version officielle du meta-module dpm (lcgdm-dpm) plutôt que la version legacy (sartiran-dpm). done
3. préparer une documentation. cette page

Composant ncm-puppet et templates puppet généraux

la version de ncm-puppet et des templates compatible avec puppet v5 est la 17.12.0. Si vous n'avez pas encore installé cette version vous pouvez trouver ici le rpm de la nouvelle composant ncm-puppet et récupérer sur GIT les templates suivantes

il faut aussi les packets puppet et leurs dépendances (ici et ici pour centos 7). Vous pouvez faire un miroir ou pointer spma directement a ces répertoires.

Templates DPM pour ncm-puppet

certaines fonctionnalités sont disponibles seulement dans les versions plus récentes des templates Quattor. Assurez vous d’être a jour avec GIT

Configurer DPM avec NCM-puppet

pour pouvoir configurer DPM avec ncm-puppet il faut inclure la configuration générale puppet

variable PUPPET_VERSION?='5.0.0';

include 'features/puppet/config';

et déclarer, avant l'inclusion de machine-types/grid/se_dpm,

variable DPM_USE_PUPPET_CONFIG=true;

Configurer les services DPM

pour configurer les services DPM il faut déclarer les paramètres pour la votre BDD

variable DPM_DB_PARAMS ?= nlist(
    "password", "<db password>",
    "adminuser", "root",
    "adminpwd", "<db admin password>",
);

pour dmlite,

variable DMLITE_TOKEN_PASSWORD ?= 'XXXX'; # WARNING: it must be of at least 32 chars
                                          # old templates version may have a default value, please change it

et la composition de votre stockage

variable DPM_HOSTS = dict(
    "dpm", list(<headnode>),
    "dpns", list(<headnode>),
    "srmv1", list(<headnode>),
    "srmv22", list(<headnode>),
    "disk", list(
        "<disknode>",
        "<disknode>",
         ....
    );
);

et déclarer qui activent/désactivent des fonctionnalités. Les valeurs ici sont les valeurs par default. Si vous les gardez vous pouvez éviter de définir la variable.

#Fixing some default values
variable GRIDFTP_REDIR_ENABLED ?= false;
variable HTTPS_ENABLED ?= false;
variable DPM_MEMCACHED_ENABLED ?= false;
variable GRIDFTP_REDIR_ENABLED ?= false;
variable DOME_ENABLED ?= false;
variable DOME_FLAVOUR ?= false;

variable DPM_LOG_LEVEL ?= 0;
variable DPM_DISK_LOG_LEVEL ?= DPM_LOG_LEVEL;
variable DPM_HEAD_LOG_LEVEL ?= DPM_LOG_LEVEL;

variable DPMMGR_UID ?= 970; #!!!!WARNING: pay attention to this
variable DPMMGR_GID ?= 970; #    the default may not be what you want

il faut aussi choisir la version du module. Le default est la version actuelle mais il est mieux regarder sur puppetforge pour vérifier quel est la dernière version.

#Including the needed modules
variable DPM_PUPPET_MODULE_VERSION ?= '0.6.0';
variable DPM_PUPPET_MODULE ?= 'lcgdm-dpm'; #you really do not need to change this

une autre solution, qui est préférable, est d'utiliser les modules officiels qui dont dans epel. Pour utiliser ces modules.

variable DPM_PUPPET_RELEASE_MODULES = true;

Attention: depuis 05/2018 le metapackage lcg-CA n'existe plus. Comme c'est le package défini par default dans les modules puppet pour fetchcrl, il faut le changer en ajoutant à vos profiles la ligne

'/software/components/puppet/hieradata/{fetchcrl::capkgs}' = list('ca-policy-egi-core');

Configurer xrootd et les fédérations

pour configurer xrootd

variable XROOTD_SITE_NAME='<your name>';
variable DPM_XROOTD_SHARED_KEY='XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX=';

la configuration spécifique dépend de la VO

CMS

Attention: la configuration détaillée ici nécessite d'une version récente (>0.5.5) des modules puppet lcgdm-dmlite.

ajouter un éventuel template avec une configuration additionnelle pour le site (par exemple écrire le TFC dans le bon endroit)

variable XROOTD_FEDERATION_SITE_CONFIG = 'path/tosite/config';

Après on définit les paramètres de la fédération. Attention, il faut changer namelib_prefix et namelib.

variable XROOTD_FEDERATION_PARAMS ?= dict();

variable XROOTD_FEDERATION_PARAMS = {
        cms = nlist();
        cms[escape('name')]='cms';
        cms[escape('fed_host')]='xrootd-cms.infn.it';
        cms[escape('xrootd_port')]= null;
        cms[escape('direct')]= 'true';
        cms[escape('cmsd_port')]=1413;
        cms[escape('local_port')]=11001;
        cms[escape('namelib_prefix')]="/dpm/in2p3.fr/home/cms";
        cms[escape('namelib')]="libXrdCmsTfc.so file:/etc/xrootd/storage.xml?protocol=cms";
        cms[escape('paths')]=list( '/store' );
        cms[escape('dpm_enablecmsclient')]= 'true';
        cms[escape('sec_protocol')]= list('/usr/lib64 gsi -crl:3 -key:/etc/grid-security/dpmmgr/dpmkey.pem -cert:/etc/grid-security/dpmmgr/dpmcert.pem -md:sha256:sha1 \
-ca:2 -gmapopt:10 -vomsfun:/usr/lib64/libXrdSecgsiVOMS.so','/usr/lib64 unix');
        SELF[escape('cms')]=cms;

        cmslocal = nlist();
        cmslocal[escape('name')]='cmslocal';
        cmslocal[escape('fed_host')]='xrootd-cms.infn.it';
        cmslocal[escape('xrootd_port')]= 1294;
        cmslocal[escape('cmsd_port')]=null;
        cmslocal[escape('local_port')]=11011;
        cmslocal[escape('namelib_prefix')]="/dpm/in2p3.fr/home/cms";
        cmslocal[escape('namelib')]="libXrdCmsTfc.so file:/etc/xrootd/storage.xml?protocol=cms";
        cmslocal[escape('paths')]=list( '/store' );
        cmslocal[escape('dpm_enablecmsclient')]= 'true';
        cmslocal[escape('sec_protocol')]= list('/usr/lib64 gsi -crl:3 -key:/etc/grid-security/dpmmgr/dpmkey.pem -cert:/etc/grid-security/dpmmgr/dpmcert.pem -md:sha256:\
sha1 -ca:2 -gmapopt:10 -vomsfun:/usr/lib64/libXrdSecgsiVOMS.so','/usr/lib64 unix');
        SELF[escape('cmslocal')]=cmslocal;

        SELF;
};

et le monitoring

variable XROOTD_REPORTING_OPTIONS='xrootd.t2.ucsd.edu:9931 every 60s all sync';
variable XROOTD_MONITORING_OPTIONS='all auth flush 30s mbuff 1472 window 5s dest files io info redir user cms-aaa-eu-collector.cern.ch:9330';

Atlas

Note: est-ce que Atlas AAA est encore d'actualité?

pour Atlas il faut definir les répertoires base.
Attention, il faut changer la répertoire racine en mettant le bon domain name.

# A bit of work to get the rucio and name lib prefixes
variable ATLAS_XROOTD_NAMELIB_PREFIX ?= '/dpm/in2p3.fr/home/atlas';
variable ATLAS_XROOTD_N2N_DIRECTORIES ?= list(
    'atlasdatadisk',
    'atlasgroupdisk/perf-egamma',
    'atlaslocalgroupdisk',
    'atlasscratchdisk',
);
variable ATLAS_XROOTD_RUCIO_PREFIX ?= {
    this = '';
    foreach(k; v; ATLAS_XROOTD_N2N_DIRECTORIES) {
        if (this == '') {
            this = this + ATLAS_XROOTD_NAMELIB_PREFIX + '/' + v + '/rucio/';
        } else {
            this = this + ',' + ATLAS_XROOTD_NAMELIB_PREFIX + '/' + v + '/rucio/';
        };
    };
    this;
};

definir les parametres de la federation

variable XROOTD_FEDERATION_PARAMS ?= dict();

variable XROOTD_FEDERATION_PARAMS  = {
    atlas = dict();
    atlas['name'] = 'fedredir_atlas';
    atlas['fed_host'] = 'atlas-xrd-fr.cern.ch';
    atlas['xrootd_port'] = 1094;
    atlas['cmsd_port'] = 1098;
    atlas['local_port'] = 11000;
    atlas['namelib_prefix'] = ATLAS_XROOTD_NAMELIB_PREFIX;
    atlas['namelib'] = 'XrdOucName2NameLFC.so pssorigin=localhost sitename=' + XROOTD_SITE_NAME + ' rucioprefix=' + ATLAS_XROOTD_RUCIO_PREFIX;
    atlas['paths'] = list('/atlas');
    atlas['dpm_enablecmsclient'] = 'true';
    atlas['sec_protocol'] = list(
            '/usr/lib64 gsi -crl:3 -key:/etc/grid-security/dpmmgr/dpmkey.pem -cert:/etc/grid-security/dpmmgr/dpmcert.pem -md:sha256:sha1 -ca:2 -gmapopt:10 -vomsfun:/usr/lib64/libXrdSecgsiVOMS.so',
            '/usr/lib64 unix',
    );

    SELF[escape('atlas')] = atlas;
    SELF;
};

et le monitioring

# XrootD reporting
variable XROOTD_REPORTING_OPTIONS = 'uct2-int.mwt2.org:9931 every 60s all -buff -poll sync';

# XrootD monitoring
variable XROOTD_MONITORING_OPTIONS = 'all auth flush 30s window 5s fstat 60 lfn ops xfr 5 dest redir fstat info user uct2-int.mwt2.org:9930 dest redir fstat info user atlas-fax-eu-collector.cern.ch:9330';

Autres paramètres

on peut aussi ajouter des paramètres additionnels pour configurer les modules puppet.
Par exemple en pas quelque paramètre non standard configuré a l'LPNHE

prefix '/software/components/puppet/hieradata';

# enabling core dump in /var/tmp
'{dmlite::dav::config::coredump_dir}' = "/var/tmp";

# proxy for fetchcrl
'{fetchcrl::http_proxy}' = "http://" + SQUID_HOST + ":" + PROXY_PORT;

# limiting max number of gftp connections
'{gridftp::params::connections_max}' = 512;

# changing request clean timeout (3m is the default)
'{lcgdm::dpm::config::reqcleantimeout}' = "1m";

Utiliser SPMA pour gérer les modules puppet

la composant ncm-puppet utilise la commande "puppet module" pour installer et mettre a jour les modules sur puppetforge. Mais il y a aussi a possibilité de creer des paquets rpm avec les modules et utiliser ncm-spma pour les installer.
Il faut désactiver la gestion des modules via ncm-puppet et importer le rpm avec le modules

# Let ncm-spma handle the modules
'/software/components/puppet/modules' = null;

# Installing the lcgdm-dpm puppet modules rpm
'/software/packages/{dpm-puppet-modules}' ?= dict();

Il faut aussi générer des paquets les mettre en ligne dans une repository yum.
La procédure utilisée à l'LPNHE est:
1. yum update
2. effacer le répertoire des modules puppet
3. puppet module install lcgdm-dpm
4. créer un fichier tar avec le répertoire des module puppet
5. créer un RPM en utilisant le tar file et le .spec file

Name: dpm-puppet-modules
Version: 0.5.9
Release: 1
Source: puppet_lcgdm-dpm-v0.5.9.tar.xz
License: Apache License v2.0
Prefix: /etc/puppetlabs/code/environments/production/modules
Group: puppet/modules
AutoReqProv: no
BuildRoot: %{_tmppath}/%{name}-root
BuildArch: noarch
Summary: DPM puppet module + dependencies
URL: https://forge.puppet.com/lcgdm/dpm
# Requires: 
# Obsoletes: 

%prep

%setup -n modules

%description
DPM puppet module + dependencies

%build

%install
rm -rf $RPM_BUILD_ROOT

mkdir -p $RPM_BUILD_ROOT/etc/puppetlabs/code/environments/production/modules

rsync -aPv ./ $RPM_BUILD_ROOT/etc/puppetlabs/code/environments/production/modules/

%clean
rm -rf $RPM_BUILD_ROOT

%files
%defattr(-,root,root)
/etc/puppetlabs/code/environments/production/modules/

6. copier le RPM dans une répertoire locale

Au LLR des scripts génèrent les rpm directement sur le serveur qui héberge les miroirs des répertoires yum.
Vous pouvez trouver les scripts ici mais cette solution n'est pas en production au LLR donc les scripts ne sont pas censés marcher out of the box.