Installation
- Puppet v4.10.1
Client
- Le client doit faire un ping du serveur puppet, au pire renseigner le fichier /etc/hosts.
Debian
- Dépôt
apt-get install ca-certificates wget https://apt.puppetlabs.com/puppetlabs-release-pc1-jessie.deb dpkg -i puppetlabs-release-pc1-jessie.deb apt-get update
- amd64 :
apt-get install puppet-agent
- Pour un conteneur lxc, vu que systemd ne fonctionne pas
wget https://raw.githubusercontent.com/jbsky/jbsky/master/proxmox/init.d/puppet-agent chmod +x puppet-agent mv puppet-agent /etc/init.d/ insserv puppet-agent
CentOS
rpm -Uvh https://yum.puppetlabs.com/puppetlabs-release-pc1-el-7.noarch.rpm yum install puppet-agent
From Source
- Pour arm, stretch…
apt-get install hiera facter wget https://downloads.puppetlabs.com/puppet/puppet-4.10.0.tar.gz tar xvf puppet-4.10.0.tar.gz cd puppet-4.10.0 ruby ./install.rb
- systemd
cat > /etc/systemd/system/puppet-agent << EOF [Unit] Description=Puppet Agent Daemon After=networking.service [Service] Type=simple ExecStart=/usr/bin/puppet agent --waitforcert=500 --config=/etc/puppetlabs/puppet/puppet.conf --debug [Install] WantedBy=multi-user.target EOF
Fichier de config
cat > /etc/puppetlabs/puppet/puppet.conf << EOF [main] certname = `hostname -A | tr "[:upper:]" "[:lower:]"` server = puppet environment = production runinterval = 1h EOF
Nettoyage
find /etc/puppetlabs/puppet/ssl -name `hostname -A` -delete puppet agent -t
- sur le serveur
puppet cert clean fqdn
Serveur
apt-get install puppetserver ruby-passenger
cat > cat /etc/puppetlabs/puppet/puppet.conf << EOF [master] vardir = /opt/puppetlabs/server/data/puppetserver logdir = /var/log/puppetlabs/puppetserver rundir = /var/run/puppetlabs/puppetserver pidfile = /var/run/puppetlabs/puppetserver/puppetserver.pid codedir = /etc/puppetlabs/code dns_alt_names = `hostname -A | tr "[:upper:]" "[:lower:]"`,`hostname | tr "[:upper:]" "[:lower:]"` factpath=\$vardir/lib/facter templatedir=\$confdir/templates pluginsync = true [main] certname = `hostname -A` server = `hostname -A` environment = production runinterval = 1h EOF
- fixer la quantité de RAM dans le fichier /etc/default/puppetserver
JAVA_ARGS="-Xms1g -Xmx1g -XX:MaxPermSize=256m"
Configuration
Inscription des clients
- À exécuter sur le serveur
/opt/puppetlabs/bin/puppet cert list /opt/puppetlabs/bin/puppet cert sign --all
Test de l’agent
- À exécuter sur le client :
/opt/puppetlabs/bin/puppet agent --test
- Lister la configuration
puppet config print facter --show-legacy
Fonctionnement Général
- Tout se passe sur le serveur. Le point de départ de lecture de pupper est le fichier :
/etc/puppetlabs/code/environments/production/manifests/site.pp
- site.pp la liste des nodes avec les classes à appliquer.
- En général, on va réutiliser les modules déjà créés, « ne pas réinventer la roue! ».
Les modules
Pour créer un module, il faut :
- un répertoire du nom du modules avec le sous répertoire manifests
- un fichier fichier init.pp dans le répertoire manifests.
À installer de base :
puppet module install puppetlabs-stdlib puppet module install puppetlabs-concat
exemple : default
- Création des dossier templates & manifests
mkdir -p /etc/puppetlabs/code/environments/production/modules/defaults/{templates,manifests}
- Le fichier suivant contient toutes les classes
cat > /etc/puppetlabs/code/environments/production/modules/defaults/manifests/init.pp << EOF class defaults { include ::defaults::motd include ::defaults::install # include ::defaults::purge include ::defaults::bashrc include ::defaults::liquidprompt include ::defaults::apt } EOF
installer/purger les paquets
class
cat >> /etc/puppetlabs/code/environments/production/modules/defaults/manifests/init.pp << EOF class defaults::install { # Check OS and request the appropriate function case \$::operatingsystem { 'Debian' : { \$packages_list = [ 'snmpd', 'nano', 'lsof', 'bash-completion', 'git', ] } } package { \$packages_list: ensure => 'installed'; } } class defaults::purge { # Check OS and request the appropriate function case \$::operatingsystem { 'Debian' : { \$packages_list = [ 'rpcbind' # Proxmox require ] } } package { \$packages_list: ensure => 'purged'; } } EOF
mettre à jour le message d’accueil
- Installation du paquet pour taguer le nom dans motd.
apt-get install figlet
template
cat > /etc/puppetlabs/code/environments/production/modules/default/templates/motd.erb << EOF <%= @ascii %> ================================================================================ The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. ================================================================================ <%= @virtual %> : <%= @fqdn %> <%= @operatingsystem %> <%= @full %> <%= @architecture %> uptime : <%= @uptime %> RAM : <%= @memoryfree.to_i %>/<%= @memorysize.to_i %> swap : <%= @swapfree_mb.to_i %>/<%= @swapsize.to_i %> EOF
class
cat >> /etc/puppetlabs/code/environments/production/modules/defaults/manifests/init.pp << EOF class defaults::motd { \$ascii = generate('/bin/sh', '-c', "/usr/bin/figlet -c -w 60 \${hostname}") file { '/etc/motd': ensure => present, content => template("defaults/motd.erb"), mode => "644", owner => root, group => root; } } EOF
installer liquidprompt
template
wget https://raw.githubusercontent.com/nojhan/liquidprompt/master/liquidprompt mv liquidprompt /etc/puppetlabs/code/environments/production/modules/default/templates/
class
cat >> /etc/puppetlabs/code/environments/production/modules/defaults/manifests/init.pp << EOF class defaults::liquidprompt { file { '/usr/local/sbin/liquidprompt': ensure => present, content => template("defaults/liquidprompt"), mode => "770", owner => root, group => root; } } EOF
mettre a jour /root/.bashrc
template
cat >> /etc/puppetlabs/code/environments/production/modules/default/templates/bashrc << EOF PATH=\$PATH:/opt/puppetlabs/bin if [ -f /etc/bashrc ]; then . /etc/bashrc elif [ -f /etc/bash.bashrc ]; then . /etc/bash.bashrc fi # The following lines are only for interactive shells \$- = *i* || return # Use Bash completion, if installed if [ -f /etc/bash_completion ]; then . /etc/bash_completion fi # Use Liquid Prompt source /usr/local/sbin/liquidprompt EOF
class
cat >> /etc/puppetlabs/code/environments/production/modules/defaults/manifests/init.pp << EOF class defaults::bashrc { file { '/root/.bashrc': ensure => present, content => template("defaults/bashrc"), mode => "644", owner => root, group => root; } } EOF
mettre à jour le fichier sources.list
class
cat >> /etc/puppetlabs/code/environments/production/modules/defaults/manifests/init.pp << EOF class defaults::apt { # Check OS and request the appropriate function case \$::operatingsystem { 'Debian' : { case \$::operatingsystemmajrelease { "7" : { \$lsbdistcodename="wheezy"} "8" : { \$lsbdistcodename="jessie"} "9" : { \$lsbdistcodename="stretch"} default:{ \$lsbdistcodename="stable"} } case \$::architecture { default: { \$arch = 'defaults/sources.list' } } file { '/etc/apt/sources.list': ensure => present, content => template(\$arch), mode => "644", owner => root, group => root; } } } } EOF
template
cat > /etc/puppetlabs/code/environments/production/modules/default/templates/motd.erb << EOF deb http://ftp.fr.debian.org/debian <%= @lsbdistcodename %> main contrib non-free deb http://ftp.fr.debian.org/debian <%= @lsbdistcodename %>-updates main contrib non-free deb http://security.debian.org <%= @lsbdistcodename %>/updates main contrib non-free deb http://ftp.fr.debian.org/debian <%= @lsbdistcodename %>-backports main contrib non-free EOF
ntp
puppet module install puppetlabs-ntp
dhcp
puppet module install theforeman-dhcp
site.pp
Toute machine n’appartenant pas à un noeud appartient à default.
- Exemple de configuration avec DHCP failover, NTP et les tweaks par default.
node default { class { '::ntp': servers => [ '${SVR_NTP_IP}' ], restrict => [ 'default ignore', '-6 default ignore', '127.0.0.1', '-6 ::1', '${SVR_NTP_IP} nomodify notrap nopeer noquery', ], } include [ '::ntp', '::defaults', ] } node '${SVR_NTP_FQDN}' { class { '::ntp': servers => [ 'ntp.midway.ovh', 'ntp.unice.fr' ], restrict => [], }; include [ '::ntp', '::defaults', ] } node '${SRV_DHCP_FQDN}' { class { 'dhcp': dnsdomain => [ 'domaine.local', '0.168.192.in-addr.arpa', ], nameservers => ['192.168.0.1'], interfaces => ['eth0'], ntpservers => ['192.168.0.10','192.168.0.11'], } dhcp::pool{ 'dhcp.domaine.local': network => '192.168.0.0', mask => '255.255.255.0', range => ['192.168.0.200 192.168.0.220'], gateway => '192.168.0.254', failover=> 'dhcp-failover', } dhcp::host { 'WIFI_PC': mac=>"00:7c:07:01:07:01",ip=>"192.168.0.100"; } class { '::dhcp::failover': peer_address => '192.168.0.21', role => 'primary', address => '192.168.0.20', port => '520', max_response_delay => '60', max_unacked_updates => '10', mclt => '300', load_split => '128', load_balance =>'3', }; include [ '::dhcp::failover', '::defaults', '::ntp', ] }