Projet

Général

Profil

Master of Puppet

Misc links

Organisation manifest tetaneutral.net

root@puppet:/etc/puppet/manifests# tree
.
├── authorized_key_generator.py             # script qui génére le contenu de manifests/files/ssh_keys et manifests/classes/sshkeys_groups.pp
├── classes                                 # bout de configuration commune à plusieurs machines
│   ├── sshkeys_groups.pp                   # NE PAS EDITER: listes des groups de clés ssh 
│   ├── sshkeys.pp                          # NE PAS EDITER: listes des groups de clés ssh 
│   ├── ttnn_apache_mod_pagespeed.pp        # config du module apache pagespeed
│   ├── ttnn_apache_mod_php.pp              # config de php avec apache+wsgi+phpfpm
│   ├── ttnn_cache_ns.pp                    # config de nos caches DNS
│   ├── ttnn_mail_master.pp                 # config de notre mx principal smtp+imap
│   ├── ttnn_mail_relay.pp                  # config de nos mx secondaires smpt seulement
│   ├── ttnn_primary_ns.pp                  # config de notre DNS principal
│   ├── ttnn_secondary_ns.pp                # config de nos DNS secondaires
│   └── ttnnssl.pp                          # class qui install des certificats ssl de tetaneutral
│
├── common.pp                               # config commun à toutes les machines
│
├── files                                   # fichiers/templates qui sont copier sur les machines
│   ├── bashrc
│   ├── h2.tetaneutral.net
│   │   ├── ipv6-ra-log.sh
│   │   └── ramond.conf
│   ├── h7.tetaneutral.net
│   │   └── dnsmasq-ttnnstgo.conf
│   ├── mx1.tetaneutral.net                 # Ici, sont nos boites aux lettres, aliases, régles d'exception pour bypass l'antispam.
│   │   ├── aliases
│   │   ├── mail
│   │   ├── recipient_access
│   │   └── sender_access
│   ├── pupper-tester.tetaneutral.net
│   │   ├── aliases
│   │   ├── mail
│   │   ├── recipient_access
│   │   └── sender_access
│   ├── puppet-auth.conf.erb
│   ├── puppet.conf.erb
│   └── ssh_keys                            # NE PAS EDITER: c'est clé sont extraite de redmine par le script "authorized_key_generator.py" 
│       ├── ssh-routeur
│       │   ├── redmine_fab.pub
│       │   ├── redmine_guerby.pub
│       │   ├── redmine_matthieu.pub
│       │   └── redmine_sileht.pub
│       └── ssh-serveur
│           ├── redmine_guerby.pub
│           └── redmine_sileht.pub
│
├── nodes                                   # Les configurations de chaques machines
│   ├── chiliproject.tetaneutral.net.pp
│   ├── dns1.tetaneutral.net.pp
│   ├── gandi1.tetaneutral.net.pp
│   ├── ganeti.tetaneutral.net.pp           # contient h1 h4 h5 h6
│   ├── gw.tetaneutral.net.pp
│   ├── h2.tetaneutral.net.pp
│   ├── h3.tetaneutral.net.pp
│   ├── h7.tetaneutral.net.pp
│   ├── lists.tetaneutral.net.pp
│   ├── mx1.tetaneutral.net.pp
│   ├── n7.tetaneutral.net.pp
│   ├── nagios.tetaneutral.net.pp
│   ├── openvpn.tetaneutral.net.pp
│   ├── pano.tetaneutral.net.pp
│   ├── puppet-test.pp
│   ├── puppet.tetaneutral.net.pp
│   ├── ssd1.tetaneutral.net.pp
│   ├── tetaneutral.grenode.net.pp
│   ├── ttnn.vps.arn-fai.net.pp
│   └── www.tetaneutral.net.pp
│
├── password.pp                              # mot de passe et cert ssl de ttnn (n'est pas versionné dans git)
└── site.pp                                  # fichier bootstrap de puppet

Installation d'un server de mail (roundcube+dovecot+spamassasin+spf+postgrey+postfix en virtual domain) comme celui de ttnn avec puppet

Sur votre puppet-master (qui peux être votre machine ou le server lui-meme)

apt-get install puppet puppetmaster
cd /etc/puppet/modules/
git clone http://git.tetaneutral.net/puppet-mailserver.git mailserver

mkdir /etc/puppet/{templates,ssl}
touch /etc/puppet/templates/<hostname>-{mail,aliases,sender_access,recipient_access}

Créé le fichier /etc/puppet/manifest/site.pp

node "<HOSTNAME>" {
        class {'ttnn_mail_master': domains => [ "mydomain.tld", "myotherdomains.tld" ], }
}

node "<HOSTNAME_RELAY>" {
        class {'ttnn_mail_relay': domains => [ "mydomain.tld", "myotherdomains.tld" ], }
}

class ttnn_mail_master ($domains = []) {

        class { 'mysql::server':
                config_hash => {
                        root_password => "dummy_password"],
                },
        }

        class { 'apache':}
        class { 'mailserver::params':
                domains     => $domains,
                passwd_content    => template("$fqdn-mail"),
                aliases_content   => template("$fqdn-aliases"),
                sender_access_content   => template("$fqdn-sender_access"),
                recipient_access_content   => template("$fqdn-recipient_access"),
                ssl_cert_source   => "puppet:///ssl/$fqdn.pem",
                ssl_key_source   => "puppet:///ssl/$fqdn.key",
        }
        class { 'mailserver::spamassassin': }
        class { 'mailserver::rbl': }
        class { 'mailserver::greylisting': }
        class { 'mailserver::dovecot':}
        #       class { 'mailserver::spf': }
        class { 'mailserver::roundcube': session_key => '<A_RANDOM_STRING>' }
        class { 'mailserver::postfix': }

}

class ttnn_mail_relay(
        $domains = [],
){
        class { 'mailserver::params':
                domains => $domains,
        }
        class { 'mailserver::spamassassin': }
        class { 'mailserver::rbl': }
        class { 'mailserver::greylisting': }
        #class { 'mailserver::spf': }
        class { 'mailserver::relay': }
        class { 'mailserver::postfix': }
}

Editer le fichier /etc/puppet/templates/<HOSTNAME>-mail et ajouter des comptes mails:

toto@mydomain.tld:{PLAIN}clear_password
toto@myotherdomain.tld:{SHA1}crypted_password

Ajouter les certificats et clé ssl (TODO: expliquer comment faire ces fichiers):

cp mon_certificat.pem(ou.crt) /etc/puppet/ssl/<HOSTNAME>.pem
cp mon_certificat.key /etc/puppet/ssl/<HOSTNAME>.key

Ensuite sur le server de mail (<HOSTNAME>):

taper:

# puppet agent-vt
...

note: si il y a des erreurs, relancer une fois avec de chercher le problème.

Idem sur le relay

Vos serveurs de mail sont prêt

Pour ajouter un alias a /etc/aliases-dovecot il faut editer /etc/puppet/templates/mx1.tetaneutral.net/aliases sur puppet.ttnn

Exemple duplication www avec puppet et les backups:

Installation d'une vm (ici: puppet-tester) avec ganeti:

sur h1:

./gnt-addvm puppet-tester

Sur puppet-tester, restauration du dernier backup de /var/www de www.tetaneutral.net qui se trouve sur h2 (Je passe l'installation de clé pgp):

cat www.tetaneutral.net-var-www.20120102.master.tar.gz | gpg -d | tar -xzf - -C /
cat www.tetaneutral.net-var-www.20120103.tar.gz | gpg -d | tar -xzf - -C /
cat www.tetaneutral.net-var-www.20120104.tar.gz | gpg -d | tar -xzf - -C /

Puis installation de puppet:

$ apt-get install puppet

$ cat /etc/puppet/puppet.conf ajouter:
[main]
logdir=/var/log/puppet
vardir=/var/lib/puppet
ssldir=/var/lib/puppet/ssl
rundir=/var/run/puppet
factpath=$vardir/lib/facter
templatedir=$confdir/templates
pluginsync = true

[agent]
server=puppet.tetaneutral.net

$ puppet agent --test

Sur puppet.teteneutral.net, dans le fichier nodes.pp copie du bloc de la machine www en puppet-tester
puis on sign la cle de puppet-tester

puppetca --sign puppet-tester.tetaneutral.net

sur puppet-tester, on descend la configuration via puppet:

puppet agent --test

et pour finir on restaure le backup mysql:

mysql -u root < www.tetaneutral.net-all-mysql-databases.20120103.sql

Et c'est fini !

Ajout d'une machine (obsolete):

Sur le client:

$ apt-get install puppet

dans /etc/default/puppet mettre:

START=yes

et dans /etc/puppet/puppet.conf ajouter:

pluginsync=true

[agent]
server=puppet.tetaneutral.net

Ensuite ajouter la machine dans le puppet master, MOUAHAHA:
Sur le client:

$ puppet agent --test
warning: peer certificate won't be verified in this SSL session
warning: peer certificate won't be verified in this SSL session
warning: peer certificate won't be verified in this SSL session
Exiting; no certificate found and waitforcert is disabled

Sur le serveur:

$ puppetca --list
www.tetaneutral.net

$ puppetca  --sign --all
notice: Signed certificate request for www.tetaneutral.net
notice: Removing file Puppet::SSL::CertificateRequest www.tetaneutral.net at '/var/lib/puppet/ssl/ca/requests/www.tetaneutral.net.pem'

Sur le client:

$ puppet agent --test
warning: peer certificate won't be verified in this SSL session
info: Caching certificate for www.tetaneutral.net
info: Caching certificate_revocation_list for ca
info: Caching catalog for www.tetaneutral.net
info: Applying configuration version '1325516709'
info: Creating state file /var/lib/puppet/state/state.yaml
notice: Finished catalog run in 0.01 seconds

Sur le serveur, on associe les modules au client:

$ cat manifests/nodes.pp

node basenode {
    include backup
    include motd
}

node 'www.tetaneutral.net' inherits basenode {
}

Récupération de fichier écrasé par puppet:

Voir la liste des fichiers backupés:

find /var/*/puppet/clientbucket -name paths | while read path ; do echo $(cat $path): $(basename $(dirname $path))  $(stat -c %y $path) ; done

Ensuite pour voir le fichier:
A venir ... (un truc avec puppet filebucket ...)

Ajout d'un module (ie: un truc/service/user a configurer), ici module motdpour l'exemple :

Création du module

cd /etc/puppet/modules
mkdir -p  motd/{files,lib,manifests,templates,tests}
$ cat motd/manifests/init.pp
class motd {
        file {'motd':
                ensure  => file,
                path    => '/etc/motd.tail',
                mode    => 0644,
                content => "Bienvenue sur ${::hostname}, machine de l'infrastructure ${::domain}\n\nCette machine est geree par puppet toutes modifications effectuee est suceptible d'etre perdu." 
        }
}

Ajout du module à la liste des modules disponibles

$ cat manifests/modules.pp
import "motd" 

Utilisation du module pour une node

$ cat manifests/nodes.pp
node 'www.tetaneutral.net' {
    include motd
}

Installation du serveur PuppetMaster (obsolete TODO sileht: réécrire)

Installation du paquet:

$ apt-get install puppetmaster

Voici le fichier de configuration /etc/puppet/puppet.conf qui permet de maintenir une conf de dev et de prod:

[main]
logdir=/var/log/puppet
vardir=/var/lib/puppet
ssldir=/var/lib/puppet/ssl
rundir=/var/run/puppet
factpath=$vardir/lib/facter
templatedir=$confdir/templates

pluginsync = true

[master]
certname=puppet.tetaneutral.net
manifest = $confdir/manifests/site_$environment.pp

Exemple du fichier site_dev.php

cat /etc/puppet/manifests/site_dev.pp
import "classes/*.pp" 
import "keys.pp" 
import "modules.pp" 
import "nodes_dev.pp" 

Le fichier keys.pp contient les cle ssh des membres, le répertoire classes les fonctions créé pour ttnn (en autres les clés ssh)
Le fichier modules.pp, la liste des modules à chargé.
Et enfin nodes_dev.pp la liste des machines puppetisées avec leur configuration.

Dans /etc/puppet/fileserver.conf configurer les autorisations:

[files]
  path /etc/puppet/files
  allow 91.224.149.0/24
  allow 91.224.148.0/24