\documentclass[a4paper,11pt]{report}

	\input{../includes/headers_global.tex}

	\def\sitename{Debian GNU/Linux }
	\def\shorttitre{Cfengine}
	\def\titre{Debian Lenny - Gestion centralisée avec Cfengine}
	\def\autheur{Matthieu Vogelweith}
	\def\subject{Gestion centralisée des configurations avec Debian GNU/Linux 5.0 (Lenny)}
	\def\keywords{Debian, Linux, Matthieu, Vogelweith, Serveur, Lenny, cfengine, centralisation, configurations}

	\input{../includes/headers.tex}
	
\begin{document}

\renewcommand{\bibname}{R\'ef\'erences}

\begin{titlepage}
	\maketitle
\end{titlepage}

\chapter*{Résumé}

\input{../includes/licence.tex}

\tableofcontents

\chapter{Présentation}

    \section{Les différents composants}

    - Sur le serveur, cfservd (permet de gérer les connexions entrantes et de diffuser les différents fichiers.


    - Sur le client, plusieurs possibilités :
\begin{itemize}
    \item cfagent lancé en crontab
    \item cfexecd en mode "wrapper" lancé en crontab
    \item cfexecd en mode démon
\end{itemize}
    
    \section{Scénario}

\begin{itemize}
    \item Installation et configuration du serveur.
    \item Installation et configuration des clients.
    \item Les clients vont chercher les fichiers de configuration sur le serveur en utilisant cfexecd et update.conf.
    \item Les clients éxecutent les actions décrites dans cfagent.conf localement.
\end{itemize}

\chapter{Mise en place du serveur Cfengine}

    \section{Installation}

\vspace{1em}
\begin{lstlisting} 
# aptitude install cfengine2
\end{lstlisting}
\vspace{1em}

    \section{Configuration de cfservd}

- Dans /etc/cfengine/cfservd.conf

\vspace{1em}
\begin{lstlisting}
control:

    # Domaine ID
    domain = ( example.com )

    # Allow root user
    AllowUsers = ( root )

    # Elapsed time before starting again an action
    IfElapsed = ( 5 )
    ExpireAfter = ( 15 )

    # Max connections allowed to this cfservd
    MaxConnections = ( 50 )

    # Allow multiple connections from one client
    MultipleConnections = ( true )

    # Trust keys from local network
    TrustKeysFrom = ( 192.168.101.0/24 )

admit:
   /etc/cfengine         192.168.101.0/24
   /usr/sbin/cfagent     192.168.101.0/24

\end{lstlisting}
\vspace{1em}

- Dans /etc/cfengine/cfagent.conf

\vspace{1em}
\begin{lstlisting}
control:
    actionsequence  = ( processes editfiles )
    domain          = ( example.com )
    access          = ( root )

    # Where cfexecd sends reports
    smtpserver      = ( 127.0.0.1 )
    sysadm          = ( root )

    # Run twice an hour 
    schedule   = ( Min00_05 Min30_35 )

    # Variables
    cf_server       = ( cfengine.example.com )
    cf_dir          = ( /etc/cfengine )

processes:
    # Make sure these processes are always running
    "cfengine2" restart "/etc/init.d/cfengine2 restart"

editfiles:

    linux::
        # Make sure cfexecd runs at boot time and daily.
        {
            /etc/cron.d/cfengine
            AutoCreate
            Backup "false"
            EmptyEntireFilePlease
            InsertLine '# /etc/cron.d/cfengine: crontab entries for cfengine'
            InsertLine ''
            InsertLine '@reboot         root    [ -x /usr/sbin/cfexecd ] && /usr/sbin/cfexecd -F -1 || exit 1'
            InsertLine '0 2 * * *       root    [ -x /usr/sbin/cfexecd ] && /usr/sbin/cfexecd -F -1 || exit 1'
    }
\end{lstlisting}
\vspace{1em}
    
    \section{Démarrage automatique}

Pour que les différents démons démarrent automatiquement au boot de la machine, il suffit de modifier les variables suivantes dans le fichier /etc/default/cfengine2 :

\vspace{1em}
\begin{lstlisting}
RUN_CFSERVD=1
RUN_CFEXECD=1
RUN_CFENVD=1
\end{lstlisting}
\vspace{1em}

Il est en suite possible de démarrer tous les démons avec la commande suivante :

\vspace{1em}
\begin{lstlisting}
# /etc/init.d/cfengine2 restart
\end{lstlisting}
\vspace{1em}

\chapter{Mise en place des clients Cfengine}

    \section{Installation}

L'installation des clients se fait exactement comme sur le serveur, en installant le paquet \textbf{cfengine}. La seule différence se situera au niveau des démons démarrés au boot de la machine.

\vspace{1em}
\begin{lstlisting}
# aptitude install cfengine2
\end{lstlisting}
\vspace{1em}
	
    \section{Configuration des mises à jour}

Le fichier /etc/cfengine/update.conf est utilisé par cfagent ou cfexecd pour se connecter au serveur cfservd et mettre à jour les différents fichiers de configuration. Ce fichier est le seul qu'il est indispensable de diffuser manuellement sur les différents clients cfengine.

\vspace{1em}
\begin{lstlisting}
control:

    actionsequence  = ( copy tidy )  # Keep this simple and constant
    domain          = ( example.com )  # Needed for remote copy

    policyhost      = ( cfengine.example.com )

    master_cfinput  = ( /etc/cfengine )
    workdir         = ( /etc/cfengine )

    SplayTime   = ( 0 )

copy:

     $(master_cfinput)      dest=$(workdir)
                            r=inf
                            mode=700
                            type=binary
                            include=cfagent.conf
                            include=update.conf
                            include=cf.*
                            purge=true
                            server=$(policyhost)

# Cfexecd stores output in this directory.
# Make sure we don't build up files and choke on our own words!
tidy:
     $(workdir)/outputs pattern=* age=7
\end{lstlisting}
\vspace{1em}

La configuration décrite ci-dessus permet donc de peupler le répertoire /etc/cfengine des clients à partir du répertoire /etc/cfengine du serveur. Notons que la copie est récursive (r=inf), que les fichiers non présents sur le serveurs sont supprimés (purge=true) et que seuls les fichiers suivants sont copiés :

\begin{itemize}
    \item cfagent.conf : le fichier de configuration de base de l'agent.
    \item update.conf : de cette façon il sera possible de modifier ce fichier sur le serveur pour modifier le comportement des mises à jour sur les clients.
    \item cf.* : tous les fichiers de configurations permettant de spécifier les actions à éxecuter sur les clients.
\end{itemize}

    \section{Copie de la clé publique}

\vspace{1em}
\begin{lstlisting}
# scp root@cfengine:/var/lib/cfengine2/ppkeys/localhost.pub /var/lib/cfengine2/ppkeys/root@xx.xx.xx.xx.pub
\end{lstlisting}
\vspace{1em}
    
    \section{Démarrage automatique}

Pour que le démon cfexecd démarre automatiquement au boot de la machine, il suffit de modifier la variable suivante dans le fichier /etc/default/cfengine2 :

\vspace{1em}
\begin{lstlisting}
RUN_CFEXECD=1
RUN_CFENVD=1
\end{lstlisting}
\vspace{1em}

Il est en suite possible de démarrer le démon avec la commande suivante :

\vspace{1em}
\begin{lstlisting}
# /etc/init.d/cfengine2 restart
\end{lstlisting}
\vspace{1em}

Lors du premier démarrage, cfexecd va établir la connexion avec le serveur, envoyer sa clé publique et copier tous les fichiers de configuration (notamment cfagent.conf). Il sera sensuite exécuté périodiquement en suivant la politique définie par la variable \textbf{schedule} du fichier cfagent.conf. Dans la configuration décrite précedemment, l'agent sera éxecuté toute les 30 minutes.

\chapter{Quelques scripts d'actions}
    
    \section{Organisation}

Afin de conserver un installation facilement maintenable il est très important d'organisaer les différents fichiers de configuration de manière réfléchie. Un bon point de départ est sans doute d'utiliser un fichier de configuration distinxt pour chaque action. Tous ces fichiers doivent ensuite être "importés" dans le fichier principal cfagent.conf.

Ce chapitre présente 2 fichiers de configuration permettant de changer le mot de passe root et de maintenir le fichier \textbf{sources.list} sur les clients. Ces deux fichiers seront nommés respectivement cf.rootpasswd et cf.sources.list. Pour qu'ils soient analysés lors de la prochaine éxecution de l'agent, il suffit de les importer en ajouter les lignes suivantes à la fin du fichier /etc/cfengine/cfagent.conf :

\vspace{1em}
\begin{lstlisting}
import:
    linux::
        cf.rootpassword
        cf.sources.lists
\end{lstlisting}
\vspace{1em}

Ainsi, toutes les machines qui sont dans la classe \textbf{linux} exécuteront les actions définies dans ces deux fichiers.

    \section{Maintenance du mot de passe root}

- Dans /etc/cfengine/cf.rootpassword

\vspace{1em}
\begin{lstlisting}
\end{lstlisting}
\vspace{1em}

    \section{Maintenance du fichier sources.list}

- Dans /etc/cfengine/cf.sources.list

\vspace{1em}
\begin{lstlisting}
control:
    actionsequence  = ( editfiles )

editfiles:

    debian_5::

        # Sources.list
        {
            /etc/apt/sources.list
            AutoCreate
            Backup "false"
            EmptyEntireFilePlease

            # Insert debian repos
            InsertLine '# Generated by Cfengine : Do not edit this file by hand'
            InsertLine ''
            InsertLine '# Debian 5.0 (Lenny)'
            InsertLine 'deb http://ftp.fr.debian.org/debian/ lenny main non-free contrib'
            InsertLine ''
            InsertLine '# Security Updates'
            InsertLine 'deb http://security.debian.org/ lenny/updates main contrib non-free'
            InsertLine ''
            InsertLine '# Debian Volatile'
            InsertLine 'deb http://volatile.debian.org/debian-volatile lenny/volatile main'
        }

        # Proxy Setup
        {
            /etc/apt/apt.conf.d/99proxy
            AutoCreate
            Backup "false"
            EmptyEntireFilePlease
            InsertLine '# Generated by Cfengine : Do not edit this file by hand'
            InsertLine ''
            InsertLine '# APT-Cacher proxy'
            InsertLine 'Acquire::http::Proxy "http://192.168.101.254:3142";'
        }
    
    debian_5.davical::

        {
            /etc/apt/sources.list
            AutoCreate
            InsertLine ''
            AppendIfNoSuchLine '# Davical'
            AppendIfNoSuchLine 'deb http://debian.mcmillan.net.nz/debian lenny awm'
        }

\end{lstlisting}
\vspace{1em}

\clearpage
\nocite{*}
\bibliographystyle{unsrt}
\bibliography{\jobname}

%\ifpdf
%\else
%\chapter{Vos commentaires}
%\fi
\end{document}
