mercredi 18 mai 2016

experience as a DomainServer ( cluster_config master mastering )

Les idées en vrac avant de se lancer

  • experience contient les manifest puppet pour l'install en local de ansible, et la mise en place du playbook de bootstap (attention, parti de zéro, il faut que le ansible soit lancé avec un script expect).
  • Le tout doit être hébergé sur cluster_config.
  • utiliser nvogel/puppet_ansible et surcharger pour configurer automatiquement le hiera de ce module.
Show time

On commence par quelques simples essais pour vérifier les paramètres de la ligne de commande.
J'arrive à lancer ce que je veux avec les commandes suivantes

root@experience:~# cat ./cluster_inventory
192.168.1.6
root@experience:~# cat ./playbook_simple.yaml
---

- hosts: 192.168.1.6
  tasks:
  - name: apt-get update
    apt: update_cache=yes
  - name: apt-get install -y puppet git expect
    apt: name=puppet,git,expect state=latest dpkg_options='force-confold,force-confdef'

root@experience:~# ansible-playbook -u root -i ./cluster_inventory -k ./playbook_simple.yaml
SSH password:
SUDO password[defaults to SSH password]:

PLAY [192.168.1.6] *************************************************************

TASK [setup] *******************************************************************
fatal: [192.168.1.6]: FAILED! => {"changed": false, "failed": true, "module_stderr": "", "module_stdout": "/bin/bash: /usr/bin/python: No such file or directory\r\n", "msg": "MODULE FAILURE", "parsed": false}

NO MORE HOSTS LEFT *************************************************************
        to retry, use: --limit @./playbook_simple.retry

PLAY RECAP *********************************************************************
192.168.1.6                : ok=0    changed=0    unreachable=0    failed=1

Mais voila, Hahahaaaa, Mort De Rire !!!! comme c'est d'la merde ansible !!! En fait, on a le même problème que puppet : il faut un minimum d'install, ssh ne suffit pas du tout !!!

Il faut installer python pour pouvoir faire du ansible !

Je vais donc avoir un script complètement hybrid !! Un expect qui lance du shell, puis du ansible. Le ansible perd tout sont intérêt. autant uploaded un shell et le lancer. Aller, on laisser tomber ansible. Ce produit perd d'un coup beauuuucoup de son intérêt !!

bon j'ai trouvé un set potable

root@experience:~# cat bootstrap.sh
#!/bin/bash

if test $( whoami ) = root ; then

    APT_GET_OPTIONS="-o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" -y"
    GITREPO_NAME="cluster_config"
    GITREPO_DOMAIN="bitbucket.org"
    GITREPO_USER="dbouwyn"
    ROOT_MOUNTPOINT="/opt"
    REPO_MOUNTPOINT="${ROOT_MOUNTPOINT}/${GITREPO_NAME}"
    apt-get -q update
    apt-get -q ${APT_GET_OPTIONS} dist-upgrade
    apt-get -q ${APT_GET_OPTIONS} install puppet gem git expect
    grep $GITREPO_DOMAIN /etc/ssh/ssh_known_hosts 1>/dev/null 2>&1 ||\
        ssh-keyscan -H $GITREPO_DOMAIN >> /etc/ssh/ssh_known_hosts
    git clone https://${GITREPO_USER}@${GITREPO_DOMAIN}/${GITREPO_USER}/${GITREPO_NAME}.git ${REPO_MOUNTPOINT}
    for DIR in ansible puppet ; do
        mkdir -p ${REPO_MOUNTPOINT}/${DIR} && \
            chown :0 ${REPO_MOUNTPOINT}/${DIR} &&\
            chmod g+rw ${REPO_MOUNTPOINT}/${DIR}
        mount ${REPO_MOUNTPOINT}/${DIR} /etc/${DIR} -t none -o rw,bind
    done

    chown 495 /etc/puppet &&\
        chmod u+rw /etc/puppet
    user: name=puppetadmin -m -N -r -u 495 -g root -G adm -s /bin/bash -d /etc/puppet &&\
        su - puppetadmin -c 'ssh-keygen -A -b 2048 -f .ssh/id_rsa'
    echo 'puppetadmin ALL=(ALL) NOPASSWD: ALL' >/etc/sudoers.d/puppetadmin
    cd /etc/puppet &&\
        gem install librarian-puppet
    cd /etc/puppet &&\
        librarian-puppet update && /usr/bin/puppet apply manifests/$( hostname ).pp
else
    sudo $0
fi
root@experience:~# cat bootstrap_cluster.sh
#!/bin/bash

IP=$( ping -qc 1 master 2>&1 | head -1 | sed "s#^.* master (\([^)]*\)) [0-9]*(.*#\1#" )
MASK=$(  echo ${IP} | sed "s#\.[0-9]*\$#.#" )
LOCALIP=$( facter | grep ^ipaddress | grep " ${MASK}[0-9]*$" | head -1 | tr -s ' ' ' ' | cut -f3 -d' ' )

echo "remote ip is $IP"
echo "local ip is $LOCALIP"

./expect_scp_to ./bootstrap.sh root somePass $IP /root/bootstrap.sh
./expect_ssh_cmd root somePass $IP /root/bootstrap.sh


root@experience:~# cat ./expect_scp_to
#!/usr/bin/expect --
set timeout 30

set PASSWORD [ lindex $argv 2 ]

spawn scp [ lindex $argv 0 ] [ lindex $argv 1 ]@[ lindex $argv 3 ]:[ lindex $argv 4 ]

expect { 
    "assword" {
        send "$PASSWORD\r"
        set timeout -1
        exp_continue
    } "yes/no)?" {
        send "yes\r"
        set timeout -1
        exp_continue
    } timeout {
        exit
    } eof {
        exit
    }
}
root@experience:~# cat ./expect_ssh_cmd
#!/usr/bin/expect --
set timeout 30

set PASSWORD [ lindex $argv 1 ]

spawn ssh [ lindex $argv 0 ]@[ lindex $argv 2 ] [ lindex $argv 3 ]

expect {
    "assword" {
        send "$PASSWORD\r"
        set timeout -1
        exp_continue
    } "yes/no)?" {
        send "yes\r"
        set timeout -1
        exp_continue
    } timeout {
        exit
    } eof {
        exit
    }
}

reste a puppetiser le tout dans cluster_config et a le tirer dans experience

mardi 17 mai 2016

Une machine, un projet ... un nom !

Pour faire simple

  • Comment expliquer et surtout permettre à n'importe qui de répliquer mon architecture ? La mettre a dispo sur le net.
  • Oui, mais c'est quand même ultra dépendant de plein de paramètres liés à l'organisation du parc ? Oui et non, cette machine est une gateway, donc, elle peut s’insérer dans n'importe quelle organisation, à partir du moment ou on fait un minimum de forwarding des ports. Par-contre, sur la machine elle même, oui, c'est quand même bien dépendant (promis je vais jouer avec hiera et talos).
  • Ben alors, comment on fait ? Et bien, on va fixer les choses, si vous voulez me copier (avec grand plaisir, je fais ça pour ça), ben il faudra nommer votre machine experience, voila !
  • Ok, et donc ? Donc, pour mon projet de Dark Web Gateway, le nom est trouvé : "DWG experience" ! 

Hot topic

... swarm cluster behind the dark  web gateway ... working on it !