jeudi, avril 06, 2017

OpenMediaVault sur Odroid-C2

Tout ça paraissait une bonne idée, mais ...

On dispose de 2 choix : 
  1. On utilise l'image fournie,
  2. On installe de zéro.

 Avec l'image fournie

Cette image est obsolète, et dès que l'on fait la mise ajour, patatra ...
Et c'est vraiment dur de remettre tout en place (moi, j'ai laissé tombé)

A partir de zéro

Alors je pars de mon Armbian préféré, distrib ubuntu, et ...
Le problème, c'est que les packages php5 ne sont plus dispos.
On installe des dépots alternatifs, pas complet, galère ...


Bon, Ben, on va repartir de l'image Pi3, hein ?!! ... et tout roule, même les mise a jour

Jeedom en DIY sur Odroid-C2

Bon, ben c'est pas compliqué


  1. On télécharge l'archive sur le site de jeedom.
  2. On se connecte sur l'interface web pour voir la progression, on se connecte en ssh, on fait un watch ps.
  3. On attends, on attends, on attends ...
  4. On reboot, et ... patatra, pb SQL, on fixe le mot de passe root pour mysql, on le met dans le script d'install à la place du 'cat /dev/random ...'.
  5. On relance le script, on regarde sur la page web, on attends, on attends, ...
  6. Ok !!
  7. On installe les plugins, et ...

Whaouuu !!! C'est d'la bebon !!

mercredi, juin 29, 2016

Synthèse sur les éléments du parc

Différentes configurations

Dans un premier temps, il faut distinguer les possibilités.
Le parc le plus complet se trouve chez moi.
Les services sont :
- une box domotique
- une box relai
- une passerelle d’anonymisation
- un nas + un cloud privé
- un serveur de média (+ des clients)
- un cluster docker swarm derrière la passerelle d'anomymisation

Une version allégée du parc se trouve sur un autre site, il contient :
- une passerelle d'anonymisation
- un nas + un cloud privé
- un serveur de média (+ des clients)
- un tunnel vers le swarm

Une version ultra lite, pour service seulement, correspond à un troisième parc. Il contient :
- un serveur d'anonymisation

Config matérielle

Sans rentrer dans les détails:
- passerelle d'anonymisation/serveur d'anonymisation : Raspi3
- nas+cloud : OdroidC2 ou CubieTruck
- serveur de média : Raspi2 ou Raspi3, clients : Raspi2
- cluster docker swarm : OdroidC2, Raspi1/2/3
- box domotique : Raspi2
- box relai : TCW-181CM

Plan d'adressage

- 192.168.1.1 / 192.168.1.254 : box internet
- 192.168.1.2 : passerelle d'anonymisation
- 192.168.1.3 : lxc dans passerrelle
- 192.168.1.4 : lxc dans passerrelle
- 192.168.1.30 : pms

mardi, avril 26, 2016

Installation de docker pour jeedom

Installation de docker pour jeedom

Utilisation des images de https://github.com/Cquad/jeedom

Utilisation de Ansible pour lancer puppet

Suite à l'article sur config de experience, rajout de jeedom dans /etc/ansible/hosts

Particularités de la machine jeedom

Cette machine dispo de 2 clés USB : une pour faire du ZWave et une huawei pour envoyer des SMS.

root@jeedom:/home/pi# lsusb
Bus 001 Device 005: ID 10c4:ea60 Cygnal Integrated Products, Inc. CP210x UART Bridge / myAVR mySmartUSB light
Bus 001 Device 006: ID 12d1:1446 Huawei Technologies Co., Ltd. E1552/E1800/E173 (HSPA modem)



Elle dispose aussi d'une horloge sur pile

Utiliser raspi-config pour 'enabler' le i2c, puis

root@jeedom:~# apt-get install -y i2c-tools
root@jeedom:~#  i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --               

root@jeedom:~# modprobe rtc-ds1307
root@jeedom:~# echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
root@jeedom:~# hwclock -r
Sat 01 Jan 2000 01:00:16 CET  -0.099972 seconds


éditer /etc/modules.conf et y mettre

# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.

snd-bcm2835
i2c-dev
rtc-ds1307



editer /etc/rc.local et y mettre

root@jeedom:~# cat /etc/rc.local
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
sudo hwclock -s

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi

exit 0



Dans un shell,

root@jeedom:~# update-rc.d -f fake-hwclock remove
root@jeedom:~# apt-get purge fake-hwclock



 root@jeedom:~# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
+195-154-10-106. 175.91.96.111    3 u  116  128  377   31.244   -1.890   0.542
*soliphium.rilyn 193.190.230.66   2 u   18  128  377   31.792   -1.956   1.080
-ntp1.warwicknet 195.66.241.3     2 u  102  128  377   39.599   -0.377   0.806
+spacys.de       131.188.3.222    2 u   22  128  377   45.889   -1.351   0.336


On voit que le plus haut stratum est 3, on va mettre la locale en 5.

Éditer /etc/ntp.conf, et ajouter, après les lignes 'server ...'


server 127.127.1.0
fudge  127.127.1.0 stratum 5
 
rebooter et vérifier


root@jeedom:~# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
-ns2.akl.telesma 202.46.178.18    2 u   25   64    1  307.642  -483.80   0.531
+usins.0x00.lv   194.29.130.252   2 u   24   64    1   81.394  -489.74   1.196
*2001:bc8:3e85:1 145.238.203.14   2 u   27   64    1   32.373  -489.97   0.943
+ntp-3.arkena.ne 138.96.64.10     2 u   26   64    1   37.703  -487.85   1.124
 LOCAL(0)        .LOCL.           5 l   36   64    1    0.000    0.000   0.001
root@jeedom:~# hwclock -r
Tue 26 Apr 2016 14:32:34 CEST  -0.631582 seconds


To be continued with 'Installation de Docker', 'Initialisation des images' et 'Puppetisation de tout ça' ...

PS(17/05/2016) : La mise en place du cluster swarm dans http://redondants-ppprod-parc.blogspot.com. Je me familiarise avec le tout, puis je retourne sous jeedom pour faire une install 'clean'. Pourquoi je veux d'abord comprendre la distribution (swarm), parce que le container docker pour mysql doit (ou plutôt peut) etre partagé par les différentes applis du parc. Aujourd'hui, la question se pose : sur experience (DWG), qui est déjà au taquet, sur OMV (OdroidC2 64b sur Armbian) qui est fraichement (donc non 'stabilisé') sur Docker, ... encore des questions d'organisation/répartition

mercredi, septembre 04, 2013

Avancées ...

L'install d'un machine en remote a fait un petit bout de chemin, je passe en ssh avec un ssh-copy-id.
J'ai vite vu que grace à puppet, le boot se fait en 5 commandes ...
donc pas très utile, mais bon, j'ai les commandes dans un script ...

Concernant les machine,
j'ai configuré glusterfs pour faire du NFS, mais c'est pas évident : il faut penser à mettre le "v3", installer rpcbind, et (tout frais) ne pas installer nfs-commn.
Je dois mettre ça dans puppet

mon monit qui check apt-cacher-ng se basait sur le contenu de /var/cache/...
C'est pas bon car si le rep n'est pas mounté, il recréer l'arbo, du coup monit trouve le fichier, meme si le mount est KO.

il faut
- mounter un /tidy/ en bind sur / pour faire un clean cd /var/cache/apt-cacher-ng/
- arreter apt-cacher sur /var/cache/apt-cacher n'est pas mounté
- verif rpcbind (a faire dans puppet et monit)
- installer mitmproxy, car polipo ne fait pas intercepting proxy
- penser a virer netbios de dnsmasq.conf

lundi, août 19, 2013

bind et puppet

      exec { "/usr/sbin/service bind9 stop":
           onlyif => ["/usr/sbin/service bind9 status", "/usr/bin/test -z \"$( /bin/grep \'^${bind_user}:x:${bind_id}:\' /etc/passwd )\""],
           before  => User["${bind_user}"],
           require => Package[bind9],
     }

     user { "${bind_user}":
           ensure => present,
           uid => "${bind_id}",
           gid => "${bind_user}",
           require => [ Exec["/usr/local/bin/uidmod.sh ${bind_id} ${bind_user}"], Group["${bind_user}"] ],
           before  => Service["bind9"],
     }

    file { "/var/lib/bind":
          mode    => "g+rwx",
          group   => "${bind_user}",
          require => Group["${bind_user}"],
          recurse => true,
     }

     file { "set superbit in /etc/bind":
          path    => "/etc/bind",
          mode    => "g+rws",
          group   => "${bind_user}",
          require => Group["${bind_user}"],
     }

     file { "/etc/bind":
          group   => "${bind_user}",
          require => File["set superbit in /etc/bind"],
          recurse => true,
     }

     file { "/etc/default/bind9":
          source  => "file:///etc/puppet/modules/common/files/bind9.default",
          require => File["/etc/bind", "/var/lib/bind"],
          notify  => Service["bind9"],
     }

mercredi, août 07, 2013

plantage de palette

La carte SD de palette est partie en erreur.

Ca arrive en fait super souvent.
L'utilisation de NOOBS est un vrai plus, puiqu'il est possible de réinstaller le système à partir du raspberry lui-meme.

Par-contre, même si la mise en place de puppet est volontaire et a pour objectif de réisntaller le système en quelques commandes. La mise en place puppet reste trop fastidieuse.

En effet, il faut, pour puppet, mettre en place le vpn, glusterfs, ...
Je dois donc faire un complément.
Ce complément ne peux etre qu'un script shell, je ne vois pas trop d'autres choses.

Je suis donc obligé de me lancer dans l'écriture de ce script.
Première question, comment va t'il etre distribué ? (en fonction, je peux déterminer son emplacement)

Je pense que je vais le mettre sur www.ppprod.net.
Le plus simple serait de faire un premier script qui monterait un nfs.
Dans un deuxième temps,  ce script lancerait un autre se trouvant sur le nfs.

bon, premier pb : pas de nfs sur nuxit.
2 possibilités : trouver un autre dépot ou recompiler
Autre solution, ne pas faire de nfs.

lundi, août 05, 2013

ajout dans crontab

ajout du nettoyage de var/log
et du ifplugd qui plante lié au vpn

mercredi, juillet 31, 2013

L'ordre est donc le suivant :
- montage des HD sur les rpy.
- création des points de montage
!!!!!!!!!!!!!!!!!! OUPS !!!!!!!!!!!!!! j'ai oublié, il faut faire le vpn avant !!!!!
- définition des glfs
- premier checkout svn de puppet
( - mise en place du cron de mise a jour auto [il faut d'abord que je récupère le script])
- suppression de etckeeper (*)

La définition des glfs est ok, mon problème, c'est la mise en place automatique du tuinnel.
J'étais parti sur un lancement par script.
Je vais quand meme jeter un coup d'oeil pour le configurer dans le service, ça serrait plus pratique si ça marchait dès le run

fait.

mon /var/log est plein.
je vais rajouter des trucs dans monit

cd /var/log && find . -name '*.gz' -delete
cd /var/log && ( FILE=$( ( for f in $( find . -type f ) ; do du $f ; done ) | sort -n | tail -1 | tr -s '\t ' '  ' | cut -f2 -d' ' ) ; test -f "$FILE" && echo >$FILE )

pas encore fait

mardi, juillet 30, 2013

site.pp d'origine

node default {

     $boxap_ssid = "AndroidAP4481"
     $boxap_psk = "1234567890"
     $wlan0_ip = $ipaddress_wlan0

     case $macaddress_eth0 {
     "b8:27:eb:ae:12:1d": {
        $hostn = "palette"
        $domainn = "ppprod.biz"
        $other_domainn = "ppprod2.biz"
        $arpa_domainn = "192.168.2"
        $other_arpa_domainn = "192.168.3"
        $invers_arpa_domainn = "2.168.192"
        $other_invers_arpa_domainn = "3.168.192"
        $eth0_ip = "192.168.2.1"
        $tor_nickname = "6cfdb97abb21"
        $site = "stm"
        $vpn_ip = "10.4.0.2"
        $vpn_other = "10.4.0.1"
        $vpn_other_host_fqdn = "experience.vpn"
        $vpn_other_host = "experience"
        }
     "b8:27:eb:ac:9f:fc": {
        $hostn = "experience"
        $domainn = "ppprod2.biz"
        $other_domainn = "ppprod.biz"
        $arpa_domainn = "192.168.3"
        $other_arpa_domainn = "192.168.2"
        $invers_arpa_domainn = "3.168.192"
        $other_invers_arpa_domainn = "2.168.192"
        $eth0_ip = "192.168.3.1"
        $tor_nickname = "6cfdb97abb9a"
        $site = "tln"
        $vpn_ip = "10.4.0.1"
        $vpn_other = "10.4.0.2"
        $vpn_other_host_fqdn = "palette.vpn"
        $vpn_other_host = "palette"
        }
     }

     service { "reboot":
          ensure     => running,
          hasrestart => false,
          start      => "/bin/true",
          hasstatus  => false,
          status     => "/bin/true",
          require    => Service["monit"],
     }
     exec { "hostname ${hostn}":
          command => "/bin/hostname ${hostn}",
     }

     file { "/etc/hostname":
          content => $hostn,
          require => Exec["hostname ${hostn}"],
     }

     host { localhost:
          ensure => present,
          ip => "127.0.0.1",
          host_aliases => $hostn,
          require => File["/etc/hostname"],
     }

     host { "${vpn_other_host_fqdn}":
          ensure => present,
          ip => "${vpn_other}",
          host_aliases => "${vpn_other_host}",
          require => File["/etc/hostname"],
     }

     cron { "puppet apply":
          command => "mount | grep ':puppet_rpi on /etc/puppet type fuse.glusterfs (rw,' 1>/dev/null || mount /etc/puppet ; cd /etc/puppet && find . -name '*~' -delete ; /usr/bin/puppet apply /etc/puppet/manifests/site.pp",
          user    => root,
          hour    => '1-23/2',
          minute  => 0,
          require => Mount["/etc/puppet"],
     }

     cron { "apt-get update":
          command => "/usr/bin/apt-get update",
          user    => root,
          hour    => '12',
          minute  => 0,
          weekday => 1,
     }

     cron { "apt-get full update":
          command => "apt-get update && apt-get -y upgrade && apt-get -y autoremove && apt-get -y dist-upgrade && rpi-update && reboot",
          user    => root,
          hour    => 0,
          minute  => 0,
          monthday => 1,
     }
     exec { "openvpn between rpi":
          command => "/bin/bash -c 'test -f /var/run/vpn.rpi.pid -a -n \"$( ps -e | grep openvpn | grep $( cat /var/run/vpn.rpi.pid ) )\" || /data/glusterfs/.local/scripts/vpn.rpi start'",
     }


     package { [glusterfs-server,glusterfs-client,monit]:
          ensure => latest,
     }

     service { "glusterfs-server":
          ensure  => running,
          enable  => true,
          require => [ Package[glusterfs-server,glusterfs-client], Exec["openvpn between rpi"] ],
          before  => Service["monit"],
     }

     mount { "/etc/puppet":
          atboot  => false,
          device  => "${vpn_ip}:puppet_rpi",
          ensure  => mounted,
          fstype  => glusterfs,
          require => Service["glusterfs-server"],
          before  => Service["monit"],
     }

     mount { "/usr/local/bin":
          atboot  => false,
          ensure  => mounted,
          device  => "/etc/puppet/scripts",
          fstype  => "none",
          options => "bind",
          require => Mount["/etc/puppet"],
          before  => Service["monit"],
     }

     file { "/etc/puppet/scripts/vpn.rpi.${site}.monit":
          content => template("scripts/vpn.rpi.monit.erb"),
          require => Mount["/etc/puppet"]
     }

     file { "/etc/monit/conf.d/vpn.rpi.monit":
          ensure  => "/data/glusterfs/.local/scripts/vpn.rpi.${site}.monit",
          require => [ Package[monit], File["/etc/puppet/scripts/vpn.rpi.${site}.monit"] ],
          notify  => Service["monit"],
     }
     file { "/etc/monit/monitrc":
          source  => "file:///etc/puppet/modules/common/files/monitrc",
          mode => 0600,
          require => [ Package[monit], File["/etc/monit/conf.d/vpn.rpi.monit"] ],
          notify  => Service["monit"],
     }

     service { "monit":
          ensure  => running,
          enable  => true,
          require => [ Package[monit], File["/etc/puppet/scripts/vpn.rpi.${site}.monit" ] ],
     }

     file { "/etc/rc.local":
          source  => "file:///etc/puppet/modules/common/files/rc.local",
          mode => 0755,
     }

     file { "/etc/network/interfaces":
          content => template("network/interfaces.erb"),
     }
     # notify => Service[reboot],

}

node common inherits default {

     exec { "ping rpi vpn":
          command => "/bin/ping -qc 1 ${vpn_ip}",
          require => Exec["openvpn between rpi"],
     }


     package { [bind9,squid3,privoxy,tor,tor-arm,dnsproxy,iptables]:
             ensure => latest,
     }

     file { "/root/iptables":
          content => template("common/iptables.erb"),
     }


     $anonymous_id = 1000
     $anonymous_user = "anonymous"

     exec { ["/usr/local/bin/gidmod.sh ${anonymous_id} ${anonymous_user}","/usr/local/bin/uidmod.sh ${anonymous_id} ${anonymous_user}"]:
          require => Mount["/usr/local/bin"],
     }
     group { "${anonymous_user}":
           ensure => present,
           gid => "${anonymous_id}",
           require => Exec["/usr/local/bin/gidmod.sh ${anonymous_id} ${anonymous_user}"],
     }

     user { "${anonymous_user}":
           ensure => present,
           uid => "${anonymous_id}",
           gid => "${anonymous_user}",
           home => "/tmp",
           require => [ Exec["/usr/local/bin/uidmod.sh ${anonymous_id} ${anonymous_user}"], Group["${anonymous_user}"] ],
           before  => Exec["do iptables"],
     }

     exec { "do iptables":
          command => "/sbin/iptables-restore
          require => File["/root/iptables"],
     }



     $bind_id = 116
     $bind_user = bind

     exec { ["/usr/local/bin/gidmod.sh ${bind_id} ${bind_user}","/usr/local/bin/uidmod.sh ${bind_id} ${bind_user}"]:
          require => [ Mount["/usr/local/bin"], Package[bind9] ],
     }

     group { "${bind_user}":
           ensure => present,
           gid => "${bind_id}",
           require => Exec["/usr/local/bin/gidmod.sh ${bind_id} ${bind_user}"],
     }

     user { "${bind_user}":
           ensure => present,
           uid => "${bind_id}",
           gid => "${bind_user}",
           require => [ Exec["/usr/local/bin/uidmod.sh ${bind_id} ${bind_user}"], Group["${bind_user}"] ],
           before  => Service["bind9"],
     }

     file { "/etc/bind/zones.rfc1918":
          content => template("common/zones.rfc1918.erb"),
          notify  => Service["bind9"],
          require => [ Package[bind9], Exec["ping rpi vpn"] ],
     }
     file { "/etc/bind/named.conf.options":
          content => template("common/named.conf.options.erb"),
          notify  => Service["bind9"],
          require => [ Package[bind9], File["/etc/bind/zones.rfc1918"] ],
     }

     file { "/etc/bind/db.${domainn}":
          content => template("common/db.domainn.erb"),
     }
     file { "/etc/bind/db.${arpa_domainn}":
          content => template("common/db.arpa_domainn.erb"),
     }
     File["/etc/bind/db.${domainn}","/etc/bind/db.${arpa_domainn}"] {
          ensure => present,
          notify  => Service["bind9"],
          require => File["/etc/bind/named.conf.options"],
     }

     file { "/etc/bind/named.conf.local":
          content => template("common/named.conf.local.erb"),
          notify  => Service["bind9"],
          require => [ Package[bind9], Exec["ping rpi vpn"],
                  File["/etc/bind/named.conf.options",
                        "/etc/bind/db.${domainn}",
                        "/etc/bind/db.${arpa_domainn}"] ],
     }

     file { "/etc/bind":
          mode    => "g+rws",
          group   => "${bind_user}",
          require => Group["${bind_user}"],
     }

     file { "/etc/default/bind9":
          source  => "file:///etc/puppet/modules/common/files/bind9.default",
          require => File["/etc/bind"],
          notify  => Service["bind9"],
     }

     service { "bind9":
          ensure  => running,
          enable  => true,
          require => File["/etc/default/bind9"],
     }

     file { "/etc/dnsproxy.conf":
          source  => "file:///etc/puppet/modules/common/files/dnsproxy.conf",
          notify  => Service["dnsproxy"],
     }
     service { "dnsproxy":
          ensure  => running,
          enable  => true,
          require => File["/etc/dnsproxy.conf"],
     }

     file { "/etc/resolv.conf":
          source  => "file:///etc/puppet/modules/common/files/resolv.conf",
          require => Service["bind9"],
     }

     $privoxy_id = 109
     $privoxy_user = privoxy

     exec { "/usr/local/bin/uidmod.sh ${privoxy_id} ${privoxy_user}":
          require => [ Mount["/usr/local/bin"], Package[privoxy] ],
     }

     user { "${privoxy_user}":
           ensure => present,
           uid => "${privoxy_id}",
           require => Exec["/usr/local/bin/uidmod.sh ${privoxy_id} ${privoxy_user}"],
           before  => [ Service["privoxy"], Exec["do iptables"] ],
     }

     file { "/var/log/privoxy":
          owner   => "${privoxy_user}",
          recurse => true,
          require => [ Package[privoxy], User["${privoxy_user}"] ],
          before  => Service["privoxy"],
          notify  => Service["privoxy"],
     }

     file { "/etc/privoxy/config":
          content => template("common/privoxy.config.erb"),
          require => [ Package[privoxy], File["/etc/resolv.conf"] ],
          notify  => Service["privoxy"],
     }

     file { "/etc/privoxy/trust":
          content => template("common/privoxy.trust.erb"),
          require => [ Package[privoxy], File["/etc/resolv.conf"] ],
          notify  => Service["privoxy"],
     }

     service { "privoxy":
          ensure  => running,
          enable  => true,
          require => [ File["/etc/privoxy/config","/etc/privoxy/trust"], Exec["do iptables"] ],
     }
     file { "/etc/monit/conf.d/privoxy":
          content => template("common/monit.privoxy.erb"),
          require => Service["privoxy"],
          notify => Service["monit"],
     }


     $squid_id = 13
     $squid_user = "proxy"

     exec { ["/usr/local/bin/gidmod.sh ${squid_id} ${squid_user}","/usr/local/bin/uidmod.sh ${squid_id} ${squid_user}"]:
          require => [ Mount["/usr/local/bin"], Package[squid3] ],
     }

     group { "${squid_user}":
           ensure => present,
           gid => "${squid_id}",
           require => Exec["/usr/local/bin/gidmod.sh ${squid_id} ${squid_user}"],
     }

     user { "${squid_user}":
           ensure => present,
           uid => "${squid_id}",
           gid => "${squid_user}",
           require => [ Exec["/usr/local/bin/uidmod.sh ${squid_id} ${squid_user}"], Group["${squid_user}"] ],
           before  => [ Service["squid3"], Exec["do iptables"] ],
     }

     mount { "/var/squid":
           device  => "LABEL=DATA-squid",
           fstype  => ext4,
           options => "defaults",
           pass    => 2,
           atboot  => true,
           ensure  => mounted,
     }
     mount { "/etc/squid3":
           device => "/var/squid/etc",
     }
     mount { "/var/log/squid3":
           device => "/var/squid/log",
     }
     mount { "/var/spool/squid3":
           device => "/var/squid/cache",
     }
     Mount["/etc/squid3","/var/log/squid3","/var/spool/squid3"] {
           fstype  => none,
           options => bind,
           require => Mount["/var/squid"],
           before  => Package[squid3],
           atboot  => true,
           ensure  => mounted,
     }

     file { "/etc/squid3/squid.conf":
          content => template("common/squid.conf.erb"),
          require => [ Package[squid3], Service["privoxy"], Mount["/etc/squid3"] ],
          notify  => Service["squid3"],
     }

     service { "squid3":
          ensure  => running,
          enable  => true,
          require => [ File["/etc/squid3/squid.conf"], Mount["/etc/squid3","/var/log/squid3","/var/spool/squid3"], User["${squid_user}"], Exec["do iptables"] ],
     }

     $tor_id = 117
     $tor_user = "debian-tor"

     exec { ["/usr/local/bin/gidmod.sh ${tor_id} ${tor_user}","/usr/local/bin/uidmod.sh ${tor_id} ${tor_user}"]:
          require => [ Mount["/usr/local/bin"], Package[tor] ],
     }

     group { "${tor_user}":
           ensure => present,
           gid => "${tor_id}",
           require => Exec["/usr/local/bin/gidmod.sh ${tor_id} ${tor_user}"],
     }

     user { "${tor_user}":
           ensure => present,
           uid => "${tor_id}",
           gid => "${tor_user}",
           require => [ Exec["/usr/local/bin/uidmod.sh ${tor_id} ${tor_user}"], Group["${tor_user}"] ],
           before  => [ Service["tor"], Exec["do iptables"] ],
     }

     file { "/etc/default/tor":
          source  => "file:///etc/puppet/modules/common/files/tor.default",
     }

     file { "/etc/tor/torrc" :
          content => template("common/torrc.erb"),
     }
     File["/etc/default/tor","/etc/tor/torrc"] {
          require => [ Package[tor], Service["squid3"] ],
          before  => Service["tor"],
          notify  => Service["tor"],
     }

     service { "tor":
          ensure  => running,
          enable  => true,
          require => [ File["/etc/default/tor", "/etc/tor/torrc"],
                       Exec["do iptables"],
                       User["${tor_user}"] ],
     }

     package { [rpcbind, nfs-common]:
          ensure => latest,
     }
     Package[nfs-common] {
          require => Package[rpcbind],
     }

     file { "/etc/exports":
          content => template("common/nfs.exports.erb"),
          before  => Service["nfs-common"],
          notify  => Service["nfs-common"],
     }

     service { "rpcbind":
          ensure  => running,
          enable  => true,
          require => Exec["do iptables"],
     }
     service { "nfs-common":
          ensure  => running,
          enable  => true,
          require => [ File["/etc/exports"],
                       Service["rpcbind"] ],
     }

     package { [apt-cacher-ng]:
             ensure => latest,
     }

     $acng_id = 112
     $acng_user = "apt-cacher-ng"

     exec { ["/usr/local/bin/gidmod.sh ${acng_id} ${acng_user}","/usr/local/bin/uidmod.sh ${acng_id} ${acng_user}"]:
          require => [ Mount["/usr/local/bin"], Package[apt-cacher-ng] ],
          before  => Service["apt-cacher-ng"],
     }
     group { "${acng_user}":
           ensure => present,
           gid => "${acng_id}",
           require => Exec["/usr/local/bin/gidmod.sh ${acng_id} ${acng_user}"],
     }

     user { "${acng_user}":
           ensure => present,
           uid => "${acng_id}",
           gid => "${acng_user}",
           require => [ Exec["/usr/local/bin/uidmod.sh ${acng_id} ${acng_user}"], Group["${acng_user}"] ],
           before  => Service["apt-cacher-ng"],
     }

     file { ["/etc/apt-cacher-ng/security.conf","/var/log/apt-cacher-ng"]:
           group => "${acng_user}",
           owner => "${acng_user}",
           recurse => true,
          require => [ Package[apt-cacher-ng], User["${acng_user}"], Group["${acng_user}"] ],
          before  => Service["apt-cacher-ng"],
          notify  => Service["apt-cacher-ng"],
     }

     file { "/etc/apt-cacher-ng/acng.conf":
          content => template("common/acng.conf.erb"),
     }

     file { "/etc/apt/apt.conf" :
          content => template("common/apt.conf.erb"),
     }

     File["/etc/apt-cacher-ng/acng.conf","/etc/apt/apt.conf"] {
          require => [ Package[apt-cacher-ng], User["${acng_user}"], Group["${acng_user}"] ],
          before  => Service["apt-cacher-ng"],
          notify  => Service["apt-cacher-ng"],
     }

     service { "apt-cacher-ng":
          ensure  => running,
          enable  => true,
          require => [ Package[apt-cacher-ng],
                  File["/etc/apt-cacher-ng/acng.conf","/etc/apt/apt.conf"],
                  Mount["/var/cache/apt-cacher-ng"] ],
     }

}
node palette inherits common {
     mount { "/var/cache/apt-cacher-ng":
           ensure => mounted,
           device => "${vpn_other_host_fqdn}:/var/apt-cacher-ng/cache",
           fstype => "nfs",
           options => "defaults",
           pass => 0,
           dump => 0,
           require => [ Exec["ping rpi vpn"], Host["${vpn_other_host_fqdn}"] ],
     }

}

node experience inherits common {
     mount { "/var/cache/apt-cacher-ng":
           ensure => mounted,
           device => "/var/apt-cacher-ng/cache",
           fstype => "none",
           options => "bind",
           pass => 0,
           dump => 0,
     }

     package { [samba4,dnsmasq]:
             ensure => latest,
     }

     file { "/etc/default/dnsmasq":
          source  => "file:///etc/puppet/modules/common/files/dnsmasq.default",
     }

     file { "/etc/dnsmasq.conf" :
          content => template("common/dnsmasq.conf.erb"),
     }

     File["/etc/default/dnsmasq","/etc/dnsmasq.conf"] {
          require => Package[dnsmasq],
          before  => Service["dnsmasq"],
          notify  => Service["dnsmasq"],
     }

     service { "dnsmasq":
          ensure  => running,
          enable  => true,
          require => [ Package[dnsmasq], File["/etc/default/dnsmasq","/etc/dnsmasq.conf"] ],
     }


}

GLFS sur rpy

DynDns a changé, il faut maintenant forcement un account. J'en ai pris un.
J'ai donc maintenant
- experience.dyndns-at-home.com
- palette.dyndns-at-home.com

1 ) experience : ip statique
2 ) palette : J'ai configuré la NEufBox pour faire du dyndns.
J'ai du configurer GANDI pour pointer sur le dns dynamique DynDns pour www.ppprod2.biz et www.ppprod.biz


Je sais que j'ai en plan le etckeeper sur
- ppprod
- experience
- palette

Je quand même sur pars sur le glfs.
En effet, je veux absolument avoir du puppet. Je ne veux pas appliquer chaque ligne sur chaque machine.

L'ordre est donc le suivant :
- montage des HD sur les rpy.
- création des points de montage
!!!!!!!!!!!!!!!!!! OUPS !!!!!!!!!!!!!! j'ai oublié, il faut faire le vpn avant !!!!!
- définition des glfs
- premier checkout svn de puppet
( - mise en place du cron de mise a jour auto [il faut d'abord que je récupère le script])
- suppression de etckeeper (*)


(*) En réfléchissant a la mise en place, je butte sur la mise en conf obligatoire du .etckeeper
Je galère tellement que je pense virer etckeeper et faire le mien
Mon idée est la meme que pour puppet :
- en cron :
1 ) ajout de ce qui ne l'est pas encore
2 ) suppression de ce qui ne l'est plus
3 ) commit auto



----------------------------------------------------------------------------------------------
vpn

apt-get install openvpn
On may:
openvpn --remote june.kg --dev tun1 --ifconfig 10.4.0.1 10.4.0.2 --verb 9
On june:
openvpn --remote may.kg --dev tun1 --ifconfig 10.4.0.2 10.4.0.1 --verb 9
----------------------------------------------------------------------------------------------

apt-get install lvm2 

   87  mkdir /data
   88  mkdir /data/local /data/remote
   90  mkdir -p /data/gluster/.local
   91  mount /dev/system/puppet.glfs.rpi /data/gluster/.local

je récupère un site.pp qui traine, je l'historise dans ce blog

http://www.gluster.org/category/ubuntu/

10.4.0.1 et .2
puppet_rpi



dimanche, juillet 07, 2013

puppet en gconf

concernant le rpy experience et palette, j'ai fait du glfs en raid1, mais sans historisation.

Il a donc la possibilité de récupérer les données, mais pas de consulter l'historique.

J'ai vu reçament sur le net des utilisateur qui ne se servait pas du master, mais qui reprennnait un checkout et qui le lançait localement.
Pour l'instant, sur exerience et palette, je fais comme ça : pas de démon.

Quand je regarde la gconf ancienne sur .net, le repo était sur .biz (palette).
Si je veux être commun a .net, experience et palette, ce n'est pas un de ces éléments qui doit être l'archiveur, ce que je pensais va donc être mis en place : backup en serveur svn.

Comme pour etc, je mettrais un svnsync sur experience et palette.

je vais mettre juste un export sur .net, avec un cron '30 */1' d'autocommit.
j'ai la chance que la patte wan sur exeprience et palette n'est pas la même : la box sur stm est en .254, celle de tln en .1, résultat, experience est en .1, et palette en .2
 je peux donc garder le glfs raid1, avec un autocommit basé sur le cron suivant : '0 /2'
je n'aurais aucun conflit.

en consultant mes archives, le chemin du svn était  http://www.ppprod.biz/svn/roottools/trunk/puppet
Je garde le nom du repo roottools

www:/etc# svn co  http://backup.ppprod.net/svn/roottools/trunk/puppet
Checked out revision 1.

rajouter run et ssl en ignore

www:/etc# cd puppet/
www:/etc/puppet# svn propedit svn:ignore .
Set new value for property 'svn:ignore' on '.'
www:/etc/puppet# svn propget svn:ignore
run
ssl

samedi, juillet 06, 2013

puppet et etckeeper

cat /etc/debian_version => 6.0.7

C'est reparti avec une squeeze !

J'installe puppet, et je reprends ma conf petit à petit.
Premier problème ... installer etckeeper, mais le plugger sur un svn distant (lequel ?)

anciennement, le svn de etc était sur experience. Est-ce judicieux ? je pense que je vais le mettre sur backup

On est donc parti pour faire un svn sur backup ;)

suivi du tuto http://www.howtoforge.com/debian_subversion_websvn

svn est déjà installlé, et etc déjà en place, oubli du ot de passe,
suivi du tuto http://notes.chpwssn.com/

commande  htpasswd -c -m /var/lib/svn/dav_svn.passwd $user_name


sur ppprod.net, install de git, subversion, git-svn

récupération du script "/usr/local/bin/etckeeper_svn_mkdir.sh", inutile : branche existante


config (on execute le contenu du puppet a la main)backup etcfetchinstall etckeeperrestore etcetckeeper commit

verif du debian_version

Bon, rien n'a marché, le fait de reprendre un svn avec contenu est une erreur. Je recrée un svn sur backup, et je recommence tout.

bon, comme d'hab, ça m'a pris 5 heures.

vous pouvez penser "quelle truffe", j'ai une petite question : pensez vous que mettre sur un svn accessible de l’extérieur votre -passwd est judicieux, pensez vous que vos .objects en gconf est judicieux ?Si vous répondez non a ces questions, vous aurez vite compris que (comme d'hab) le tutorial 'for dummies' ne correspond pas a votre besoin.

si vous voulez avoir un etckeeper sur svn distant, mailez moi ;)

Je m'attaque à puppet.
5 heures de plus : avoir un agent et un master sur la meme machine est impossible. problème de conf et conflit entre les ssl master et agent.
Le problème est que le 'puppet cert' se base sur la conf agent, sauf que la validation est faite par le master.
Encore un truc mal branlé !!!!!

Je passe par genconfig sur master avec modif du default pour la conf.
penser a commenter le genconfig


puppetmaster puppet-master[14719]: 
(/File[/var/puppet/facts]/ensure) change from directory to file failed: Could 
not set 'file on ensure: Is a directory - /var/puppet/facts

Comment out the 'factdest' setting in the [master] section of the config files
produced by the --genconfig option and it will work.

Résultat, je passe a l'agent lancé en cron. 

www:~# puppet agent --onetime --verbose --no-daemonize --ssldir /etc/puppet/ssl --server www.ppprod.net --fqdn localhost

info: Creating a new SSL key for localhost
info: Creating a new SSL certificate request for localhost
info: Certificate Request fingerprint (md5): 7E:7B:1C:93:E6:80:9C:7D:05:8E:BB:73:5C:56:8E:42

Exiting; no certificate found and waitforcert is disabled

www:/etc/puppet# puppetca --config=/etc/puppet/puppetmaster.conf -l
  "localhost" (7E:7B:1C:93:E6:80:9C:7D:05:8E:BB:73:5C:56:8E:42)
www:/etc/puppet# puppetca --config=/etc/puppet/puppetmaster.conf -s localhost
notice: Signed certificate request for localhost
notice: Removing file Puppet::SSL::CertificateRequest localhost at '/var/lib/puppet/ssl/ca/requests/localhost.pem'


www:~# puppet agent --onetime --verbose --no-daemonize --ssldir /etc/puppet/ssl --server www.ppprod.net --fqdn localhost
info: Caching certificate for localhost
info: Caching certificate_revocation_list for ca
info: Caching catalog for localhost
info: Applying configuration version '1373192799'
info: Creating state file /var/lib/puppet/state/state.yaml
notice: Finished catalog run in 0.01 seconds

pour lancer le service, penser a mettre --rundir=/etc/puppet/run dans le default.

Ca marche !

prochaine étape, puppet/manifest en gconf

reinstall de www.ppprod.net.

Je viens de lancer la reinstall de www.ppprod.net.

Je fais une install fraîche.

J'ai longtemps fait grossir un puppet qui configurait automatiquement mes serveurs.
Le problème, c'est que mon puppet est devenu tellement gros, que je me retrouve avec des dépendances cycliques dans tous les sens.

C'était devenu ingérable.

De plus, mes serveurs experience et palette était des machines "lourdes" (i.e. des serveurs avec pleins de disques et de RAM). J'ai eu des pbs de disques ET des pbs de RAM.
Je me suis donc orienté vers qqchose de plus smart : des raspberry.

J'ai en fait fait le yoyo : j'étais parti il y a 10ans sur plusieurs machines avec des services sur cette grappe. quelques années après, je e suis dit que des 'petits' services ne nécessitaient pas de machines dédiées. Je me suis tourné vers Xen. J'ai pété mes gentoo en mettant Xen, je suis allé sur Centos, jamais assez a jour pour pouvoir faire du direct-to-disc (avoir une carte contrôleur uniquement vue dans un domU), il n'y avait que la version 'pour dummy' qui fonctionnait pleinement, pour tout le reste, les noyaux n'étaient jamais assez a jour.

Je suis reparti il y a un an sur du "cluster", mais sans machine lourde : avec du rpy.

J'hésite vraiment quand à puppet. Bien entendu, je vais l'utiliser, ce soft est pour moi l'incontournable de l'administration.Je ne sais pas par-contre comment je vais le structurer de façon à être complet dans l'ordonnancement mais pas trop entremêler.
Quand au LDAP/Kerberos, je vais voir.

Dans un premier temps, il faut d'abord que je remette en place tous mes hacks sur le VDS Nerim (install de ntop sans polluer/spyer les autres [vous voulez écrouler votre VDS mais voir ce que tous les autres font : ntop est votre ami ;) ]). Il faut que je retrouve l'astuce pour insérer les modules dans un noyau Xen de façon à avoir les loop device, seul moyen d'avoir des partitions dédiées sur un VDS (par exemple si vous ne voulez pas que votre /var/log ruine votre système)

samedi, février 19, 2011

J'ai laissé tomber LDAP un moment. J'ai eu l'occasion de bosser dessus dans un autre cadre, ça ne me fait plus assez peur pour que j'en fasse une priorité.

Je bosse plutôt sur les jail, et ce que je peux faire sur mon VDS.

Ça roule à fond. aujourd’hui premier squid dans un jail (ok, trivial me direz vous). Ben pas tant que ça.
Je fais tout par puppet et monit. j'ai fait un debootstrap ubuntu 10.04 dans une debian sur le VDS. N'ayant que 4Go, je mutualise le jail, et je fais des "fake" ou les services varient.

Ça tourne bien. Je peux me re-concentrer sur les services rendu, et pas sur l'infra.

cool !

vendredi, juin 04, 2010

pas de mount d'archives

Pas de support de modules sur le VDS ...

mercredi, juin 02, 2010

pam,ladp et krb5 dans un env chrooté

Ça fait une semaine que je galère pour faire du (pam+ldap+krb5) dans un jail. Je pense avoir lu tous les articles du net sur le sujet. On peut pas vraiment dire que j'ai fais comme je le voulais, mais j'ai réussi. Maintenant, je dois essayer de continuer le planning prévu. Je pense que je vais avoir un problème de place. Il va falloir que je joue avec archivemount et autre ftpmount, voir gmailfs.

jeudi, mai 27, 2010

Avancement sur le dédié

Je vais faire un point sur ce qui reste a faire (et ce qui est fait).
De plus, je planifie la mise en place de Tor de façon différente :
plutôt que de faire [chroot 1 : squid + privoxy + tor client ] + [chroot 2 - tor relais (prio-) ]
je vais faire [chroot 1 : squid + privoxy +/] [chroot 2 - /+ tor (client,relais,sortie) +/] [chroot 3 - /+ squid + DansGuardian]
L'idée est d'autoriser la sortie, ma d'éviter les "saloperies" en mettant un contrôle parental à la sortie.

Voila donc ce qui reste à faire :
- upload du /etc et du /root de experience
- upload du www de experience, mise en conf dans cvs
- déplacement du script cvsweb dans une partie avec htaccess
- images avec proxy ntop par apache
- upload et mise en conf de /www/moinmoin de experience
- vpn, bind avec 192.168.0.1, changer le nameservice sur gandi
- mise en conf des sources qui trainent,
- créa d'une archive dédiée svn
, remplacer /svn par archivemount (sur l'archive) par autofs, exclure du tar global /var/svn
- installation d'un jail, branchement sur le ldap
http://julp.developpez.com/freebsd/authentification-ldap/
http://arthurdejong.org/cvsd/faq.html#authresponse
- mise en conf du jail dans cvs, branche pour cvsroot, export pour cvsroot
- mise en place d'un jail pour ftp , branchement sur le ldap, ajout du plug munin, ajout du scan clamav du /jail/ftp/home
- mise en place de fs zippé pour repo cvs, repo svn et pages webs et moinmoin avec archivemount (automount pour svn)
- mise en place d'un x distant, install de vnc avec proxy apache
- mise en place de chroot 1
- mise en place de chroot 2
- mise en place de chroot 3


Voila ce qui est fait :
- script de creation d'un tar dans /backup, ajout au cron
- install de cvs
- mise en conf de /etc, ajout au cron de la création d'une archive dédiée
-install de munin
- install de denyhost, install plug munin
- apache avec modwsgi
- install de cvsweb
- install de ntop et proxy par apache (partiel)
- install de moinmoin
- configuration de apache avec modwsgi
- install de clamav
- installation d'un kerberos et d'un ldap
- installation de svn, connexion sur ldap, install de websvn


Plus de gestion de projet

En allant sur la page dimitri.bouwyn.free.fr/ppprod, je me suis aperçu que ma gestion de projet avait disparu. En essayant de réactiver la page free de ppprod, ce provider me dit qu'il a tout supprimé et que les données ne sont pas récupérables.
Il va donc faloir refaire cette partie.
Je vais voir si j'ai une archive quelque part de ce site, mais je suis pessimiste.

Il semble que j'ai trouvé un truc : dotproject + ( mantis + svn )+ postnuke, le tout pluggé sur de l'autentification ldap

mardi, mai 25, 2010

sandra

Sandra a mis son site en ligne, vive la pub ! http://sandra.jorant.free.fr/