unixadmin.free.fr Handy Unix Plumbing Tips and Tricks

21mar/20Off

EFI Shell bloque le demarrage du PC


Salut :D

Un petit post #help me pour lycéen en galère bloqué devant son PC avec le message suivant.

EFI Shell version ...
Device mapping table
...
Press Esc in 1 second to skip startup.nsh

Il existe pas mal de procédure pour corriger ce problème de démarrage sur un PC quelconque, mais avec celui fournit généreusement par la région île de France les options pour s'en sortir seul sont limitées.


Ces petits portables de marque Unowhy Y13 ont été un peu sécurisés...
Appelez moi la direction !!!
- mot de passe requis pour entrer dans le BIOS
- impossible de démarrer sur une clé USB bootable "Live Linux"
- vous n'êtes pas administrateur de votre poste sous Windows, et j'en passe ...

Donc en attendant de trouver le technicien du Lycée ou en période de confinement et si tu es dans cette situation précise. voila les commandes à taper pour pouvoir démarrer ton Windows.

Pour info, le clavier sous EFI Shell est QWERTY alors que ton clavier est AZERTY.

1) Tape fs0: puis Entrée
Pour taper le signe ":" après fs0 sur un clavier QWERTY appuie sur la touche SHIFT(Majuscule) et M
2) Tape cd EFI puis Entrée
Astuce: Après la commande cd tape la touche TAB(tabulation) jusqu’à ce que le bon nom s'affiche.
3) Tape cd Boot puis Entrée
Idem TAB pour lister
4) Tape bootx64.efi puis Entrée
Idem TAB pour lister

La mauvaise nouvelle est qu'en attendant de trouver mieux tu devras faire cette opération à chaque démarrage. Sinon, moins écolo, au lieu d'arrêter Windows mets le en veille.

Portes toi bien ;)

Taggé comme: Commentaires
13déc/19Off

Comment administrer Gluster via le pod heketi-storage sous Openshift

Un bon conseil, si ton stockage Gluster est géré par Heketi, alors n'utilise jamais les commandes "gluster" via les serveurs de ton Gluster Storage. Le risque est que la base de donnée Heketi ne soit plus en phase avec la réalité.

Si comme moi tu utilises Gluster pour Openshift, connecte-toi sur ton cluster Openshift et identifie le pod heketi-storage. En principe on n'a pas a aller bricoler la dedans, mais ça peut servir.

$ oc login https://console.ocp311.exemple.com
$ oc get pod --all-namespaces | grep heketi
app-storage                         heketi-storage-1-dgzwx                                 1/1       Running                    0          2d

$ oc project app-storage

$ oc get pod
NAME                                          READY     STATUS    RESTARTS   AGE
glusterblock-storage-provisioner-dc-1-4dwnb   1/1       Running   0          2d
heketi-storage-1-dgzwx                        1/1       Running   0          2d

Connecte-toi sur le pod Heketi

$ oc rsh heketi-storage-1-dgzwx

Exporte la variable nécéssaire pour utiliser heketi-cli

sh-4.2# export HEKETI_CLI_KEY=$HEKETI_ADMIN_KEY ; export HEKETI_CLI_SERVER=http://localhost:8080 ; export HEKETI_CLI_USER=admin

Quelques commandes utiles

heketi-cli -h
 
heketi-cli topology info

heketi-cli cluster info ede5b53ee6c5d4c2b3d3096a07aa1536

heketi-cli node list

heketi-cli volume list

heketi-cli volume info 2746ccfc5a2050f0870f24437c50dca4

heketi-cli db check

heketi-cli db dump
Remplis sous: GLUSTER, OPENSHIFT Commentaires
1déc/19Off

Remplacer une host route sur AIX

Hola, qué tal ?
Un petit script pour changer une "host" route sur AIX. Easy.

#!/bin/ksh
# Name : change-netbackup-route.sh
# Description : replace host route

# Host IP to replace
OLDIP="192.168.10.7"
NEWIP="192.168.20.10"

netstat -rn > /tmp/netstat-rn.txt

OLDROUTE=$(lsattr -El inet0 | grep $OLDIP | awk '{print $2}')
if [[ -z $OLDROUTE ]]
then
echo "$OLDIP not found"
exit 0
fi
chdev -l inet0 -a delroute="$OLDROUTE"

NEWROUTE=$(echo $OLDROUTE | perl -pi -e "s/$OLDIP/$NEWIP/g")
chdev -l inet0 -a route="$NEWROUTE"
echo "New host route $NEWIP added"
Remplis sous: AIX Commentaires
10nov/19Off

Un blog sur Azure AKS en deux temps trois mouvements

Dans la zérie Fast & Dirty voila les deux commandes et demie permettant de créer un cluster kubernetes à 3 noeuds et un blog wordpress chez Azure, la différence avec K3S sur Raspberry étant le prix, car coté performance on est sensiblement égale... (petit mensonge façon avant-vente Microsoft), enfin bon, j'me comprends. :]

Intalle azure-cli et connecte-toi sur le portail.

sudo apt install azure-cli
az login -u poivrot@libertysurf.com -p ChevalBlanc

Partie Azure

az group create --name RG-KUBI --location francecentral

az aks create --resource-group RG-KUBI --name kubi-de-rouge --node-count 3 --enable-addons monitoring --generate-ssh-keys

sudo az aks install-cli

az aks get-credentials --resource-group RG-KUBI --name kubi-de-rouge

Petit check

kubectl get node
NAME                                STATUS   ROLES   AGE     VERSION
aks-agentpool-24540435-vmss000000   Ready    agent   3h44m   v1.13.12
aks-agentpool-24540435-vmss000001   Ready    agent   3h44m   v1.13.12
aks-agentpool-24540435-vmss000002   Ready    agent   3h44m   v1.13.12

Partie WordPress (by k8s)

cat <<EOF >./kustomization.yaml
secretGenerator:
- name: mysql-pass
  literals:
  - password=YOUR_PASSWORD
EOF

curl -LO https://k8s.io/examples/application/wordpress/mysql-deployment.yaml
curl -LO https://k8s.io/examples/application/wordpress/wordpress-deployment.yaml

cat <<EOF >>./kustomization.yaml
resources:
  - mysql-deployment.yaml
  - wordpress-deployment.yaml
EOF

kubectl apply -k ./

Récupère l'IP publique de wordpress et ajoute une entrée DNS pour ton blog

alias k=kubectl

k get pod
NAME                               READY   STATUS    RESTARTS   AGE
wordpress-56ccc548c9-wk44f         1/1     Running   0          3h5m
wordpress-mysql-85f5c9d5b5-l5llc   1/1     Running   0          3h5m

k get svc
NAME              TYPE           CLUSTER-IP     EXTERNAL-IP    PORT(S)        AGE
kubernetes        ClusterIP      10.0.0.1       <none>         443/TCP        3h57m
wordpress         LoadBalancer   10.0.107.125   40.1.1.160   80:30337/TCP   165m
wordpress-mysql   ClusterIP      None           <none>         3306/TCP       165m

az network dns record-set a add-record -g mc_rg-kubi_kubi-de-rouge_francecentral -z a1d641f62775422fb277.francecentral.aksapp.io  -n mylife -a 40.1.1.160

Installe ton blog via l'url http://mylife.a1d641f62775422fb277.francecentral.aksapp.io/

Pour HTTPS tu peux ajouter un ingress-controller NGINX

A+ !

Remplis sous: AZURE, KUBERNETES Commentaires
24juil/19Off

deployer un blog wordpress sur k3s (Rancher Labs) & Raspberry Pi3

Le Linux Magazine N°227 de juin 2019 nous offre un article super sympa sur k3s la mini version de kubernetes dévelopée par Rancher Labs pour l'edge computing et l'IoT. Une belle découverte, Merci David :)

Contrairement à son article qui aborde des expériences en mode savant fou, je me contenterai d'un quickstart: déployer un blog wordpress sur k3s et mon bon vieux raspberry Pi3 "one". The only one.

Télécharger et Installer Raspbian Buster Lite sur votre Raspberry Pi3
Insérer la carte flash sur votre distib préférée et copier l'image Raspbian.

$ unzip 2019-06-20-raspbian-buster-lite.img.zip
$ sudo dd if=2019-06-20-raspbian-buster-lite.img of=/dev/mmcblk0 bs=4M conv=fsync

Démarrer le Raspberry et activer SSH

pi@one:~ $ sudo raspi-config
Interfacing Options
P2 SSH
Would you like the SSH server to be enabled?  Yes

Ajouter les options kernel suivantes à la fin de la ligne du fichier /boot/cmdline.txt

cgroup_memory=1 cgroup_enable=memory

Mettre à jour la Raspbian puis redémarrer le Pi

pi@one:~ $ sudo apt update
pi@one:~ $ sudo apt upgrade
pi@one:~ $ sudo reboot

Installer k3s
Copier le lien du binaire k3s-armhf (pour Pi3) à partir du projet https://github.com/rancher/k3s/releases/

pi@one:~ $ sudo curl -L https://github.com/rancher/k3s/releases/download/v0.7.0/k3s-armhf > /usr/local/bin/k3s

Créer un service

pi@one:~ $ sudo cat >  /lib/systemd/system/k3s.service << EOF
[Unit]
Description=K3S by Rancher
Documentation=https://k3s.io
After=network.target

[Service]
ExecStartPre=-/sbin/modprobe br_netfilter
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/local/bin/k3s server
KillMode=process
Delegate=yes
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TaskMax=infinity

[Install]
WantedBy=multi-user.target
EOF

Démarrer le service k3s-server

pi@one:~ $ sudo systemctl daemon-reload
pi@one:~ $ sudo enable k3s.service
pi@one:~ $ sudo systemctl start k3s.service

Afin d'éviter de taper "ks3 kubectl" à chaque fois, créer un alias ks comme ci-dessous et reconnectez vous

pi@one:~ $ echo 'alias ks="sudo k3s kubectl"' >> .bashrc

Lister le node , c'est un master. Il existe pas mal d'info sur la toile pour créer des workers

pi@one:~ $ ks get nodes
NAME   STATUS   ROLES    AGE   VERSION
one    Ready    master   15d   v1.14.3-k3s.1

Lister les namespaces et les pods livré avec k3s, on voit que Rancher Labs à choisi Traefik comme Ingress controller un dévellopement français et ça c'est plutôt cool.

pi@one:~ $ ks get namespace
NAME              STATUS   AGE
default           Active   15d
kube-node-lease   Active   15d
kube-public       Active   15d
kube-system       Active   15d

pi@one:~ $ ks get pods -n kube-system
NAME                         READY   STATUS      RESTARTS   AGE
coredns-695688789-4jxpd      1/1     Running     9          15d
helm-install-traefik-4swmb   0/1     Completed   0          15d
svclb-traefik-9hqgl          2/2     Running     18         15d
traefik-56688c4464-tqlkv     1/1     Running     12         15d

Créer un namespace wordpress et le définir par defaut

pi@one:~ $ ks create namespace wordpress

pi@one:~ $ ks config set-context --current --namespace=wordpress
Context "default" modified.

pi@one:~ $ ks config view | grep namespace:
    namespace: wordpress

Configurer le Stockage persistent local
chez moi j'utilise un disque 2.5" USB et LVM. Créer les répertoires pour apache et mysql

pi@one:~ $ df -h /datas
Filesystem                   Size  Used Avail Use% Mounted on
/dev/mapper/datavg-lv_datas   30G  29G   29G   3% /datas

pi@one:~ $ sudo mkdir -p /datas/k3s/wordpress/apache
pi@one:~ $ sudo mkdir -p /datas/k3s/wordpress/mysql
pi@one:~ $ sudo chmod -R 777 /datas/k3s/wordpress

Configurer une storage Class Locale

pi@one:~ $ cat >  StorageClass.yaml << EOF
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
EOF
pi@one:~ $ ks create -f storageClass.yaml

Créer le volume persistent pour mysql

pi@one:~ $  cat >  mysql-persistentVolume.yaml << EOF
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-wordpress-mysql
spec:
  capacity:
    storage: 10Gi
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: local-storage
  local:
    path: /datas/k3s/wordpress/mysql
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - one
EOF
pi@one:~ $ ks create -f mysql-persistentVolume.yaml

Créer le Persistent Volume Claim pour mysql

pi@one:~ $  cat >  mysql-persistentVolumeClaim.yaml << EOF
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: pvc-wordpress-mysql
spec:
  accessModes:
  - ReadWriteOnce
  storageClassName: local-storage
  resources:
    requests:
      storage: 10Gi
EOF
pi@one:~ $ ks create -f mysql-persistentVolumeClaim.yaml

Générer le mot de passe root Mysql en base64 et inséré le dans dans le secret mysql-pass

pi@one:~ $ echo -n 'Passw0rd' | base64
UGFzc3cwcmQ=
pi@one:~ $ cat >  mysql-pass.yaml  << EOF  
apiVersion: v1
kind: Secret
metadata:
  name: mysql-pass
type: Opaque
data:
  password: UGFzc3cwcmQ=
EOF
pi@one:~ $ ks create -f mysql-pass.yaml

pi@one:~ $ ks get secret
NAME                  TYPE                                  DATA   AGE
default-token-95qqg   kubernetes.io/service-account-token   3      99m
mysql-pass            Opaque                                1      59m

Déployer Mysql

pi@one:~ $ cat >  mysql-Deployment.yaml << EOF
apiVersion: v1
kind: Service
metadata:
  name: wordpress-mysql
  labels:
    app: wordpress
spec:
  ports:
    - port: 3306
  selector:
    app: wordpress
    tier: mysql
  clusterIP: None
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: wordpress-mysql
  labels:
    app: wordpress
spec:
  selector:
    matchLabels:
      app: wordpress
      tier: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress
        tier: mysql
    spec:
      containers:
      - image: x11tete11x/arm32v7-mysql
        imagePullPolicy: Always
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-pass
              key: password
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: pv-wordpress-mysql
          mountPath: /var/lib/mysql
      volumes:
      - name: pv-wordpress-mysql
        persistentVolumeClaim:
          claimName: pvc-wordpress-mysql
EOF
pi@one:~ $ ks create -f  mysql-deployment.yaml
pi@one:~ $ ks get pod
NAME                               READY   STATUS    RESTARTS   AGE
wordpress-mysql-648857594c-dttpn   1/1     Running   0          17s
pi@one:~ $ ks get svc
NAME              TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
wordpress-mysql   ClusterIP   None         <none>        3306/TCP   38s

Créer le volume persistent pour apache

pi@one:~ $  cat >  apache-persistentVolume.yaml << EOF
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-wordpress-apache
spec:
  capacity:
    storage: 10Gi
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: local-storage
  local:
    path: /datas/k3s/wordpress/apache
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - one
EOF
pi@one:~ $ ks create -f apache-persistentVolume.yaml

Créer le Persistent Volume Claim pour apache

pi@one:~ $ cat >  apache-persistentVolume.yaml << EOF
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: pvc-wordpress-apache
spec:
  accessModes:
  - ReadWriteOnce
  storageClassName: local-storage
  resources:
    requests:
      storage: 10Gi
EOF
pi@one:~ $ ks create -f apache-persistentVolumeClaim.yaml

Déployer WordPress

pi@one:~ $ cat >  wordpress-deployment.yaml << EOF
apiVersion: v1
kind: Service
metadata:
  name: wordpress
  labels:
    app: wordpress
spec:
  ports:
    - port: 80
  selector:
    app: wordpress
    tier: frontend
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: wordpress
  labels:
    app: wordpress
spec:
  selector:
    matchLabels:
      app: wordpress
      tier: frontend
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress
        tier: frontend
    spec:
      containers:
      - image: arm32v7/wordpress
        imagePullPolicy: Always
        name: wordpress
        env:
        - name: WORDPRESS_DB_HOST
          value: wordpress-mysql
        - name: WORDPRESS_DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-pass
              key: password
        ports:
        - containerPort: 80
          name: wordpress
        volumeMounts:
        - name: pv-wordpress-apache
          mountPath: /var/www/html
      volumes:
      - name: pv-wordpress-apache
        persistentVolumeClaim:
          claimName: pvc-wordpress-apache
EOF
pi@one:~ $ ks create -f  wordpress-deployment.yaml
pi@one:~ $ ks get pods
NAME                               READY   STATUS    RESTARTS   AGE
wordpress-5d7d9db9c7-s9f6p         1/1     Running   0          50s
wordpress-mysql-648857594c-dttpn   1/1     Running   0          10m

pi@one:~ $ ks get svc
NAME              TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
wordpress         ClusterIP   10.43.204.39   <none>        80/TCP     61s
wordpress-mysql   ClusterIP   None           <none>        3306/TCP   10m

Configurer une Ingress pour wordpress. la règle host signifie que le header http devra être wordpress.local

pi@one:~ $ cat >  wordpress-ingress.yaml << EOF
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: wordpress
spec:
  rules:
  - host: wordpress.local
    http:
      paths:
      - backend:
          serviceName: wordpress
          servicePort: 80
EOF
pi@one:~ $ ks create -f ingress-wordpress.yaml

Récupérer le nodeport qu'utilise traefik ci-dessous 30667

pi@one:~ $ ks get svc  -n kube-system
NAME       TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)                      AGE
kube-dns   ClusterIP      10.43.0.10     <none>        53/UDP,53/TCP,9153/TCP       16d
traefik    LoadBalancer   10.43.70.162   192.168.1.1   80:30667/TCP,443:32682/TCP   16d

Modifier votre fichier /etc/hosts ou votre DNS afin que wordpress.local pointe vers l'IP du Raspberry (one)

samir@think:~$ grep one /etc/hosts
192.168.1.1 one wordpress.local

Connectez vous sur http://wordpress.local:30667 et lancer l'installer WordPress


Et voila une Raspbian, un Master kubernetes et un blog wordpress pour 350Mo de RAM.

Plus d'information et d'inspiration améliorer votre respiration et faites de la méditation :
Linux Magazine N°227
Kubernetes Local StorageClass
Deploying WordPress and MySQL with Persistent Volumes

Un big Up à Rancher Labs pour ce super boulot :) !!!

Remplis sous: KUBERNETES Commentaires
18juil/19Off

identifier le container docker qui blinde /var/lib/docker

L'installation d'Openshift 3.9 ne paramètre pas de limite sur le fichier de log docker. Mais on peut également avoir une application qui log à mort un peu partout (merci au dev :) ), fluentd est un peu là pour récupérer tout ce p'tit merdier en principe.

Comment identifier le container docker qui blinde le stockage docker (non persistent).

Soit vous utilisez le classique "find" pour identifier les plus gros fichiers du /var/lib/docker
ou lsof pour identifier les plus gros fichiers ouvert et les fichiers "deleted" utile si le container docker tourne encore et ne libère pas l'espace.

Ouch! Un bon gros fichier de log docker de 59Go !

[root@node3003 ~]# find /var/lib/docker -size +100M
bla ...
[root@node3003 ~]#  lsof > /tmp/lsof
[root@node3003 ~]#  grep /var/lib/docker /tmp/lsof  | sort -nk8
ruby-time  66292  66467        root  117r      REG              253,3 63751211068    9498063 /var/lib/docker/containers/95e25b3e5cd8f820f4d5c6643170af6f183b0ca5991a5a0a1250c96849f13f02/95e25b3e5cd8f820f4d5c6643170af6f183b0ca5991a5a0a1250c96849f13f02-json.log

Récupérer l'id du container 95e25b3e5cd8f820f4d5c6643170af6f183b0ca5991a5a0a1250c96849f13f02 et rechercher à quel container il appartient.

[root@node3003 ~]# for i in $(docker ps -q)
 do
 echo  $i
 docker inspect $i | grep "95e25b3e5cd8f820f4d5c6643170af6f183b0ca5991a5a0a1250c96849f13f02"
 done
e905f5479339
0bfb4903ca32
95e25b3e5cd8
        "Id": "95e25b3e5cd8f820f4d5c6643170af6f183b0ca5991a5a0a1250c96849f13f02",
        "LogPath": "/var/lib/docker/containers/95e25b3e5cd8f820f4d5c6643170af6f183b0ca5991a5a0a1250c96849f13f02/95e25b3e5cd8f820f4d5c6643170af6f183b0ca5991a5a0a1250c96849f13f02-json.log",
32b2225571e8
4b363ec2f874

Le container docker est lié au pod foo-java du namespace prod-ns-foo

[root@node3003 ~]# docker ps | grep 95e25b3e5cd8
95e25b3e5cd8        docker-release.example.com/prod-ns-foo/foo@sha256:5f4e472c378877b4ce16a14133dea4d257bbed93f351537a0c0caf22a2887307                "/bin/sh -c 'java ..."   3 weeks ago         Up 3 weeks                              k8s_foo_foo-java-5-x4j5d_a3398ca4-70ed-11e9-aae8-005056b00427_0

Solution de contournement
pour libérer temporairement l'espace pris par le fichier de log du container sans impacter les autre pod => redémarer le pod poisseux

$ oc scale dc foo-java --replicas=0  
$ oc scale dc foo-java --replicas=1

Résolution:
ajouter l'option --log-opt max-size et --log-opt max-file au fichier de conf /etc/sysconfig/docker

# cat /etc/sysconfig/docker
OPTIONS='--insecure-registry=172.30.0.0/16 --selinux-enabled --log-opt max-size=50m --log-opt max-file=5'

Le redémarrage de docker est requis et va donc rebalancer les pod sur d'autre noeud app. on migre donc proprement tous les pods du noeud app

$ oc adm drain node3003 --force --delete-local-data --ignore-daemonsets
$ oc get node

Redémarrez docker ou en profiter pour redémarrer le noeud app, histoire de mettre tout à plat (éventuelles fuites mémoires insoupçonnées ou autre bizarrerie)

[root@node3003 ~]# systemctl restart docker
ou
[root@node3003 ~]# reboot

Configurer le noeud pour être "schedulable"

$ oc adm manage-node node3003 --schedulable=true
$ oc get node
Remplis sous: OPENSHIFT Commentaires
4juil/19Off

Ajout automatique d’une passphrase SSH

Salut

Je dois effectuer des échanges de fichier via SFTP, la clé SSH doit être protégée par une passphrase. Cette passphrase ne peut pas être entrée par l'utilisateur à chaque fois qu'il se connecte. Cette procédure permet d'automatiser le lancement de l'agent-ssh et l'ajout de la passphrase. A la déconnexion de l'utilisateur, l'agent-ssh est killé.

Installer le paquet expect

# yum install expect

Générer une passphase SSH de 24 caractères

# base64 /dev/urandom | tr -d "/+" | dd bs="24" count=1 status=none | xargs echo;
fbLCWGhDlrym2y17Q6LZDhvR

Génération de la paire de clés SSH (la passphrase est réellement en clair dans le script expect /home/foo/.ssh/sftp-server_example_com.exp)

$ su – foo

$ mkdir .ssh; chmod 700 .ssh; cd .ssh

$ ssh-keygen -t rsa -b 2048 -P fbLCWGhDlrym2y17Q6LZDhvR -f id_sftp-server_example_com

$ chmod 600 id_sftp-server_example_com*

$ ls -altr id_sftp-server_example_com*
-rw------- 1 foo foo 1743 Jul  2 12:39 id_sftp-server_example_com
-rw------- 1 foo foo  397 Jul  2 12:40 id_sftp-server_example_com.pub

Envoyer la clé publique id_sftp-server_example_com.pub au partenaire sftp-server.example.com

Le fichier de configuration SSH spécifie la clé à utiliser pour se connecter sur le serveur de notre partenaire sftp-server.example.com
Fichier /home/foo/.ssh/config

Host *
User foo
IdentityFile ~/.ssh/id_rsa
StrictHostKeyChecking no

Host sftp-server.example.com
User client
IdentityFile ~/.ssh/id_sftp-server_example_com
StrictHostKeyChecking no

Script d’ajout de la passphrase à l’agent SSH.

Fichier /home/foo/.ssh/.exp (droit en 700)

#!/usr/bin/expect -f
spawn ssh-add /home/foo/.ssh/id_sftp-server_example_com
expect "Enter passphrase for /home/foo/.ssh/id_sftp-server_example_com:"
send "fbLCWGhDlrym2y17Q6LZDhvR\n";
expect "Identity added: /home/foo/.ssh/id_sftp-server_example_com (/home/foo/.ssh/id_sftp-server_example_com)"
interact

Au login SSH de l’utilisateur foo via la lecture du .bash_profile un agent SSH est démarré puis l’ajout de la passphrase se fait par le script « expect » ~/.ssh/sftp-server_example_com.exp

Ajouter les lignes ci-dessous au fichier /home/foo/.bash_profile

# =================================================
# SSH AGENT for SFTP server : sftp-server.example.com
SSHAGENT=`which ssh-agent`
SSHAGENTARGS="-s"
if [ -z "$SSH_AUTH_SOCK" -a -x "$SSHAGENT" ]; then
    eval `$SSHAGENT $SSHAGENTARGS`
    trap "kill $SSH_AGENT_PID" 0
fi

# ssh-add  Passphrase SSH Key ( sftp-server.example.com )
~/.ssh/sftp-server_example_com.exp
# =================================================

A la déconnexion de l’utilisateur foo l’agent SSH est « killé »

Ajouter les lignes ci-dessous au fichier /home/foo/.logout

# =================================================
# Kill SSH-AGENT when logout

if [ ${SSH_AGENT_PID+1} == 1 ]; then
    ssh-add -D
    ssh-agent -k > /dev/null 2>&1
    unset SSH_AGENT_PID
    unset SSH_AUTH_SOCK
fi
# =================================================

Test

[root@node321 ]# su - foo
Agent pid 19109
spawn ssh-add /home/foo/.ssh/id_sftp-server_example_com
Enter passphrase for /home/foo/.ssh/id_sftp-server_example_com:
Identity added: /home/foo/.ssh/id_sftp-server_example_com4 (/home/foo/.ssh/id_sftp-server_example_com)

[foo@node321 ~]$ sftp client@sftp-server.example.com
Connecting to sftp-server.example.com...
sftp>
Taggé comme: Commentaires
10oct/18

Crushmap CEPH 2 Datacenter

Comment modifier la Crushmap de CEPH pour 2 Datacenter :D

Objectif: Résilience des données, en cas de perte d'un Datacenter (garantie d'avoir 2 replicas par Datacenter). Le choix du nombre de réplicas par pool à été choisi à 4, afin qu'en cas de perte d'un Datacenter, la remise en état des réplicas perdus ne reposent pas sur le seul réplica restant (exemple: replica=3 ou 2), et donc qu'un dernier OSD nous claque entre entre les mains pendant la resynchronisation.

Proof of Concept:
2 Datacenters + une salle pour le Quorum des monitors.

Type DCA DCB Quorum
monitor node1001 node1002 node1003
OSD node1011 node1012
OSD node1013 node1014
Rados GW node1091 node1092
Admin node1099

Extraire la Crushmap (raw) d'origine

$ ceph osd getcrushmap -o crushmap

Décompiler la Crushmap crushmap vers le fichier crushmap.txt

$ crushtool -d crushmap -o crushmap.txt

Contenu de la Crushmap d'origine : editer crushmap.txt

# begin crush map
tunable choose_local_tries 0
tunable choose_local_fallback_tries 0
tunable choose_total_tries 50
tunable chooseleaf_descend_once 1
tunable chooseleaf_vary_r 1
tunable chooseleaf_stable 1
tunable straw_calc_version 1
tunable allowed_bucket_algs 54

# devices
device 0 osd.0 class hdd
device 1 osd.1 class hdd
device 2 osd.2 class hdd
device 3 osd.3 class hdd
device 4 osd.4 class hdd
device 5 osd.5 class hdd
device 6 osd.6 class hdd
device 7 osd.7 class hdd
device 8 osd.8 class hdd
device 9 osd.9 class hdd
device 10 osd.10 class hdd
device 11 osd.11 class hdd
device 12 osd.12 class hdd
device 13 osd.13 class hdd
device 14 osd.14 class hdd
device 15 osd.15 class hdd
device 16 osd.16 class hdd
device 17 osd.17 class hdd
device 18 osd.18 class hdd
device 19 osd.19 class hdd

# types
type 0 osd
type 1 host
type 2 chassis
type 3 rack
type 4 row
type 5 pdu
type 6 pod
type 7 room
type 8 datacenter
type 9 region
type 10 root

# buckets
host node1011 {
        id -3           # do not change unnecessarily
        id -4 class hdd         # do not change unnecessarily
        # weight 0.049
        alg straw2
        hash 0  # rjenkins1
        item osd.1 weight 0.010
        item osd.4 weight 0.010
        item osd.8 weight 0.010
        item osd.17 weight 0.010
        item osd.19 weight 0.010
}
host node1012 {
        id -5           # do not change unnecessarily
        id -6 class hdd         # do not change unnecessarily
        # weight 0.049
        alg straw2
        hash 0  # rjenkins1
        item osd.0 weight 0.010
        item osd.6 weight 0.010
        item osd.10 weight 0.010
        item osd.13 weight 0.010
        item osd.16 weight 0.010
}
host node1013 {
        id -7           # do not change unnecessarily
        id -8 class hdd         # do not change unnecessarily
        # weight 0.049
        alg straw2
        hash 0  # rjenkins1
        item osd.2 weight 0.010
        item osd.7 weight 0.010
        item osd.11 weight 0.010
        item osd.14 weight 0.010
        item osd.18 weight 0.010
}
host node1014 {
        id -9           # do not change unnecessarily
        id -10 class hdd                # do not change unnecessarily
        # weight 0.049
        alg straw2
        hash 0  # rjenkins1
        item osd.3 weight 0.010
        item osd.5 weight 0.010
        item osd.12 weight 0.010
        item osd.9 weight 0.010
        item osd.15 weight 0.010
}
root default {
        id -1           # do not change unnecessarily
        id -2 class hdd         # do not change unnecessarily
        # weight 0.196
        alg straw2
        hash 0  # rjenkins1
        item node1011 weight 0.049
        item node1012 weight 0.049
        item node1013 weight 0.049
        item node1014 weight 0.049
}

# rules
rule replicated_rule {
        id 0
        type replicated
        min_size 1
        max_size 10
        step take default
        step chooseleaf firstn 0 type host
        step emit
}

Editer le fichier Crushmap.txt pour répartir un pool CEPH à 4 replicas entre les deux Datacenters.
voir rule:
step choose firstn 2 type datacenter
step chooseleaf firstn 2 type rack
On simule également dans cette configuration que chaque noeud OSD est dans un rack dédié.

# begin crush map
tunable choose_local_tries 0
tunable choose_local_fallback_tries 0
tunable choose_total_tries 50
tunable chooseleaf_descend_once 1
tunable chooseleaf_vary_r 1
tunable chooseleaf_stable 1
tunable straw_calc_version 1
tunable allowed_bucket_algs 54

# devices
device 0 osd.0 class hdd
device 1 osd.1 class hdd
device 2 osd.2 class hdd
device 3 osd.3 class hdd
device 4 osd.4 class hdd
device 5 osd.5 class hdd
device 6 osd.6 class hdd
device 7 osd.7 class hdd
device 8 osd.8 class hdd
device 9 osd.9 class hdd
device 10 osd.10 class hdd
device 11 osd.11 class hdd
device 12 osd.12 class hdd
device 13 osd.13 class hdd
device 14 osd.14 class hdd
device 15 osd.15 class hdd
device 16 osd.16 class hdd
device 17 osd.17 class hdd
device 18 osd.18 class hdd
device 19 osd.19 class hdd

# types
type 0 osd
type 1 host
type 2 chassis
type 3 rack
type 4 row
type 5 pdu
type 6 pod
type 7 room
type 8 datacenter
type 9 region
type 10 root

# buckets
host node1011 {
        id -3           # do not change unnecessarily
        id -4 class hdd         # do not change unnecessarily
        # weight 0.049
        alg straw2
        hash 0  # rjenkins1
        item osd.1 weight 0.010
        item osd.4 weight 0.010
        item osd.8 weight 0.010
        item osd.17 weight 0.010
        item osd.19 weight 0.010
}
host node1012 {
        id -5           # do not change unnecessarily
        id -6 class hdd         # do not change unnecessarily
        # weight 0.049
        alg straw2
        hash 0  # rjenkins1
        item osd.0 weight 0.010
        item osd.6 weight 0.010
        item osd.10 weight 0.010
        item osd.13 weight 0.010
        item osd.16 weight 0.010
}
host node1013 {
        id -7           # do not change unnecessarily
        id -8 class hdd         # do not change unnecessarily
        # weight 0.049
        alg straw2
        hash 0  # rjenkins1
        item osd.2 weight 0.010
        item osd.7 weight 0.010
        item osd.11 weight 0.010
        item osd.14 weight 0.010
        item osd.18 weight 0.010
}
host node1014 {
        id -9           # do not change unnecessarily
        id -10 class hdd                # do not change unnecessarily
        # weight 0.049
        alg straw2
        hash 0  # rjenkins1
        item osd.3 weight 0.010
        item osd.5 weight 0.010
        item osd.12 weight 0.010
        item osd.9 weight 0.010
        item osd.15 weight 0.010
}
rack rackA001 {
        id -11          # do not change unnecessarily
        id -12 class hdd                # do not change unnecessarily
        # weight 4.880
        alg straw2
        hash 0  # rjenkins1
        item node1011 weight 0.050
}
rack rackA002 {
        id -13          # do not change unnecessarily
        id -14 class hdd                # do not change unnecessarily
        # weight 4.880
        alg straw2
        hash 0  # rjenkins1
        item node1013 weight 0.050
}
rack rackB001 {
        id -15          # do not change unnecessarily
        id -16 class hdd                # do not change unnecessarily
        # weight 4.880
        alg straw2
        hash 0  # rjenkins1
        item node1012 weight 0.050
}
rack rackB002 {
        id -17          # do not change unnecessarily
        id -18 class hdd                # do not change unnecessarily
        # weight 4.880
        alg straw2
        hash 0  # rjenkins1
        item node1014 weight 0.050
}
datacenter DCA {
        id -19          # do not change unnecessarily
        id -20 class hdd                # do not change unnecessarily
        # weight 9.760
        alg straw2
        hash 0  # rjenkins1
        item rackA001 weight 0.050
        item rackA002 weight 0.050
}
datacenter DCB {
        id -21          # do not change unnecessarily
        id -22 class hdd                # do not change unnecessarily
        # weight 9.760
        alg straw2
        hash 0  # rjenkins1
        item rackB001 weight 0.050
        item rackB002 weight 0.050
}
root default {
        id -1           # do not change unnecessarily
        id -2 class hdd         # do not change unnecessarily
        # weight 19.520
        alg straw2
        hash 0  # rjenkins1
        item DCA weight 0.100
        item DCB weight 0.100
}
# rules
rule replicated_rule {
        id 0
        type replicated
        min_size 2
        max_size 4
        step take default
        step choose firstn 2 type datacenter
        step chooseleaf firstn 2 type rack
        step emit
}
# end crush map

Recompiler une crushmap crushmap2DC à partir de crushmap.txt modifié

$ crushtool -c crushmap.txt -o crushmap2DC

Recharger la nouvelle crushmap crushmap2DC

$ ceph osd setcrushmap –i crushmap2DC

vérifier la configuration des OSD

$ ceph osd tree
ID  CLASS WEIGHT  TYPE NAME                   STATUS REWEIGHT PRI-AFF
 -1       0.19998 root default
-19       0.09999     datacenter DCA
-11       0.04999         rack rackA001
 -3       0.04999             host node1011
  1   hdd 0.00999                 osd.1           up  1.00000 1.00000
  4   hdd 0.00999                 osd.4           up  1.00000 1.00000
  8   hdd 0.00999                 osd.8           up  1.00000 1.00000
 17   hdd 0.00999                 osd.17          up  1.00000 1.00000
 19   hdd 0.00999                 osd.19          up  1.00000 1.00000
 -13       0.04999         rack rackA002
  -7       0.04999             host node1013
  2   hdd 0.00999                 osd.2           up  1.00000 1.00000
  7   hdd 0.00999                 osd.7           up  1.00000 1.00000
 11   hdd 0.00999                 osd.11          up  1.00000 1.00000
 14   hdd 0.00999                 osd.14          up  1.00000 1.00000
 18   hdd 0.00999                 osd.18          up  1.00000 1.00000
 -21       0.09999     datacenter DCB
 -15       0.04999         rack rackB001
  -5       0.04999             host node1012
  0   hdd 0.00999                 osd.0           up  1.00000 1.00000
  6   hdd 0.00999                 osd.6           up  1.00000 1.00000
 10   hdd 0.00999                 osd.10          up  1.00000 1.00000
 13   hdd 0.00999                 osd.13          up  1.00000 1.00000
 16   hdd 0.00999                 osd.16          up  1.00000 1.00000
 -17       0.04999         rack rackB002
  -7       0.04999             host node1014
  3   hdd 0.00999                 osd.3           up  1.00000 1.00000
  5   hdd 0.00999                 osd.5           up  1.00000 1.00000
  9   hdd 0.00999                 osd.9           up  1.00000 1.00000
 12   hdd 0.00999                 osd.12          up  1.00000 1.00000
 15   hdd 0.00999                 osd.15          up  1.00000 1.00000

Vérifier le "rebalancing" des OSD

$ ceph -w

$ ceph health detail

vérification de la bonne répartition d'un pool a 4 replicas

$ ceph osd pool create pool001 64 64
$ ceph osd pool set pool001 size 4
$ rbd create rbd001 --size 1024 --pool pool001 --image-feature layering
$ ceph osd pool application enable rbd001 rbd

Monter le RDB sur un client CEPH et y coller quelques données de test.

$ sudo rbd map rbd001 --pool pool001
/dev/rbd0

$ sudo rbd showmapped
id pool    image  snap device
0  pool001 rbd001 -    /dev/rbd0

$ sudo mkfs.ext4 /dev/rbd0
$ sudo mount /dev/rbd0 /mnt
$ sudo dd if=/dev/zero of=/mnt/zerofile bs=1M count=3

Vérifier le placement du RBD rbd001

$ ceph osd map pool001 rbd001  
osdmap e328 pool 'pool001' (14) object 'rbd001' -> pg 14.f9426629 (14.29) -> up ([17,12,18,0], p17) acting ([17,12,18,0], p17)

Le placement group utilise les OSDs 17, 12, 18 et 0 qui sont bien sur des noeuds et racks différents. vérifier avec la commande suivante:

$ ceph osd tree
Remplis sous: CEPH Aucun commentaire
7oct/18Off

Installer un cluster Red Hat CEPH Storage 3.0 Luminous

Proof of Concept CEPH Luminous

Dans ce post je vous montre comment installer Fast & Dirty un cluster Red Hat Storage 3.0 "CEPH Luminous" sur une Infra à base de Machines virtuelles (non supportée).
Pour plus d'information RTFM
Sinon la Thèse de Sage Weil qui est le fondateur et l'architecte en chef de Ceph n'est pas dépourvu d'intérêt. :) weil-thesis

Contrairement a SUSE enterprise Storage qui a fait le bon choix d'intégrer OpenAttic pour gérer le cluster Ceph via une interface web ou Rest-API, Red Hat ne propose rien pour ça dans cette version.

Configuration :
Stretch Ceph Cluster
2 Datacenters distant de 40km avec une latence de 0,5ms + une salle pour le Quorum des monitors.

Type DCA DCB Quorum
monitor node1001 node1002 node1003
OSD node1011 node1012
OSD node1013 node1014
Rados GW node1091 node1092
Admin node1099

Configuration Disque OSD:

/dev/sdb disque journal 50Go
/dev/sdc disque OSD 10Go
/dev/sdd disque OSD 10Go
/dev/sde disque OSD 10Go
/dev/sdf disque OSD 10Go
/dev/sdg disque OSD 10Go

[root@node1011 OSD ~]# lsblk -Sm
NAME HCTL       TYPE VENDOR   MODEL             REV TRAN NAME  SIZE OWNER GROUP MODE
sda  0:0:0:0    disk VMware   Virtual disk     1.0  spi  sda    50G root  disk  brw-rw----
sdb  0:0:1:0    disk VMware   Virtual disk     1.0  spi  sdb    50G root  disk  brw-rw----
sdc  0:0:2:0    disk VMware   Virtual disk     1.0  spi  sdc    10G root  disk  brw-rw----
sdd  0:0:3:0    disk VMware   Virtual disk     1.0  spi  sdd    10G root  disk  brw-rw----
sde  0:0:4:0    disk VMware   Virtual disk     1.0  spi  sde    10G root  disk  brw-rw----
sdf  0:0:5:0    disk VMware   Virtual disk     1.0  spi  sdf    10G root  disk  brw-rw----
sdg  0:0:6:0    disk VMware   Virtual disk     1.0  spi  sdg    10G root  disk  brw-rw----
sr0  2:0:0:0    rom  NECVMWar VMware IDE CDR10 1.00 ata  sr0  1024M root  cdrom brw-rw----

Système: Red HAt 7.4

Effectuer les actions suivantes à partir du serveur d’administration du cluster CEPH : node1099
Partager la clé SSH de l'utilisateur root puis cephadm via ssh-keygen et ssh-copy-id avec tous les serveurs du cluster CEPH.
Ajouter les droits sudo à l'utilisateur cephadm.

créer un utilisateur cephadm

[root@node1099 ~]# cd .ssh; ssh-keygen
[root@node1099 ~]# for i in 01 02 03  11 12 13 14 91 92 99
do
ssh-copy-id node10$i
done

[root@node1099  ~]# base64 /dev/urandom | tr -d "/+" | dd bs="16" count=1 status=none | xargs echo;
cI23TmyTVPGWs97f

[root@node1099 ~]# for i in 01 02 03  11 12 13 14 91 92 99
do
ssh node10$i 'groupadd -g 2000 cephadm; useradd -u 2000 -g cephadm cephadm; echo "cI23TmyTVPGWs97f" | passwd --stdin cephadm'
done

[root@node1099 ~]# for i in 01 02 03  11 12 13 14 91 92 99
do
ssh node10$i  'echo "cephadm ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers'
done

[root@node1099 ~]# su - cephadm
[cephadm@node1099 ~]# cd .ssh; ssh-keygen
[cephadm@node1099 ~]# for i in 01 02 03  11 12 13 14 91 92 99
do
ssh-copy-id node10$i
done

On utilise NTP: Désinstaller chrony, copier le fichier /etc/ntp.conf, redémarrer ntpd et vérifier l'heure

Copier le fichier ntp.conf de référence sur le serveur d'administration node1099 puis lancer les actions suivantes:

[root@node1099 ~]# for i in 01 02 03  11 12 13 14 91 92 99
do
scp ntp.conf node10$:/etc/ntp.conf
ssh node10$i rpm -e chrony
ssh node10$i systemctl restart ntpd
done

[root@node1099 ~]# for i in 01 02 03  11 12 13 14 91 92 99
do
echo node10$i $(ssh node10$i date)
done

node1001 Sun Oct 7 10:31:59 CET 2018
node1002 Sun Oct 7 10:31:59 CET 2018
node1003 Sun Nov 7 10:31:59 CET 2018
node1011 Sun Nov 7 10:32:00 CET 2018
node1012 Sun Oct 7 10:32:00 CET 2018
node1013 Sun Oct 7 10:32:00 CET 2018
node1014 Sun Oct 7 10:32:00 CET 2018
node1091 Sun Oct 7 10:32:00 CET 2018
node1092 Sun Oct 7 10:32:00 CET 2018
node1099 Sun Oct 7 10:32:00 CET 2018

Enregistrement SATELLITE 6

Explication serveur Satellite ... à venir.

Enregistrer les systèmes du cluster CEPH sur l'activation key qui permet d'accéder à la content view contenant les paquets Ceph recommandé par Red Hat (RTFM): AK-RHEL7-CEPH

[root@node1099 ~]# for i in 01 02 03  11 12 13 14 91 92 99
do
ssh node10$i rpm -Uvh http://satellite6/pub/katello-ca-consumer-latest.noarch.rpm
ssh node10$i subscription-manager unregister
ssh node10$i subscription-manager register --org 'BusyBox' --name node10$i.domain.com --activationkey 'AK-RHEL7-CEPH' --serverurl=https://satellite6.domain.com:443/rhsm --baseurl=https://satellite6.domain.com/pulp/repos –force
ssh node10$i yum -y install katello-agent
done

[root@node1099 ~]# for i in 01 02 03  11 12 13 14 91 92 99
do
ssh node10$i yum repolist
done

Affiche

Loaded plugins: enabled_repos_upload, package_upload, product-id, search-disabled-repos, subscription-manager
repo id                                                                                            repo name                                                                                                                           status
!rhel-7-server-extras-rpms/x86_64                                                                  Red Hat Enterprise Linux 7 Server - Extras (RPMs)                                                                                      778
!rhel-7-server-optional-rpms/x86_64                                                                Red Hat Enterprise Linux 7 Server - Optional (RPMs)                                                                                 13,444
!rhel-7-server-rhceph-1.3-calamari-rpms/x86_64                                                     Red Hat Ceph Storage Calamari 1.3 for Red Hat Enterprise Linux 7 Server (RPMs)                                                          20
!rhel-7-server-rhceph-1.3-installer-rpms/x86_64                                                    Red Hat Ceph Storage Installer 1.3 for Red Hat Enterprise Linux 7 Server (RPMs)                                                         91
!rhel-7-server-rhceph-3-mon-rpms/x86_64                                                            Red Hat Ceph Storage MON 3 for Red Hat Enterprise Linux 7 Server (RPMs)                                                                 98
!rhel-7-server-rhceph-3-osd-rpms/x86_64                                                            Red Hat Ceph Storage OSD 3 for Red Hat Enterprise Linux 7 Server (RPMs)                                                                 84
!rhel-7-server-rhceph-3-tools-rpms/x86_64                                                          Red Hat Ceph Storage Tools 3 for Red Hat Enterprise Linux 7 Server (RPMs)                                                              138
!rhel-7-server-rpms/x86_64                                                                         Red Hat Enterprise Linux 7 Server (RPMs)                                                                                            18,257
!rhel-7-server-satellite-tools-6.2-rpms/x86_64                                                     Red Hat Satellite Tools 6.2 (for RHEL 7 Server) (RPMs)                                                                                 143
!rhel-server-rhscl-7-rpms/x86_64                                                                   Red Hat Software Collections RPMs for Red Hat Enterprise Linux 7 Server                                                              9,336
repolist: 42,389
Uploading Enabled Repositories Report
Loaded plugins: product-id

Network Configuration:Activation IPV6

[root@node1099 ~]# for i in 01 02 03  11 12 13 14 91 92 99
do
ssh node10$i sysctl net.ipv6.conf.all.disable_ipv6=0; sysctl net.ipv6.conf.default.disable_ipv6=0
done

Ajouter ces deux lignes au fichier /etc/sysctl.conf

net.ipv6.conf.all.disable_ipv6=0
net.ipv6.conf.default.disable_ipv6=0

Deploiement CEPH via Ansible

Installation de du package ceph-ansible sur le serveur d'administration node1099

[root@node1099 ~]# yum install ceph-ansible

Configuration du fichier inventaire Ansible /etc/ansible/hosts

[mons]
node1001
node1002
node1003

[osds]
node1011
node1012
node1013
node1014

[mgrs]
node1001
node1002
node1003

[clients]
node1099

Configuration des fichier de variables Ansible group vars

[root@node1099 ~]#
ln -s /usr/share/ceph-ansible/group_vars/ /etc/ansible/group_vars
cd /usr/share/ceph-ansible/
cp site.yml.sample site.yml
cd /usr/share/ceph-ansible/group_vars/
cp all.yml.sample all.yml
cp osds.yml.sample osds.yml
cp clients.yml.sample clients.yml

Modifier le fichier de variable globale /usr/share/ceph-ansible/group_vars/all.yml et vérifier son contenu avec la commande suivante :

Note: réseau publique 10.1.1.0/24 (eth0) et réseau privé 10.1.2.0/24 (eth1)

[root@node10 ~]# cat /usr/share/ceph-ansible/group_vars/all.yml | grep -v "^#" | sed '/^\s*$/d'

---
dummy:
fetch_directory: ~/ceph-ansible-keys
ceph_repository_type: cdn
ceph_origin: repository
ceph_repository: rhcs
ceph_rhcs_version: 3
monitor_interface: eth0
ip_version: ipv4
public_network: 10.1.1.0/24
cluster_network: 10.1.2.0/24
ceph_conf_overrides:
mon:
mon_allow_pool_delete: true

Modifier le fichier de variable des OSD et vérifier sont contenu avec la commande suivante :

Note: /dev/sd[c-g] disques OSD et /dev/sdb disque des journaux

[root@node1099 ~]# cat /usr/share/ceph-ansible/group_vars/osds.yml | grep -v "^#" | sed '/^\s*$/d'

---
dummy:
osd_auto_discovery: false
osd_scenario: non-collocated
devices:
- /dev/sdc
- /dev/sdd
- /dev/sde
- /dev/sdf
- /dev/sdg
dedicated_devices:
- /dev/sdb
- /dev/sdb
- /dev/sdb
- /dev/sdb
- /dev/sdb

Deploiement du cluster en tant que cephadm

Temps: 15 minutes

[root@node1099 ~]# su - cephadm
[cephadm@node1099 ~]$ mkdir ~/ceph-ansible-keys
[cephadm@node1099 ~]$ cd /usr/share/ceph-ansible
[cephadm@node1099 ceph-ansible]$ ansible-playbook site.yml
[cephadm@node1099 ceph-ansible]$ cd -
[cephadm@node1099 ~]$ sudo cp ceph-ansible-keys/260aec2e-df73-4490-94db-a25672048061/etc/ceph/ceph.client.admin.keyring /etc/ceph

Vérifier l'état de santé du cluster

[cephadm@node1099 ~]$ sudo ceph health
HEALTH_OK

[cephadm@node1099 ~]$ sudo ceph -s
cluster:
id:     260aec2e-df73-4490-94db-a25672048061
health: HEALTH_OK

services:
mon: 3 daemons, quorum node1001,node1002,node1003
mgr: node1001(active), standbys: node1002, node1003
osd: 20 osds: 20 up, 20 in

data:
pools:   0 pools, 0 pgs
objects: 0 objects, 0 bytes
usage:   2155 MB used, 197 GB / 199 GB avail
pgs:

A suivre, CrushMap 2 DC ...

Remplis sous: CEPH Commentaires
14sept/18Off

readonly-access Docker container

What's up !!!

Un petit Post pour répondre à une petite question. Comment permettre un accès readonly à un utilisateur lambda sans modifier le système, les droits sur les fichiers et sans passer par une gestion des ACL.

Méthode artisanale: Lancer un container docker exécutant openSSH server sur un système Linux avec un accès en readonly sur certains de ces filesystems.

Installation de Docker CE via Satellite 6 sinon voir le site Docker
CentOS 7

yum install docker-ce -y

Red Hat 7

yum install docker -y

Créer le Filesystem pour le docker storage

lvcreate -L 512M -n lv_docker rootvg
mkfs.ext4 /dev/mapper/rootvg-lv_docker
mkdir /softwares/docker
cp /etc/fstab /etc/fstab.old && echo '/dev/mapper/rootvg-lv_docker /softwares/docker ext4 defaults,noatime 1 2' >> /etc/fstab
mount /softwares/docker

CENTOS 7 ajouter les options suivantes au fichier /usr/lib/systemd/system/docker.service
Paramètre Proxy, Docker Storage Path

[Service]

Environment="HTTP_PROXY=http://user:Passw0rd@proxy:8080" "HTTPS_PROXY=http://user:Passw0rd@proxy:8080"" "NO_PROXY=localhost,127.0.0.1"

ExecStart=/usr/bin/dockerd -g /softwares/docker

RHEL 7 Ajouter les options suivantes au fichier /usr/lib/systemd/system/docker.service
Paramètre Proxy, Docker Storage Path et Docker0 bridge IP

[Service]

Environment="HTTP_PROXY=http://user:Passw0rd@proxy:8080" "HTTPS_PROXY=http://user:Passw0rd@proxy:8080"" "NO_PROXY=localhost,127.0.0.1"

ExecStart=/usr/bin/dockerd-current \
          --graph /softwares/docker \
          --bip=192.168.1.1/28 \

Prise en compte au niveau systemd

systemctl daemon-reload
systemctl start docker
systemctl status docker
systemctl enable docker

Créer un fichier Dockerfile avec le contenu ci-dessous

FROM centos:7
ENV container docker
ENV http_proxy http://user:Passw0rd@proxy:8080
ENV https_proxy http://user:Passw0rd@proxy:8080
RUN yum -y install openssh-server openssh-clients less
RUN yum clean all
RUN sed -i 's/#PermitRootLogin yes/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN echo root:Passw0rd | chpasswd
RUN ssh-keygen -f /etc/ssh/ssh_host_rsa_key -N '' -t rsa
RUN ssh-keygen -f /etc/ssh/ssh_host_ed25519_key -N '' -t ed25519
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
RUN unset http_proxy
RUN unset https_proxy

Build du container Docker

docker build -t readonly-access .
# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
readonly-access     latest              7142868f79c8        4 minutes ago       301MB
centos              7                   5182e96772bf        5 weeks ago         200MB

Lancer le container readonly-access en spécifiant les filesystems à mapper en readonly.

# docker run -d -it -p 822:22 --restart always --name readonly-access -h docker-node007  -v /exploit/appli/app1:/exploit/appli/app1:ro -v /stor/data:/stor/data:ro -v /softwares/middleware:/softwares/middleware:ro readonly-access
[root@node007 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND               CREATED             STATUS              PORTS                 NAMES
9aefe62d342d        readonly-access     "/usr/sbin/sshd -D"   4 seconds ago       Up 3 seconds        0.0.0.0:822->22/tcp   readonly-access

Connexion au container

$ ssh root@node007 -p 822

[root@docker-node007 ~]#
Filesystem                        1K-blocks   Used Available Use% Mounted on
overlay                              499656 320604    142356  70% /
tmpfs                                   65536      0     65536   0% /dev
tmpfs                               3996492      0   3996492   0% /sys/fs/cgroup
shm                                      65536      0     65536   0% /dev/shm
/dev/mapper/rootvg-lv_docker           499656 320604    142356  70% /etc/hosts
/dev/mapper/rootvg-lv_data            2031440 471156   1449532  25% /stor/data
/dev/mapper/rootvg-lv_middleware    1015704  63156    894884   7% /softwares/middleware
/dev/mapper/rootvg-lv_app1              1015704   1376    956664   1% /exploit/appli/app1
tmpfs                               3996492      0   3996492   0% /proc/scsi
tmpfs                               3996492      0   3996492   0% /sys/firmware

[root@docker-node007 ~]# touch /stor/data/test
touch: cannot touch ‘/stor/data/test’: Read-only file system

Paramètre Docker:

-p 822:22 = Map de port 822 du système vers le port 22 du container
--restart always = Redémarre le container après un reboot de la VM
--name readonly-access = Nom du container
-h docker-node007 = hostname du container
-v /exploit/appli/app1:/exploit/appli/app1:ro = Monte le filesystems de la VM /exploit/appli/app1 dans le container en readonly
readonly-access = Nom de l'image du container

Remarque:
Mapper chaque filesystem en readonly. Si vous mapper le répertoire racine /exploit vous serez en read-write sur les sous répertoires /exploit/appli et /exploit/appli/app1

Taggé comme: Commentaires