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

Aucun commentaire: