====== Erispoe ====== ===== Administrateurs ===== * alarig * dotux * gizmo === Serveur: === Dell R210 II === Configuration : === * CPU : Intel X3450 @ 2.67GHz * Ram : 4*4Go DDR3 ECC * OS : HGST HTS725050A7E630 * Stockage : 2*2To Western Digital Red * Cache : Samsung SSD 850 EVO mSATA 120GB * Réseau : Broadcom Corporation NetXtreme II BCM5716 *2 (intégrées) === Hyperviseur : === Proxmox 4.2-4 Linux erispoe 4.4.8-1-pve #1 SMP Thu May 12 13:25:49 CEST 2016 x86_64 GNU/Linux === Réseau : === *VMBR0 : Lan Admin Grifon (Eth0) *VMBR1 : Lan Public (Eth1) === Stockage : === Le stockage est assuré par un Raid1 géré par zfs sur 2*2To Western Digital Red avec les deux niveaux de caches déportés (L2ARC et ZLOG) sur un SSD mSATA afin d'apporter de la rapidité au Raid1. Deux partitions sont créées sur ce SSD: * Dédiée aux logs (ZLOG) : 16G * Dédiée au cache intermédiaire (L2ARC) : 95.8G root@erispoe:~# zpool status pool: tank state: ONLINE scan: resilvered 223G in 8h36m with 0 errors on Sun Jun 5 02:13:35 2016 config: NAME STATE READ WRITE CKSUM tank ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 sdb ONLINE 0 0 0 ata-WDC_WD20EFRX-68EUZN0_WD-WCC4M5PRF7D7 ONLINE 0 0 0 logs sdd1 ONLINE 0 0 0 cache sdd2 ONLINE 0 0 0 errors: No known data errors Le cache ARC (cache en RAM) est limité à 5G: root@erispoe:~# arcstat.py time read miss miss% dmis dm% pmis pm% mmis mm% arcsz c 19:28:33 0 0 0 0 0 0 0 0 0 4.9G 5.0G === Custom : === Le prefetch au niveau ZFS a été désactivé afin de pouvoir gagner en rapidité. root@erispoe:~# cat /etc/modprobe.d/zfs.conf # Desactive le prefetch des fichiers, meilleurs iops options zfs zfs_prefetch_disable=1 ===== Déploiement de VM (old) ===== Nous avons un script pour le déploiement des VMs. Son principe de base est de prendre le template, de le cloner, d’agrandir le disque en fonction de la taille demandée et de copier le conf (réseau, hostname, etc.) sur le VM par SSH. #!/bin/sh usage() { printf "Usage of $0:\n" printf "\t-h, --help\tAffiche ce message d’aide\n" printf "\t-u, --user\tNom d’utilisateur a qui appartiendera la VM\n" printf "\t-m, --email\tAdresse mail à qui envoyer les informations \ relatives à la VM\n" printf "\t-f, --firstname\tPrénom du propriétaire\n" printf "\t-l, --lastname\tNom de famille du propriétaire\n" printf "\t-t, --template\tTemplate de VM à utiliser\n" printf "\t-s, --size\tTaille de la VM\n" printf "\t-n, --hostname\tNom de la VM\n" printf "\t-i, --id\tNuméro servant à la génération des IPs\n" } nargs=$(($#/2)) OPTS=$(getopt -o u:,m:,f,l,t:,s:,n:,i:,h \ -l user:,email:,firstname,lastname,template:,size:,hostname:,id:,help \ -- "$@") if [ $? != 0 ]; then exit 1 fi if [ $# -eq 0 ]; then usage exit 1 fi _mendarg() { echo "Argument $1" echo "Valeur $2" if ! [ "$2" ]; then echo "$1 : argument obligatoire" exit 1 fi } eval set -- "$OPTS" while :; do case "$1" in -h | --help) usage; exit 0;; -u | --user) USER="$2"; shift 2;; -m | --email) EMAIL="$2"; shift 2;; -f | --firstname) FIRSTNAME="$2"; shift 2;; -l | --lastname) LASTNAME="$2"; shift 2;; -t | --template) TMP_BASE="$2"; shift 2;; -s | --size) SIZE="$2"; shift 2;; -n | --hostname) hostname="$2"; host=1 shift 2;; -i | --id) IPid="$2"; shift 2;; --) shift; break;; esac done if ! [ $host ]; then printf "L’argument de nom d’hôte n’est pas déclaré, utilisation du nom \ d’utilisateur à la place.\n" hostname=$USER nargs=$((nargs+1)) fi #if [ $nargs -ne 8 ]; then # printf "Tous les arguments ne sont pas présents\n" # usage # exit 1 #fi # Récupération des identifiants des templates case "$TMP_BASE" in deb) TEMPLATE=900 ;; ubt-512) TEMPLATE=902 ;; ubt-1) TEMPLATE=903 ;; blank-512) TEMPLATE='blank-512' ;; blank-1) TEMPLATE='blank-1' ;; *) echo "Template inconnue"; exit 1;; esac # Génération du mot de passe echo "1 - Génération du mot de passe" PASSWORD="$(head -c 12 /dev/urandom | base64)" # Vérification de l’existence du pool echo "2 - Vérification de l’existence du pool" CHECK_POOL=`pvesh get /pools/$USER` # Création du pool réservé à l’utilisateur if [ "$CHECK_POOL" != "" ]; then echo "Le pool existe déjà" else echo "3 - Création du pool utilisateur" pvesh create /pools -poolid $USER fi # Vérification de l’existence de l’utilisateur echo "4 - Vérification de l’utilisateur local" CHECK_USER=$(grep $USER /etc/passwd | cut -d':' -f1) # Création de l’utilisateur local if [ "$CHECK_USER" != "" ]; then echo "L’utilisateur existe déjà" else echo "5 - Création de l’utilisateur local" useradd --no-create-home --password $(openssl passwd -1 $PASSWORD) $USER echo $PASSWORD fi # Vérification de l’existence de l’utilisateur GUI echo "6 - Vérification de l’utilisateur GUI" CHECK_USER_GUI=`cat /etc/pve/user.cfg | grep $USER` if [ "$CHECK_USER_GUI" != "" ]; then echo "L’utilisateur existe déjà" else # Création de l’utilisateur GUI echo "7 - Création de l’utilisateur GUI" pveum useradd $USER@pam -groups "Membres" -email $EMAIL \ -firstname $FIRSTNAME -lastname $LASTNAME pveum aclmod /pool/$USER -roles "PVEVMUser" -users $USER@pam fi # $(($(qm list | grep -v -e "Tmp.*deb" -e "Tmp.*ubt" | wc -l) + 100)) sert à # déterminer l’id de la VM echo "8 - Déploiement du template" #ID_VM="$(($(qm list | grep -vi -e "tmp-deb" -e "tmp.*ubt" | wc -l) + 100))" GET_ID="$(pvesh get /cluster/nextid > /tmp/id)" ID_VM="$(cat /tmp/id | sed 's/"//g')" echo $ID_VM qm clone $TEMPLATE $ID_VM -full -name $hostname -pool $USER -storage Raid1 rm /tmp/id # Gros bourrin powa, j’agrandis le disque puis je redimensionne la partition # directement depuis erispoe # Ne pas le faire quand la VM est bootée, sinon on ne reboote pas qm resize $ID_VM virtio0 +${SIZE}G parted /dev/zvol/tank/vm-$ID_VM-disk-1 resizepart 1 $(($SIZE+1))GB e2fsck -fp /dev/zvol/tank/vm-$ID_VM-disk-1-part1 resize2fs /dev/zvol/tank/vm-$ID_VM-disk-1-part1 e2fsck -fp /dev/zvol/tank/vm-$ID_VM-disk-1-part1 qm start $ID_VM # TODO: utiliser salt ou cloud-init MAC=$(grep net0 /etc/pve/qemu-server/$ID_VM.conf | cut -d '=' -f 2 | \ cut -d ',' -f 1) FE80=$(ipv6calc --action prefixmac2ipv6 --in prefix+mac \ --out ipv6addr fe80:: $MAC) sleep 20 # attendre que la VM démarre # ne pas enregistrer ni vérifier le fingerprint SSH_OPT="-o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" echo $hostname > /tmp/etchostname scp $SSH_OPT /tmp/etchostname root@[$FE80%vmbr1]:/etc/hostname echo "127.0.0.1 localhost 89.234.186.$IPid $hostname 2a00:5884:$((8200+$IPid))::1 $hostname # The following lines are desirable for IPv6 capable hosts ::1 localhost ip6-localhost ip6-loopback ff02::1 ip6-allnodes ff02::2 ip6-allrouters" > /tmp/etchosts scp $SSH_OPT /tmp/etchosts root@[$FE80%vmbr1]:/etc/hosts echo "# This file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5). source /etc/network/interfaces.d/* # The loopback network interface auto lo iface lo inet loopback # The primary network interface allow-hotplug eth0 iface eth0 inet static address 89.234.186.$IPid netmask 255.255.255.255 network 89.234.186.0 broadcast 89.234.186.255 #Route statique vers la passerelle up ip route add default via 89.234.186.1 dev eth0 onlink dns-nameservers 89.234.186.1 dns-search grifon.fr iface eth0 inet6 static address 2a00:5884:$((8200+$IPid))::1 netmask 48 gateway fe80::215:17ff:fe39:f01b" > /tmp/eni scp $SSH_OPT /tmp/eni root@[$FE80%vmbr1]:/etc/network/interfaces # détermination du fingerprint file=$(mktemp) ssh-keyscan $FE80%vmbr1 >$file 2>/dev/null SSH_FP="$(ssh-keygen -l -f $file)" rm $file ssh $SSH_OPT root@$FE80%vmbr1 'rm ~/.bash_history' ssh $SSH_OPT root@$FE80%vmbr1 'echo "" > /root/.ssh/authorized_keys ; reboot' #qm shutdown $ID_VM #qm start $ID_VM echo "Déploiement terminé." echo "9 - Envoi du mail d’info" SUBJECT=$(perl -wse "use utf8; use Encode qw(encode); print encode(\"MIME-Q\",\ \"Votre machine virtuelle $hostname vient d’être créée\");") echo "From: Adminsys grifon To: $EMAIL Cc: adminsys@grifon.fr Content-Type: text/plain; charset=UTF-8 Subject: $SUBJECT Bonjour, Votre machine virtuelle vient d’être créée. L’adresse d’accès est : https://hv-access.grifon.fr Il vous faudra demander un certificat client à adminsys@grifon.fr¹ Votre identifiant: $USER Votre mot de passe: $PASSWORD Vous pouvez vous connecter en SSH avec le mot de passe « degermatagrifon » via ssh root@89.234.186.$IPid ssh root@2a00:5884:$((8200+$IPid))::1 Nous vous recommendons très vivement de changer ce mot de passe ainsi que d’interdire la connexion par SSH en tant que root sans mot de passe. Voir pouvez donc vous connecter, démarrer votre machine virtuelle et la configurer comme vous le souhaitez. Le fingerprint SSH de votre VM est : $SSH_FP Si vous souhaitez avoir un reverse DNS, vous pouvez contacter adminsys@grifon.fr en précisant si vous souhaitez une délagation ou en donnant le FQDN. 1 https://grifon.fr/adminsys/cacert-client.html Cordialement, -- Les adminsys de grifon" | /usr/sbin/sendmail -f adminsys@grifon.fr -t echo "Script terminé" printf "Route à ajouter sur nominoe : \ ipv6_route_$hostname=\"2a00:5884:$((8200+$IPid))::/48 "$FE80"%%em1\"\n" exit 0