<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Tutoriel on Zwindler's Reflection</title><link>https://blog.zwindler.fr/tags/tutoriel/</link><description>Recent content in Tutoriel on Zwindler's Reflection</description><generator>Hugo -- gohugo.io</generator><language>fr-fr</language><copyright>Licensed under CC BY-SA 4.0</copyright><lastBuildDate>Tue, 24 Oct 2017 11:30:52 +0000</lastBuildDate><atom:link href="https://blog.zwindler.fr/tags/tutoriel/index.xml" rel="self" type="application/rss+xml"/><item><title>[Tutoriel] XWiki, ma premier appli Statefull sur Kubernetes</title><link>https://blog.zwindler.fr/2017/10/24/tutoriel-xwiki-ma-premier-appli-stateful-sur-kubernetes/</link><pubDate>Tue, 24 Oct 2017 11:30:52 +0000</pubDate><guid>https://blog.zwindler.fr/2017/10/24/tutoriel-xwiki-ma-premier-appli-stateful-sur-kubernetes/</guid><description>&lt;img src="https://blog.zwindler.fr/2017/10/xwiki_kubernetes.webp" alt="Featured image of post [Tutoriel] XWiki, ma premier appli Statefull sur Kubernetes" /&gt;&lt;h2 id="pourquoi-déployer-xwiki-sur-kubernetes-"&gt;Pourquoi déployer XWiki sur Kubernetes ?
&lt;/h2&gt;&lt;p&gt;Vous le savez surement maintenant vu le nombre d’article que j’ai écrit sur le sujet, j’aime bien &lt;a class="link" href="http://www.xwiki.org/xwiki/bin/view/Main/WebHome" target="_blank" rel="noopener"
&gt;XWiki&lt;/a&gt;. C’est un super projet mené par des gens passionnés, réactifs et surtout, c’est cet outil qui a permis à mon entreprise d’adopter ENFIN le wiki comme outil de documentation, que ce soit pour documenter les procédures, mais aussi documenter entièrement les concepts de l’outil que nous développons.&lt;/p&gt;
&lt;p&gt;D’un outil quasi-confidentiel utilisés par quelques admins peu motivés (sous Mediawiki), nous sommes donc progressivement passés à un outil utilisé par toutes les équipes, du dev. au support en passant par les ergo. et les CPs, utilisés par plusieurs entités internes et même accepté comme document contractuel par nos prestataires. J’ai d’ailleurs &lt;a class="link" href="https://blog.zwindler.fr/2016/12/12/migration-mediawiki-vers-xwiki/" &gt;documenté la migration sur cet article&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/12/mediawiki_to_xwiki_logo.png"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Mais j’aime aussi XWiki car c’est selon moi l’exemple parfait d’une appli 2 ou 3 tiers relativement simple pour explorer l’écosystème Docker (construction des images, les problématiques réseau et stockage, …). Je joue régulièrement avec &lt;a class="link" href="https://hub.docker.com/r/zwindler/xwiki-tomcat8/" target="_blank" rel="noopener"
&gt;ma propre image sur le Dockerhub&lt;/a&gt; pour explorer un peu plus cet écosystème riche (c’est rien de le dire).&lt;/p&gt;
&lt;p&gt;Quelle meilleure application donc pour réellement tester mon tout nouveau cluster Kubernetes (je ne compte pas nginx ou helloworld) ?&lt;/p&gt;
&lt;h2 id="kubernetes-"&gt;Kubernetes ?
&lt;/h2&gt;&lt;p&gt;Pour ceux qui ont besoin d’un rappel sur Kubernetes ou des premiers concepts et/ou comment l’installer, &lt;a class="link" href="https://blog.zwindler.fr/2017/06/07/installer-cluster-kubernetes-vm-centos/" &gt;je vous invite à lire/relire mon article précédent sur le sujet&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A noter également (j’ai pas mal communiqué là-dessus sur les réseaux sociaux), la Linux Foundation, qui gère également la Cloud Native Computing Foundation (et qui elle-même gère Kubernetes), a mis à disposition gratuitement un cour en ligne de type MOOC sur edX. Vous pouvez même vous « certifier » à la fin si vous réussissez le QCM, moyennant 100$.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/10/kubernetes_edx.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;A l’issue de ces lectures, vous devriez donc avoir :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;la connaissance des différents concepts de Kubernetes&lt;/li&gt;
&lt;li&gt;un cluster Kubernetes opérationnel (une ou plusieurs machines, ou simplement un minikube en local)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ce sont les prérequis pour la suite de cet article, même si je vais essayer de détailler tout ce qui va suivre.&lt;/p&gt;
&lt;h2 id="plan-de-bataille"&gt;Plan de bataille
&lt;/h2&gt;&lt;p&gt;Je ne vais pas vous le cacher, si on veut tout faire soit même, ce n’est pas « trivial ». Mais en décomposant toutes les étapes, vous allez voir que c’est logique.&lt;/p&gt;
&lt;p&gt;Pour faire tourner mon image Docker &lt;a class="link" href="https://hub.docker.com/r/zwindler/xwiki-tomcat8/" target="_blank" rel="noopener"
&gt;zwindler/xwiki-tomcat8&lt;/a&gt;, j’ai besoin, sur mon cluster Kubernetes, des choses suivantes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;un &lt;strong&gt;Deployment&lt;/strong&gt; qui exécute la partie PostgreSQL. Ce &lt;strong&gt;Deployment&lt;/strong&gt; contiendra :
&lt;ul&gt;
&lt;li&gt;un &lt;strong&gt;ReplicaSet&lt;/strong&gt; avec une seule instance car on ne souhaite avoir qu’un seul &lt;strong&gt;Pod&lt;/strong&gt; avec l’image postgresql officielle&lt;/li&gt;
&lt;li&gt;Un &lt;strong&gt;Service&lt;/strong&gt; de type &lt;strong&gt;ClusterIP&lt;/strong&gt; pour lui permettre de communiquer avec le XWiki mais pas avec le monde extérieur&lt;/li&gt;
&lt;li&gt;Un &lt;strong&gt;PersistantVolumeClaim&lt;/strong&gt; et son &lt;strong&gt;PersistentVolume&lt;/strong&gt; associé pour stocker les données de la base&lt;/li&gt;
&lt;li&gt;Des &lt;strong&gt;Secrets&lt;/strong&gt; pour permet de configurer les mots de passes de postgres et de l’utilisateur XWiki&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;un &lt;strong&gt;Deployment&lt;/strong&gt; qui exécute la partie XWiki. Ce &lt;strong&gt;Deployment&lt;/strong&gt; contiendra :
&lt;ul&gt;
&lt;li&gt;un &lt;strong&gt;ReplicaSet&lt;/strong&gt; avec une seule instance car on ne fait tourner qu’un seul &lt;strong&gt;Pod&lt;/strong&gt; avec l’image zwindler/xwiki-tomcat8, car on n’utilise qu’un tomcat à la fois pour exécuter XWiki&lt;/li&gt;
&lt;li&gt;Un Service de type &lt;strong&gt;NodePort&lt;/strong&gt; (ou mieux si vous avez des LoadBalancers ou des Ingress à dispo.) qui permettra d’exposer le port interne au cluster Kubernetes vers le monde extérieur&lt;/li&gt;
&lt;li&gt;Un &lt;strong&gt;PersistantVolumeClaim&lt;/strong&gt; avec le &lt;strong&gt;PersistentVolume&lt;/strong&gt; pour stocker les pièces jointes car mon image Docker utilise l’option filesystem_store pour éviter de surcharger la base pour les PJ&lt;/li&gt;
&lt;li&gt;et aussi le &lt;strong&gt;Secret&lt;/strong&gt; défini précédemment pour accéder à la BDD.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;OK.&lt;/p&gt;
&lt;p&gt;Voir ça posé dans une liste comme ça, ça peut faire peur.&lt;/p&gt;
&lt;p&gt;Alors vous allez me dire : « c’est plus facile de lancer ton DockerCompose » (&lt;a class="link" href="https://blog.zwindler.fr/2016/09/15/installer-xwiki-8-2-1-avec-docker-compose-en-2-lignes-de-commandes/" &gt;car j’ai montré qu’avec DockerCompose on peut démarrer une instance XWiki en 2 ou 3 lignes de commandes&lt;/a&gt;). Mais au final, tout ce que j’ai écris ici peut être concaténé dans un seul et même fichier YAML et le résultat est aussi simple dans l’absolu.&lt;/p&gt;
&lt;h2 id="créer-les-secrets"&gt;Créer les Secrets
&lt;/h2&gt;&lt;p&gt;Clairement, c’est un des gros points forts par rapport à la solution plus simple avec juste Docker / DockerCompose : la gestion des Secrets (et des configurations, dans une moindre mesure).&lt;/p&gt;
&lt;p&gt;Ici, plutôt que d’avoir un mot de passe en clair dans mon fichier compose, le mot de passe est renseigné à part, soit via un fichier, soit via l’API. Et ces mots de passes ne pourront plus être consultés via la CLI, mais pourront être utilisés.&lt;/p&gt;
&lt;p&gt;Pour créer un secret dans Kubernetes en CLI, il existe plusieurs méthodes. Soit on utilise la CLI directement depuis le prompt ou depuis un fichier plat (qui va se charger d’encoder le secret en base64 et de générer le YAML pour nous), soit on décide de créer le YAML nous-même. Je vous met les deux méthodes :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;echo -n &amp;#34;xwikidb&amp;#34; &amp;gt; ./POSTGRES_USER.txt
echo -n &amp;#34;xwikipwd&amp;#34; &amp;gt; ./POSTGRES_PASSWORD.txt
kubectl create secret generic postgresql-xwiki-user-password --from-file=POSTGRES_USER.txt --from-file=POSTGRES_PASSWORD.txt
secret &amp;#34;postgresql-xwiki-user-password&amp;#34; created
#ou
cat &amp;gt; postgresql_xwiki_user_password.yaml &amp;lt;&amp;lt; EOF
apiVersion: v1
kind: Secret
metadata:
name: postgresql-xwiki-user-password
type: Opaque
data:
username: $(cat POSTGRES_USER.txt| base64 -w 0)
password: $(cat POSTGRES_PASSWORD.txt| base64 -w 0)
EOF
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Au final, pour un déploiement unitaire pour vous même, ça ne change pas grand-chose bien sûr. Vous avez renseigné en clair le mot de passe (ou en base64 mais c’est pareil) à un moment donné.&lt;/p&gt;
&lt;p&gt;Cependant, dans le cadre d’un gros projet avec des développeurs qui poussent du code régulièrement d’un côté et des admins qui gèrent de l’autre les utilisateurs et les mots de passes, on peut permettre aux développeurs consommer les mots de passe sans jamais avoir à les connaitre (&lt;strong&gt;et laisser trainer sur Gitlab, ou pire, Github !&lt;/strong&gt;).&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl describe secret postgresql-xwiki-user-password
Name: postgresql-xwiki-user-password
Namespace: default
Labels: &amp;lt;none&amp;gt;
Annotations:
Type: Opaque
Data
====
password: 8 bytes
username: 7 bytes
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="créer-les-persistent-volumes"&gt;Créer les Persistent Volumes
&lt;/h2&gt;&lt;p&gt;Dans mon infrastructure, j’ai déjà un cluster GlusterFS. GlusterFS étant un SDS, il est particulièrement indiqué comme stockage persistant dans le cadre d’un cluster Kubernetes (comme Ceph, Cinder, S3 ou autre). Ces types de méthodes de stockage peuvent facilement se piloter par API et sont hautement disponibles.&lt;/p&gt;
&lt;p&gt;Création de l’endpoint GlusterFS&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat &amp;gt; gluster-endpoints.yaml &amp;lt;&amp;lt;EOF
apiVersion: v1
kind: Endpoints
metadata:
name: gluster-cluster
subsets:
- addresses:
- ip: 10.0.0.1
ports:
- port: 1
protocol: TCP
- addresses:
- ip: 10.0.0.2
ports:
- port: 1
protocol: TCP
EOF
kubectl apply -f gluster-endpoints.yaml
endpoints &amp;#34;gluster-cluster&amp;#34; created
kubectl get endpoints gluster-cluster
NAME ENDPOINTS AGE
gluster-cluster 10.0.0.1:1,10.0.0.2:1 39s
cat &amp;gt; gluster-service.yaml &amp;lt;&amp;lt; EOF
apiVersion: v1
kind: Service
metadata:
name: gluster-cluster
spec:
ports:
- port: 1
EOF
kubectl apply -f gluster-service.yaml
service &amp;#34;gluster-cluster&amp;#34; created
kubectl get service gluster-cluster
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
gluster-cluster 10.96.114.181 &amp;lt;none&amp;gt; 1/TCP 1m
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;La partie GlusterFS a été configurée côté Kubernetes. On peut maintenant s’atteler à la création des PV et PVC associés. D’abord la base de données :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat &amp;gt; gluster-pv-xwiki-pg.yaml &amp;lt;&amp;lt; EOF
apiVersion: v1
kind: PersistentVolume
metadata:
name: gluster-pv-xwiki-pg
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
glusterfs:
endpoints: gluster-cluster
path: /xwiki-pg-storage
readOnly: false
persistentVolumeReclaimPolicy: Retain
EOF
kubectl create -f gluster-pv-xwiki-pg.yaml
persistentvolume &amp;#34;gluster-pv-xwiki-pg&amp;#34; created
cat &amp;gt; gluster-pvc-xwiki-pg.yaml &amp;lt;&amp;lt; EOF
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: gluster-pvc-xwiki-pg
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
EOF
kubectl create -f gluster-pvc-xwiki-pg.yaml
persistentvolumeclaim &amp;#34;gluster-pvc-xwiki-pg&amp;#34; created
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Et maintenant l’application XWiki&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat &amp;gt; gluster-pv-xwiki-app.yaml &amp;lt;&amp;lt; EOF
apiVersion: v1
kind: PersistentVolume
metadata:
name: gluster-pv-xwiki-app
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
glusterfs:
endpoints: gluster-cluster
path: /xwiki-app-storage
readOnly: false
persistentVolumeReclaimPolicy: Retain
EOF
kubectl create -f gluster-pv-xwiki-app.yaml
persistentvolume &amp;#34;gluster-pv-xwiki-app&amp;#34; created
cat &amp;gt; gluster-pvc-xwiki-app.yaml &amp;lt;&amp;lt; EOF
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: gluster-pvc-xwiki-app
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
EOF
kubectl create -f gluster-pvc-xwiki-app.yaml
persistentvolumeclaim &amp;#34;gluster-pvc-xwiki-app&amp;#34; created
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Dans le cadre d’un test, vous pouvez vous contenter de faire simplement appel à un partage NFS ou même à du stockage local (si vous n’avez qu’un worker) mais sachez que vous n’aurez pas le même niveau de résilience ni les même facilités d’administration.&lt;/p&gt;
&lt;p&gt;Si vous voulez un exemple de &lt;strong&gt;PersistentVolume&lt;/strong&gt; utilisant NFS, je vous conseille cet article qui traite d’un sujet peu plus complexe mais qui donne les étapes de base pour mettre en place le PV et PVC : &lt;a class="link" href="http://blog.kubernetes.io/2017/02/postgresql-clusters-kubernetes-statefulsets.html" target="_blank" rel="noopener"
&gt;Créer un cluster PostgreSQL avec un seul et même Deployment en utilisant les StatefulSets&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="créer-le-deployment-postgresql"&gt;Créer le Deployment postgreSQL
&lt;/h2&gt;&lt;p&gt;Voilà, on a tous les prérequis ! Il ne reste plus qu’à créer dans un premier temps notre base de données, puis notre XWiki. Comme indiqué au début, le &lt;strong&gt;Deployment&lt;/strong&gt; contiendra tous les éléments qu’on a créé plus tôt, dont les &lt;strong&gt;Secrets&lt;/strong&gt; et le &lt;strong&gt;Persistent Volume&lt;/strong&gt;. Il manquera aussi un &lt;strong&gt;Service&lt;/strong&gt;, que nous verrons plus tard.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat &amp;gt; xwiki-pg.yaml &amp;lt;&amp;lt; EOF
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: xwiki-pg
labels:
app: xwiki-pg
application: xwiki
spec:
replicas: 1
selector:
matchLabels:
app: xwiki-pg
application: xwiki
template:
metadata:
labels:
app: xwiki-pg
application: xwiki
name: xwiki-pg
spec:
containers:
- image: postgres:9.6
name: xwiki-pg
env:
- name: POSTGRES_DB
value: xwiki
- name: PGDATA
value: /var/lib/postgresql/data/pgdata
- name: POSTGRES_USER
valueFrom:
secretKeyRef:
name: postgresql-xwiki-user-password
key: username
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
name: postgresql-xwiki-user-password
key: password
ports:
- containerPort: 5432
name: xwiki-pg
volumeMounts:
- name: xwiki-pg-storage
mountPath: /var/lib/postgresql/data/pgdata
volumes:
- name: xwiki-pg-storage
persistentVolumeClaim:
claimName: gluster-pvc-xwiki-pg
EOF
kubectl create -f xwiki-pg.yaml
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Normalement, un &lt;strong&gt;Pod&lt;/strong&gt; devrait se créer et monter le disque Gluster, puis s’initialiser avec les variables d’environnement qu’on lui a donné.&lt;/p&gt;
&lt;p&gt;A partir de là, on ne peut cependant pas accéder à la base de données car on a pas encore créé le Service associé au &lt;strong&gt;Deployment&lt;/strong&gt;. Par défaut, on ne donne pas de type, c’est donc un &lt;strong&gt;ClusterIP&lt;/strong&gt;. Pour « savoir » vers quoi le Service doit rediriger, on a ajouté un &lt;strong&gt;Selector&lt;/strong&gt;, qui pointe sur le tag « app » avec la valeur « xwiki-pg » définie plus haut.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat &amp;gt; xwiki-pg-svc.yaml &amp;lt;&amp;lt; EOF
apiVersion: v1
kind: Service
metadata:
name: xwiki-pg-svc
labels:
app: xwiki-pg
spec:
ports:
- port: 5432
protocol: TCP
selector:
app: xwiki-pg
EOF
kubectl create -f xwiki-pg-svc.yaml
service &amp;#34;xwiki-pg-svc&amp;#34; created
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="créer-le-deployment-xwiki"&gt;Créer le Deployment XWiki
&lt;/h2&gt;&lt;p&gt;Youhou ! Plus qu’un ! Ici pas de grosses différences, le principe est le même. On doit créer un &lt;strong&gt;Deployment&lt;/strong&gt; puis un &lt;strong&gt;Service&lt;/strong&gt;.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat xwiki-tomcat.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: xwiki-app
labels:
app: xwiki-app
application: xwiki
spec:
replicas: 1
selector:
matchLabels:
app: xwiki-app
application: xwiki
template:
metadata:
labels:
app: xwiki-app
application: xwiki
name: xwiki-app
spec:
containers:
- image: zwindler/xwiki-tomcat8
name: xwiki-app
env:
- name: POSTGRES_INSTANCE
value: xwiki-pg
- name: POSTGRES_DB
value: xwiki
- name: POSTGRES_USER
valueFrom:
secretKeyRef:
name: postgresql-xwiki-user-password
key: username
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
name: postgresql-xwiki-user-password
key: password
ports:
- containerPort: 8080
name: tomcat-port
volumeMounts:
- name: xwiki-app-storage
mountPath: /usr/local/tomcat/work/xwiki
volumes:
- name: xwiki-app-storage
persistentVolumeClaim:
claimName: gluster-pvc-xwiki-app
kubectl apply -f xwiki-tomcat.yaml
deployment &amp;#34;xwiki-app&amp;#34; created
cat xwiki-tomcat-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: xwiki-app-svc
labels:
apps: xwiki-app
spec:
type: NodePort
ports:
- port: 8080
targetPort: tomcat-port
protocol: TCP
selector:
app: xwiki-app
kubectl apply -f xwiki-tomcat-svc.yaml
service &amp;#34;xwiki-app-svc&amp;#34; created
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="est-ce-que-ça-marche-"&gt;Est-ce que ça marche ?
&lt;/h2&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl get svc
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
gluster-cluster 10.96.114.181 &amp;lt;none&amp;gt; 1/TCP 4h
kubernetes 10.96.0.1 &amp;lt;none&amp;gt; 443/TCP 10d
xwiki-app-svc 10.103.218.140 &amp;lt;nodes&amp;gt; 8080:31484/TCP 4m
xwiki-pg-svc 10.108.219.88 &amp;lt;none&amp;gt; 5432/TCP 16m
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="tout-dun-coup"&gt;Tout d’un coup
&lt;/h2&gt;&lt;p&gt;Chose promise chose due ! Je vous ai dit en début d’article que vous pouviez tout déployer en quelques lignes de commandes. Dans l’absolu, vous pourriez tout déployer via un seul fichier. Je préfère découpler la partie stockage (qui va dépendre du stockage que vous allez utiliser) et la partie secret du reste pour les raisons que j’ai énoncé plus haut. Voilà ce que ça donne :&lt;/p&gt;
&lt;p&gt;On récupère les sources sur github&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;git clone https://github.com/zwindler/docker-xwiki
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A adapter en fonction de votre contexte, à minima les adresses IP si vous avez du gluster, et carrément à réécrire si vous utilisez autre chose (NFS ou CEPH par exemple) :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl apply -f docker-xwiki/kubernetes/gluster-endpoints-service.yaml
endpoints &amp;#34;gluster-cluster&amp;#34; created
service &amp;#34;gluster-cluster&amp;#34; created
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;On injecte ensuite les secrets. A vous de les changer comme on a vu plus haut.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl apply -f docker-xwiki/kubernetes/postgresql_xwiki_user_password.yaml
secret &amp;#34;postgresql-xwiki-user-password&amp;#34; created
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Et on fini par&amp;hellip; tout le reste ! Là normalement il n’y a rien à changer à part éventuellement des ports, les seules « variables » dans ce déploiement étant le stockage et les mots de passes (qu’on vient de gérer).&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl apply -f docker-xwiki/kubernetes/xwiki-tomcat-pg-allinone.yaml
persistentvolume &amp;#34;gluster-pv-xwiki-pg&amp;#34; created
persistentvolume &amp;#34;gluster-pv-xwiki-app&amp;#34; created
deployment &amp;#34;xwiki-pg&amp;#34; created
persistentvolumeclaim &amp;#34;gluster-pvc-xwiki-pg&amp;#34; created
service &amp;#34;xwiki-pg-svc&amp;#34; created
deployment &amp;#34;xwiki-app&amp;#34; created
persistentvolumeclaim &amp;#34;gluster-pvc-xwiki-app&amp;#34; created
service &amp;#34;xwiki-app-svc&amp;#34; created
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="le-mot-de-la-fin"&gt;Le mot de la fin
&lt;/h2&gt;&lt;p&gt;Voilà, avec ce tutoriel vous avez maintenant une vue détaillée, étape par étape, de ce qu’il faut mettre en place pour gérer « proprement » le déploiement d’une application java + postgreSQL via Kubernetes.&lt;/p&gt;
&lt;p&gt;Clairement, c’est bien plus complexe qu’un simple Docker compose comme j’ai pu le présenté dans l’article sur ce sujet. Pour autant, il faut comparer ce qui est comparable, les deux installations n’ont rien à voir !&lt;/p&gt;
&lt;p&gt;D’un côté, vous avez une application déployée sur un nœud docker simple (éventuellement avec Swarm maintenant que les deux sont compatibles).&lt;/p&gt;
&lt;p&gt;De l’autre, vous avez une application qui est déployée sur un cluster de machines :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Si l’une tombe en panne, la haute disponibilité est gérée : pas seulement sur le runtime, mais aussi sur le stockage !&lt;/li&gt;
&lt;li&gt;Vous pouvez segmenter votre cluster en namespaces, et donner des droits à certains namespace à certains utilisateurs avec un gestion fine des autorisations (RBAC)&lt;/li&gt;
&lt;li&gt;Vous disposez d’un dashboard et d’une API pour automatiser tous les déploiements (via Jenkins par exemple). Si vous voulez faire une mise à jour ou besoin de modifier un paramètre, c’est une simple commande ou un fichier de conf à appliquer à nouveau.&lt;/li&gt;
&lt;li&gt;Vous avez la possibilité de faire du scaling up/down, voire de l’autoscaling.&lt;/li&gt;
&lt;li&gt;&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La liste est longue ! En bref, vous passez d’une bidouille à la production.&lt;/p&gt;
&lt;h2 id="sources-additionnelles"&gt;Sources additionnelles
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;docs.openshift.org/latest/install_config/storage_examples/gluster_example.html (lien mort, pas dispo sur Internet Archive)&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://coderjourney.com/using-kubernetes-persistent-volumes/" target="_blank" rel="noopener"
&gt;coderjourney.com/using-kubernetes-persistent-volumes/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.xenonstack.com/blog/how-to-deploy-postgresql-on-kubernetes" target="_blank" rel="noopener"
&gt;www.xenonstack.com/blog/how-to-deploy-postgresql-on-kubernetes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>[Tutoriel] Installer VultureOS (Vulture 3) et configurer sa première application</title><link>https://blog.zwindler.fr/2016/07/07/installer-vultureos-websso-3-configurer-premiere-application/</link><pubDate>Thu, 07 Jul 2016 10:30:27 +0000</pubDate><guid>https://blog.zwindler.fr/2016/07/07/installer-vultureos-websso-3-configurer-premiere-application/</guid><description>&lt;img src="https://blog.zwindler.fr/2014/12/logo2-white1.webp" alt="Featured image of post [Tutoriel] Installer VultureOS (Vulture 3) et configurer sa première application" /&gt;&lt;h2 id="installer-pas-à-pas-vultureos-et-faire-une-configuration-minimale"&gt;Installer pas à pas VultureOS et faire une configuration minimale
&lt;/h2&gt;&lt;p&gt;Une fois n’est pas coutume, même si je suis habituellement assez peu « tutoriel pas à pas avec des screenshots dans tous les sens », je vous propose aujourd’hui de plonger dans l’installation du VultureOS de Vulture WebSSO 3 qui vient de sortir (1er juin) jusqu’à la redirection de votre première application.&lt;/p&gt;
&lt;h2 id="prérequis"&gt;Prérequis
&lt;/h2&gt;&lt;p&gt;Pour ceux qui ne le savent pas, je vous propose de relire mon article où &lt;a class="link" href="https://blog.zwindler.fr/2016/06/16/sortie-de-vulture-3/" &gt;je rappelle brièvement ce qu’est Vulture 3&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Voici les prérequis de VultureOS pour fonctionner dans de bonnes conditions :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VultureOS doit être installé sur une machine virtuelle ou un serveur physique ayant 2 Go de RAM et 30 Go d’espace disque&lt;/li&gt;
&lt;li&gt;avoir une ou plusieurs adresses IP pour recevoir des connexions Web&lt;/li&gt;
&lt;li&gt;pouvoir contacter les applications Web qu’il protège sur leurs ports habituels (80 et 443 en général)&lt;/li&gt;
&lt;li&gt;disposer d’une résolution de noms fonctionnelle (soit par serveur DNS soit via /etc/hosts sur l’OS Vulture) et avoir accès à un serveur NTP&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;avoir un accès HTTPS vers dl.vultureproject.org&lt;/strong&gt; pour s’enregistrer et télécharger les mises à jour&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="démarrage-de-linstallation"&gt;Démarrage de l’installation
&lt;/h2&gt;&lt;p&gt;Comme je l’ai déjà dis, Vulture s’appuie maintenant sur une distribution FreeBSD modifiée et est donc livré clé en main. Pour peu que vous ayez accès à Internet et respecté les prérequis énoncé juste au dessus, tout s’installe donc tout seul.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Next next next&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/06/vultureOS1-1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Classiquement, le disque dur va être formaté par le bootstraping de FreeBSD&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/06/vultureOS2.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Lors du test de la keymap, je n’ai pas trouvé de clavier FR correspondant. Peut être un bug entre FreeBSD et KVM ?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;J’ai volontairement sauté toute la partie configuration du hostname et des cartes réseaux car cela dépend fortement de vous mais rappelez vous surtout que l’aspect DNS doit être particulièrement soigné pour que VultureOS fonctionne correctement !&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/06/vultureOS3.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/06/VultureOS_1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Attention, contrairement à la bêta où nous étions « prompté » pour un mot de passe, le mot de passe de vlt-adm pour l’accès SSH est ici prégénéré (peut être pour éviter les erreurs de saisies clavier?)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Une fois le bootstraping FreeBSD terminé et les prérequis installés, l’OS reboote et vous affiche le message suivant&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/03/vultureOS8_bootstraping.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Connectez vous en SSH avec le login vlt-adm (ou en console, peu importe) et exécuter la commande demandée ci dessus et gentiment recopiée à la main ci dessous pour vos copier coller ;-) :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sudo /home/vlt-gui/env/bin/python2.7 /var/bootstrap/bootstrap.py
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/06/VultureOS_3.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;yes !&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;L’installation de Vulture (en tant qu’application) commence réellement. On vous demande ensuite si vous voulez joindre un cluster existant ou en créer un puis de renseigner un email pour recevoir la clé d’activation de votre Vulture WebSSO.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/06/vultureOS11.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Une fois la clé reçue, on l’applique (attention aux spams, gmail ne me l’a pas flaggé en bêta pas pour la V1 si).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/06/VultureOS_4.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/06/vultureOS12.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Le processus de génération de certificat est maintenant inclus dans l’installation.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Une fois terminé, un login/mdp sera demandé pour la connexion à la GUI et les services de WebSSO seront démarrés.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/06/vultureOS14.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="ouverture-de-linterface-graphique"&gt;Ouverture de l’interface graphique
&lt;/h2&gt;&lt;p&gt;A partir de là on peut donc se connecter en HTTP sur l’URL fournie.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/06/vultureOS15.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Une fois la mire passée, on arrive sur un Dashboard avec quelques métriques sympathiques sur l’état de la machine.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/06/VultureOS_5.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Le menu est accessible sur la gauche en haut, au niveau des 3 tirets horizontaux&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/06/VultureOS_6.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;On y retrouve, bien que dans un ordre un peu modifié, les menus que l’on connaît des précédentes versions.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;La gestion des interfaces réseaux se fait dans &lt;strong&gt;Network/Listeners&lt;/strong&gt;. La gestion de l’HTTPS se fait dans &lt;strong&gt;Configuration Profiles/TLS&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/06/VultureOS_7.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Entre la bêta et la version 1, le menu a été renommé de de SSL profiles à TLS, mais on voit encore SSL Profile en titre dans cette capture.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a class="link" href="https://www.vultureproject.org/docs-v3/reseau-profil-tls/" target="_blank" rel="noopener"
&gt;La documentation de Vulture&lt;/a&gt; donne des indications complémentaires pour la configuration TLS dans des cas où l’on souhaite être compatible HTTP/2.&lt;/p&gt;
&lt;p&gt;Des menus qui vous intéresserons sûrement assez rapidement :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Vulture Management/PKI&lt;/strong&gt; si vous voulez importer de nouveaux certificats&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Configuration Profiles/Logs&lt;/strong&gt; pour gérer vos logs comme vous l’entendez&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="configuration-de-votre-première-application"&gt;Configuration de votre première application
&lt;/h2&gt;&lt;p&gt;Ouvrez le menu &lt;strong&gt;Applications/Applications&lt;/strong&gt;, puis cliquez sur &lt;strong&gt;ADD AN ENTRY&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/06/vultureOS20.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Voici maintenant la liste des champs que nous avons maintenant pour habitude de remplir dans Vulture. Un nom « friendly name » ; « public FQDN » l’URL publique pour accéder à l’application ; « Private URI » l’URL interne que doit utiliser Vulture pour accéder au serveur web qu’il doit protéger.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/06/vultureOS19.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/06/vultureOS22.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Ajouter un listener (une interface réseau)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/06/vultureOS24.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Il est également obligatoirement ajouter un format de log.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Une fois le tout validé, l’application apparaîtra dans la liste. Il faudra recharger la configuration en cliquant sur les flèches en rond (clignotantes) puis sur le triangle pour démarrer l’application.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/06/VultureOS_8.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/06/VultureOS_9.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/06/VultureOS_10.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Et voilà. Pour ceux qui ont des problèmes pour ajouter des applications dans Vulture, les principes restent les mêmes que dans les versions précédentes &lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=vulture" &gt;et que j’ai déjà pas mal traité dans ces articles&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Happy SSOing ;)&lt;/p&gt;</description></item><item><title>[Tutoriel] Installer XWiki 7.X sur RedHat/CentOS 7 (Tomcat + PostGreSQL)</title><link>https://blog.zwindler.fr/2015/12/16/installation-de-xwiki-redhat-7/</link><pubDate>Wed, 16 Dec 2015 17:30:53 +0000</pubDate><guid>https://blog.zwindler.fr/2015/12/16/installation-de-xwiki-redhat-7/</guid><description>&lt;img src="https://blog.zwindler.fr/2015/11/1434473398.webp" alt="Featured image of post [Tutoriel] Installer XWiki 7.X sur RedHat/CentOS 7 (Tomcat + PostGreSQL)" /&gt;&lt;h2 id="xwiki-cest-quoi-"&gt;XWiki, c’est quoi ?
&lt;/h2&gt;&lt;p&gt;En entreprise, il n’est pas rare que les utilisateurs expriment leur besoin de stocker l’information de manière intelligente aux administrateurs systèmes. Ça peut passer par une GED, une plateforme de travail collaboratif, et même dans certains cas, un wiki (l’exemple le plus connu de wiki est &lt;a class="link" href="https://fr.wikipedia.org/wiki/Wikip%C3%A9dia:Accueil_principal" target="_blank" rel="noopener"
&gt;Wikipedia&lt;/a&gt;, au cas où ça ne voyez pas de quoi on parle).&lt;/p&gt;
&lt;p&gt;Comme je travaille dans l’IT, je ne suis pas encore tombé dans un contexte où un wiki n’avait pas sa place et c’était même souvent un projet pris très au sérieux.&lt;/p&gt;
&lt;p&gt;Très au sérieux, d’accord, mais quand même, le mieux serait que ça soit gratuit ! Argument que j’entends relativement souvent de la part des directions, et c’est de bonne guerre ;-).&lt;/p&gt;
&lt;p&gt;Du coup, le choix est tout de suite plus restreint. De ce que j’ai pu trouver dans le marché du gratuit et/ou opensource et pas trop confidentiel pour avoir une chance que le projet survive quelques années, j’ai trouvé :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.mediawiki.org/wiki/MediaWiki/fr" target="_blank" rel="noopener"
&gt;Mediawiki&lt;/a&gt; =&amp;gt; le logiciel sur lequel est basé Wikipedia, que j’ai utilisé à titre personnel mais qui nécessite de connaitre un peu la syntaxe pour obtenir un rendu visuel correct&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.dokuwiki.org/dokuwiki#" target="_blank" rel="noopener"
&gt;Dokuwiki&lt;/a&gt; =&amp;gt;que je n’ai pas utilisé ni même testé, mais j’ai eu de bon retours&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="http://www.xwiki.com/fr/" target="_blank" rel="noopener"
&gt;XWiki&lt;/a&gt; =&amp;gt; un logiciel en Java dont la syntaxe est proche des autres logiciels wiki mais qui dispose surtout de manière native d’un éditeur WYSIWYG (&lt;em&gt;what you see is what you get&lt;/em&gt;, autrement dit : comme word. Le resultat final est visible en temps réel)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La nécessité d’avoir un éditeur WYSIWYG étant un prérequis pour les utilisateurs, je n’ai pas vraiment cherché plus loin : &lt;strong&gt;nous avons installé XWiki&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Pour débuter, XWiki vous propose un fichier installeur sous Linux ou Windows où tout est pré-parametré avec une base de données interne et un serveur d’application web java intégré. Cependant, j’aime avoir un minimum la main sur ce que j’administre, je ne maitrise pas la base HSQLDB et j’ai eu des soucis avec les options de Jetty. C’est pourquoi j’ai préféré installer moi même le serveur de base de données PostgreSQL et le serveur java Tomcat.&lt;/p&gt;
&lt;p&gt;Je vous propose donc d’installer XWiki via le WAR, avec un serveur RedHat Entreprise Linux 7 (ou CentOS 7, c’est pareil), un serveur Tomcat 7 et une base de données postgreSQL 9.2.&lt;/p&gt;
&lt;p&gt;Ce tutoriel décrit de manière séquentielle l’ensemble des opérations nécessaires pour y parvenir, à partir des informations qu’on peut trouver dans plusieurs pages éparpillées dans la &lt;a class="link" href="http://www.xwiki.org/xwiki/bin/view/Documentation/AdminGuide/InstallationWAR" target="_blank" rel="noopener"
&gt;documentation officielle&lt;/a&gt; (et avec quelques captures d’écran en bonus track).&lt;/p&gt;
&lt;h2 id="installation-de-los"&gt;Installation de l’OS
&lt;/h2&gt;&lt;p&gt;Comme indiqué plus haut, j’ai commencé par installer une machine virtuelle RedHat Entreprise Linux 7.1 au format Desktop (poste de travail). L’ensemble des prérequis sont listés dans la &lt;a class="link" href="http://www.xwiki.org/xwiki/bin/view/Documentation/AdminGuide/Installation" target="_blank" rel="noopener"
&gt;documentation officielle&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Une fois que c’est réglé, on peut aller récupérer les sources &lt;a class="link" href="http://enterprise.xwiki.org/xwiki/bin/view/Main/Download" target="_blank" rel="noopener"
&gt;sur le site officiel&lt;/a&gt;. Au moment où j’ai écris ces lignes, la version Xwiki 7.2 est la version dite stable (en fait en vrai on est pas loin de la 7.4, mais j’ai tardé à publier l’article. Le principe reste le même).&lt;/p&gt;
&lt;p&gt;[EDIT 26/01/16] Attention si vous utilisez PostGreSQL, il y a &lt;a class="link" href="http://jira.xwiki.org/browse/XWIKI-13025" target="_blank" rel="noopener"
&gt;un bug en cours sur le widget qui affiche l’arborescence&lt;/a&gt;, du coup j’ai du rollback en 7.2.&lt;/p&gt;
&lt;p&gt;J’avais voulu faire la mise à jour car la 7.4 corrige un bug qui date de la version 3.X sur certains PNG qui font planter l’export PDF.&lt;/p&gt;
&lt;p&gt;[/EDIT]&lt;/p&gt;
&lt;p&gt;Récupérez les fichiers suivants :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;xwiki-enterprise-web-7.2.war&lt;/li&gt;
&lt;li&gt;xwiki-enterprise-ui-mainwiki-all-7.2.xar&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="installation-et-configuration-de-tomcat-7"&gt;Installation et configuration de Tomcat 7
&lt;/h2&gt;&lt;p&gt;Je n’ai pas voulu installer à la main tomcat, RHEL 7 propose une version &lt;em&gt;relativement&lt;/em&gt; récente de tomcat 7 qui convient très bien dans les repository officiels.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;yum install tomcat
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Les instructions pour configurer Tomcat pour XWiki sont listées &lt;a class="link" href="http://www.xwiki.org/xwiki/bin/view/Documentation/AdminGuide/InstallationTomcat" target="_blank" rel="noopener"
&gt;dans la page suivante&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Copiez le war dans l’arborescence &lt;strong&gt;/var/lib/tomcat/webapps&lt;/strong&gt; :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[root@monwiki webapps]# pwd
/var/lib/tomcat/webapps
[root@monwiki webapps]# ll
[...]
-rw-r--r--. 1 root root 227064164 6 nov. 15:16 xwiki-enterprise-web-7.2.war
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Passez le serveur en UTF-8 (au niveau du &lt;strong&gt;connector&lt;/strong&gt; dans &lt;strong&gt;/etc/tomcat/server.xml&lt;/strong&gt;) :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;lt;Connector port=&amp;#34;8080&amp;#34; protocol=&amp;#34;HTTP/1.1&amp;#34; connectionTimeout=&amp;#34;20000&amp;#34; redirectPort=&amp;#34;8443&amp;#34; URIEncoding=&amp;#34;UTF-8&amp;#34; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ajoutez l’option suivante dans la configuration tomcat :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;vi /etc/tomcat/tomcat.conf
CATALINA_OPTS=&amp;#34;-Xmx1024m -XX:MaxPermSize=192m&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ajoutez l’option suivante dans les propriétés de tomcat :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;vi /etc/tomcat/catalina.properties
org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Déployez le war en lançant une première fois le service tomcat :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;systemctl start tomcat
systemctl enable tomcat
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Vérifiez que tout se passe bien avec &lt;em&gt;tail -f /var/log/tomcat/catalina.2015-11-10.log&lt;/em&gt; #remplacer par la date du jour&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;INFOS: Deployment of web application archive /var/lib/tomcat/webapps/xwiki-enterprise-web-7.2.war has finished in 31 a 560 ms
nov. 10, 2015 4:07:47 PM org.apache.coyote.AbstractProtocol start
INFOS: Starting ProtocolHandler [&amp;#34;http-bio-8080&amp;#34;]
nov. 10, 2015 4:07:47 PM org.apache.coyote.AbstractProtocol start
INFOS: Starting ProtocolHandler [&amp;#34;ajp-bio-8009&amp;#34;]
nov. 10, 2015 4:07:47 PM org.apache.catalina.startup.Catalina start
INFOS: Server startup in 31609 ms
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Le seul inconvénient à choisir la version de tomcat présente dans les repositories est qu’un des mécanismes intégrés de scan des jar (archives java) dans cette version provoque l’apparition dans le log d’un très grand nombre de « stack trace » dans votre &lt;strong&gt;catalina.out&lt;/strong&gt; :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;GRAVE: Unable to process Jar entry [javassist/util/proxy/SerializedProxy.class] from Jar
[jar:file:/usr/share/tomcat/webapps/xwiki-enterprise-web-7.2/WEB-INF/lib/javassist-3.19.0-GA.jar!/] for annotations
java.io.EOFException
at java.io.DataInputStream.readUnsignedShort(DataInputStream.java:340)
at org.apache.tomcat.util.bcel.classfile.Utility.swallowMethodParameters(Utility.java:797)
at org.apache.tomcat.util.bcel.classfile.Attribute.readAttribute(Attribute.java:171)
[...]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Avec une version plus récente de tomcat, un warning est simplement indiqué dans le log. Cette erreur n’est pas bloquante, juste désagréable.&lt;/p&gt;
&lt;p&gt;Copiez le driver jdbc 41 (.jar) pour postgreSQL 9.2 dans &lt;strong&gt;WEB-INF/lib&lt;/strong&gt; du répertoire de XWiki dans tomcat. Vous pouvez le télécharger à l’adresse &lt;a class="link" href="https://jdbc.postgresql.org/download/" target="_blank" rel="noopener"
&gt;suivante&lt;/a&gt;.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cd /var/lib/tomcat/webapps/xwiki-enterprise-web-7.2/WEB-INF/lib
chown tomcat:tomcat postgresql-9.2-1004.jdbc41.jar
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="installation-et-configuration-de-postgresql-92"&gt;Installation et configuration de PostGreSQL 9.2
&lt;/h2&gt;&lt;p&gt;La encore, j’ai préféré installer PostGreSQL par le biais des dépôts RPM plutôt que de l’installer à la main.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;yum install postgresql postgresql-server postgresql-jdbc
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Les informations permettant de configurer la base de données PostGreSQL pour XWiki sont disponible sur &lt;a class="link" href="http://www.xwiki.org/xwiki/bin/view/Documentation/AdminGuide/InstallationPostgreSQL" target="_blank" rel="noopener"
&gt;la documentation officielle&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;La première commande à passer sur la base PostGreSQL est de l’initialiser avec la commande suivante :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;postgresql-setup initdb
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Pour information, sur RHEL/CentOS 6, la base est en version 8.4 et pour l’initialiser il faut utiliser :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;service postgresql initdb
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Personnellement j’aime ajouter un lien symbolique pour retrouver mes logs dans /var/log mais c’est totalement un choix personnel.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ln -s /var/lib/pgsql/data/pg_log /var/log/pgsql
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Mdofier la sécurité pour l’authentification des utilisateurs sans utiliser les utilisateurs Unix (changer ident par md5 ou éventuellement trust) :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;vi /var/lib/pgsql/data/pg_hba.conf
# IPv4 local connections:
host all all 127.0.0.1/32 md5
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Démarrez la base de données puis créer la base qui sera dédiée au xwiki et son utilisateur associé :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;systemctl start postgresql
systemctl enable postgresql
su - postgres
createuser xwiki -S -D -R -P -Upostgres
createdb xwiki -Eunicode -Oxwiki -Upostgres
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Je vous conseille aussi de faire un petit test de connexion pour vérifier que tout est bien configuré côté authentification :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;psql -Uxwiki -h 127.0.0.1 -W
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Pour information si jamais vous aviez besoin de la détruire a posteriori, la commande est :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;dropdb -Upostgres xwiki
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="configuration-de-xwiki-72"&gt;Configuration de XWiki 7.2
&lt;/h2&gt;&lt;p&gt;Maintenant qu’on dispose d’une base de données et d’un serveur d’application java, on peut commencer à configurer l’application XWiki en elle même. Configurer hibernate pour que xwiki stocke sa base sur pgsql&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;vi /var/lib/tomcat/webapps/xwiki-enterprise-web-7.2/WEB-INF/hibernate.cfg.xml
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Supprimez les lignes liées à la base hsqldb (interne) et décommenter les lignes « PostgreSQL configuration » (en affectant les bonnes valeurs).&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;lt;property name=&amp;#34;connection.url&amp;#34;&amp;gt;jdbc:postgresql://localhost:5432/xwiki&amp;lt;/property&amp;gt;
&amp;lt;property name=&amp;#34;connection.username&amp;#34;&amp;gt;xwiki&amp;lt;/property&amp;gt;
&amp;lt;property name=&amp;#34;connection.password&amp;#34;&amp;gt;VOTREMOTDEPASSE&amp;lt;/property&amp;gt;
&amp;lt;property name=&amp;#34;connection.driver_class&amp;#34;&amp;gt;org.postgresql.Driver&amp;lt;/property&amp;gt;
&amp;lt;property name=&amp;#34;dialect&amp;#34;&amp;gt;org.hibernate.dialect.PostgreSQLDialect&amp;lt;/property&amp;gt;
&amp;lt;property name=&amp;#34;jdbc.use_streams_for_binary&amp;#34;&amp;gt;false&amp;lt;/property&amp;gt;
&amp;lt;property name=&amp;#34;xwiki.virtual_mode&amp;#34;&amp;gt;schema&amp;lt;/property&amp;gt;
&amp;lt;mapping resource=&amp;#34;xwiki.postgresql.hbm.xml&amp;#34;/&amp;gt;
&amp;lt;mapping resource=&amp;#34;feeds.hbm.xml&amp;#34;/&amp;gt;
&amp;lt;mapping resource=&amp;#34;activitystream.hbm.xml&amp;#34;/&amp;gt;
&amp;lt;mapping resource=&amp;#34;instance.hbm.xml&amp;#34;/&amp;gt;
&amp;lt;mapping resource=&amp;#34;mailsender.hbm.xml&amp;#34;/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Remplacez la clé de chiffrement du cookie dans le &lt;strong&gt;xwiki.cfg&lt;/strong&gt; (pour éviter qu’un attaquant puisse déchiffrer les cookies) et &lt;a class="link" href="http://www.xwiki.org/xwiki/bin/view/Documentation/AdminGuide/Configuration#HEnablesuperadminaccount" target="_blank" rel="noopener"
&gt;activez temporairement le superadmin&lt;/a&gt; pour se connecter au wiki pour la première connexion&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;vi /var/lib/tomcat/webapps/xwiki-enterprise-web-7.2/WEB-INF/xwiki.cfg
xwiki.authentication.validationKey=1234totototototototototototototo
xwiki.authentication.encryptionKey=1234titititititititititititititi
[...]
xwiki.superadminpassword=system
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Redémarrez tomcat&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;systemctl restart tomcat
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ouvrir un navigateur sur l’URL de votre Wiki &lt;code&gt;http://wiki.example.org:8080/xwiki-enterprise-web-7.2/bin/view/Main/&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Le wizard de « premier déploiement » doit apparaître. Vous le verrez à nouveau en cas de mise à jour.&lt;/p&gt;
&lt;h2 id="déployer-le-xar-main-qui-contient-lensemble-des-pages-par-défaut"&gt;Déployer le XAR « Main » qui contient l’ensemble des pages par défaut
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Attention :&lt;/strong&gt; Ce qu’il faut savoir c’est que par défaut, les XWiki sont installés sans aucunes pages. Les pages par défaut doivent être chargées manuellement via un import la première fois. C’est à ça que sert le fichier &lt;strong&gt;xwiki-enterprise-ui-mainwiki-all-7.2.xar&lt;/strong&gt; que vous avez téléchargé au début de la procédure.&lt;/p&gt;
&lt;p&gt;Tout est expliqué dans la &lt;a class="link" href="http://www.xwiki.org/xwiki/bin/view/Documentation/AdminGuide/InstallationWAR#HInstallingtheDefaultWikiXAR" target="_blank" rel="noopener"
&gt;documentation officielle&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/11/00_xwiki.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/11/01_xwiki.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Ici on peut voir que la « User Interface » n’est pas disponible. J’ai l’impression que c’est le cas si votre VM n’a pas accès à Internet. Dans ce cas là, vous devez récupérer le xar contenant l’ensemble des pages par défaut pour les réimporter en tant que superadmin. Dans le cas où le bouton « Install » sous « User Interface », ce qui suit n’est pas nécessaire.&lt;/p&gt;
&lt;p&gt;Cliquez sur [Later].&lt;/p&gt;
&lt;p&gt;Normalement une page pratiquement vide doit apparaître. Il s’agit du squelette du XWiki 7.2.&lt;/p&gt;
&lt;p&gt;Se connecter sur le wiki en tant que superadmin / system et ouvrir la page d’administration (sur le côté droit)&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/11/015_xwiki.avif"
loading="lazy"
&gt;&lt;br&gt;
&lt;img src="https://blog.zwindler.fr/2015/11/02_xwiki.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Cliquez sur « Import » et uploadez le fichier &lt;strong&gt;xwiki-enterprise-ui-mainwiki-all-7.2.xar&lt;/strong&gt; préalablement téléchargé. Après upload, le package apparait dans « Available Packages »&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/11/03_xwiki.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;En cliquant sur le fichier xar qui vient d’être uploadé, on peut sélectionner les pages qu’on ne souhaite pas utiliser (typiquement j’ai désactivé Blog et Sandbox qui ne me servent pas).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/11/04_xwiki.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Cocher « Import as backup package », puis cliquer sur « Import ».&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/11/05_xwiki.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Maintenant que les pages par défaut sont importées, on a un compte administrateur local pour se connecter (Admin / admin).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/11/06_xwiki.avif"
loading="lazy"
&gt;&lt;br&gt;
&lt;img src="https://blog.zwindler.fr/2015/11/07_xwiki.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Voilà un wiki fonctionnel utilisable en entreprise.&lt;/p&gt;
&lt;h2 id="bonus-pousser-un-peu-la-configuration-du-xwiki"&gt;Bonus, pousser un peu la configuration du XWiki
&lt;/h2&gt;&lt;p&gt;Ok ça fonctionne. Mais bon, la première chose que vous voudrez peut être faire c’est passer le XWiki en Français.&lt;/p&gt;
&lt;p&gt;Pour se faire, allez dans Administration, Localization, positionner les deux paramètres « en » à « fr » et enregistrer. La langue devrait changer automatiquement (sans redémarrage).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/11/08_xwiki.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Et enfin voici les différents paramètres pour désactiver le superadmin, ajouter l’authentification LDAP (exemple Active Directory, mais je l’ai fais aussi marcher en Novell et en OpenLDAP) et activer les statistiques (désactivées par défaut pour améliorer les performances).&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;vi /var/lib/tomcat/webapps/xwiki-enterprise-web-7.2/WEB-INF/xwiki.cfg
# xwiki.superadminpassword=system
[...]
xwiki.authentication.ldap=1
xwiki.authentication.ldap.server=dom
xwiki.authentication.ldap.port=389
xwiki.authentication.ldap.bind_DN=CN=ldapreadonly,OU=xxx,DC=xxx,DC=xxx
xwiki.authentication.ldap.bind_pass=xxxxxxxxx
xwiki.authentication.ldap.base_DN=OU=xxx,DC=xxx,DC=xxx
xwiki.authentication.ldap.UID_attr=sAMAccountName
xwiki.authentication.ldap.fields_mapping=name=sAMAccountName,last_name=sn,first_name=givenName,fullname=displayName,email=mail,ldap_dn=dn
[...]
xwiki.stats=1
xwiki.stats.default=1
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Redémarrez Tomcat pour prise en compte des nouveaux paramètres.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;systemctl restart tomcat
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>[Tutoriel] Reconstruire le fichier de définition « .vmdk » manquant lorsqu’on a que le « -flat.vmdk »</title><link>https://blog.zwindler.fr/2015/08/01/tutoriel-reconstruire-le-fichier-de-definition-vmdk-manquant-lorsquon-a-que-le-flat-vmdk/</link><pubDate>Sat, 01 Aug 2015 10:30:48 +0000</pubDate><guid>https://blog.zwindler.fr/2015/08/01/tutoriel-reconstruire-le-fichier-de-definition-vmdk-manquant-lorsquon-a-que-le-flat-vmdk/</guid><description>&lt;img src="https://blog.zwindler.fr/2015/07/vmware2.webp" alt="Featured image of post [Tutoriel] Reconstruire le fichier de définition « .vmdk » manquant lorsqu’on a que le « -flat.vmdk »" /&gt;&lt;h2 id="introduction-de-principe-sur-les-disques-durs-virtuels-par-vmware"&gt;Introduction de principe sur les disques durs virtuels par VMware
&lt;/h2&gt;&lt;p&gt;Quite à enfoncer des portes ouvertes, les disques virtuels chez VMware ont l’extension &lt;strong&gt;.vdmk&lt;/strong&gt;. Mais en vrai, il y a deux types de fichiers VMDK et chaque disque dur virtuel VMware dispose &lt;strong&gt;des deux&lt;/strong&gt; fichiers pour fonctionner :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;le fichier contenant les données brutes, avec comme nom &lt;strong&gt;mavm_X-flat.vmdk&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;un fichier de configuration en mode texte avec des informations sur l&amp;rsquo;emplacement des données, le contrôleur à utiliser, la taille, &amp;hellip; et nommé &lt;strong&gt;mavm_X.vmdk&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Généralement&lt;/em&gt;, les fichiers VMDK sont nommés comme leur VM et un indice (X) apparaît quand il y en a plusieurs. Cependant, ces fichiers peuvent être renommés pour placés dans d’autres dossiers et fausser la numérotation donc ne prenez pas les informations fournies par le nom du fichier pour argent comptant.&lt;/p&gt;
&lt;h2 id="récupérer-les-informations-nécessaires"&gt;Récupérer les informations nécessaires
&lt;/h2&gt;&lt;p&gt;Au même titre que perdre le fichier &lt;strong&gt;-flat&lt;/strong&gt; qui contient les données serait problématique pour le fonctionnement de votre VM, la perte du fichier de définition est assez fâcheux. Le disque n’est tout simplement pas utilisable car l’ESXi ne sait pas interpréter le fichier &lt;strong&gt;-flat&lt;/strong&gt; seul.&lt;/p&gt;
&lt;p&gt;Cependant, on peut le reconstruire. Ouf !&lt;/p&gt;
&lt;p&gt;D’ailleurs, on peut reconstruire le fichier &lt;strong&gt;-flat.vmdk&lt;/strong&gt; aussi, mais sans les données bien entendu. Du coup je trouve que c’est quand même nettement moins intéressant que le contraire. Je ferai peut être quand même un article là dessus.&lt;/p&gt;
&lt;p&gt;La première chose à faire est de déterminer le type de contrôleur virtuel que la machine virtuelle utilise pour se connecter au disque.&lt;/p&gt;
&lt;p&gt;C’est très important et il peut parfois y en avoir plusieurs sur une même VM. On trouve ces informations dans le fichier de définition de la VM (&lt;strong&gt;.vmx&lt;/strong&gt;) ou directement depuis la console VMware.&lt;/p&gt;
&lt;p&gt;En règle générale, ce paramètre est souvent laissé par défaut et dans mon cas, la VM utilisait un &lt;strong&gt;lsilogic&lt;/strong&gt; en position &lt;strong&gt;0&lt;/strong&gt; (scsi0). Le disque était lui branché sur l&amp;rsquo;emplacement &lt;strong&gt;0&lt;/strong&gt; du contrôleur, aussi visible dans la console comme &lt;strong&gt;0:0&lt;/strong&gt;.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;scsi0.present = &amp;#34;true&amp;#34;
scsi0.sharedBus = &amp;#34;virtual&amp;#34;
scsi0.virtualDev = &amp;#34;lsilogic&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;L’étape d’après consiste à savoir quelle est la taille du disque virtuel. En se connectant en SSH sur l’ESXi qui a accès au datastore, vous pouvez retrouver simplement cette information via un &lt;em&gt;ls -l&lt;/em&gt; qui vous donnera la taille totale que peut avoir le disque.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# ls -l mavm-flat.vmdk
-rw------- 1 root root 1036160860160 Dec 11 12:30 mavm-flat.vmdk
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Maintenant qu’on dispose de toutes les informations nécessaires, on va recréer un disque virtuel vierge temporaire. On récupérera et adaptera son fichier &lt;strong&gt;.vmdk&lt;/strong&gt; pour pouvoir réutiliser notre fichier &lt;strong&gt;-flat.vmdk&lt;/strong&gt;.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# vmkfstools -c 1036160860160 -a lsilogic -d thin temp.vmdk
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;La commande devrait créer deux fichiers temp.vmdk et temp-flat.vmdk. Pour plus d’options concernant la commande, je vous invite à lire le kb suivant : kb.vmware.com (lien mort)&lt;/p&gt;
&lt;h2 id="thin-provisioning-ou-pas-"&gt;Thin provisioning ou pas ?
&lt;/h2&gt;&lt;p&gt;Vous avez peut être noté le &lt;em&gt;-d thin&lt;/em&gt; dans la commande un peu plus haut. Tous mes disques sont en Thin Provisioning car ça permet de ne consommer que l’espace réellement nécessaire. VMware a prouvé que les performances étaient similaire à l’allocation normale du disque à sa création et dans la majorité des cas c’est donc 100% gagnant.&lt;/p&gt;
&lt;p&gt;Cependant, dans le cas où votre disque n’est pas en Thin provisioning, il y a quand même intérêt -pour le disque temporaire- à le créer avec l’option &lt;em&gt;-d thin&lt;/em&gt;. Comme nous n’allons réutiliser que le fichier de définition &lt;strong&gt;.vmdk&lt;/strong&gt;, le fichier &lt;strong&gt;temp-flat.vmdk&lt;/strong&gt; aurait mis du temps à se construire, et aurait consommé de l’espace disque pour rien. J’indiquerai comment corrigé le tir dans la partie suivante.&lt;/p&gt;
&lt;h2 id="paramétrage-du-fichier-reconstruit"&gt;Paramétrage du fichier reconstruit
&lt;/h2&gt;&lt;p&gt;On peut supprimer le fichier &lt;strong&gt;temp-flat.vmdk&lt;/strong&gt; (le fichier de données donc) qui n’est plus nécessaire, et renommer le fichier &lt;strong&gt;temp.vmdk&lt;/strong&gt; avec le nom correspondant au fichier manquant.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# rm -i temp-flat.vmdk
# mv -i temp.vmdk mavm.vmdk
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A l’aide d’un éditeur de texte (soit via &lt;strong&gt;vi&lt;/strong&gt; si vous êtes directement sur l’ESXi soit vous le récupérez pour l’éditer sur votre poste), on va modifier les sections qui ne correspondent pas encore à notre disque &lt;strong&gt;-flat&lt;/strong&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;vérifiez que la taille annoncée (en nombre de blocs de 512 octets, donc multiplier par 2 le nombre obtenu plus haut) sous #&lt;em&gt;Extent Description&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;modifiez le nom du fichier après VMFS pour qu’il corresponde au fichier &lt;strong&gt;-flat&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;adaptez si besoin le contrôleur (si vous n’avez pas rentré le bon lors du lancement de la commande plus haut)&lt;/li&gt;
&lt;li&gt;supprimez la ligne &lt;em&gt;ddb.thinProvisioned = « 1 »&lt;/em&gt; si le fichier &lt;strong&gt;-flat.vmdk&lt;/strong&gt; n’était pas en thin provisioning initialement.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[...]
# Extent description
RW 2072321720320 VMFS &amp;#34;mavm-flat.vmdk&amp;#34;
[...]
ddb.adapterType = &amp;#34;lsilogic&amp;#34;
ddb.thinProvisioned = &amp;#34;1&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Vous devriez avoir un disque virtuel de nouveau fonctionnel.&lt;/p&gt;
&lt;h2 id="bonus-track--vérifier-lintégrité-du-disk-chain"&gt;Bonus track : vérifier l’intégrité du « disk chain »
&lt;/h2&gt;&lt;p&gt;Vous pouvez vérifier que le fichier .vmdk correspond au fichier -flat avec les commandes suivantes :&lt;/p&gt;
&lt;p&gt;Pour ESXi 3.5/4.x:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# vmkfstools -q mavm.vmdk
mavm.vmdk is not an rdm
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Pour ESXi 5.x et 6.x :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# vmkfstools -e mavm.vmdk
Disk chain is consistent
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Mise en place de Guacamole 0.9.5 sur CentOS 7</title><link>https://blog.zwindler.fr/2015/05/31/mise-en-place-de-guacamole-0-9-5-sur-centos-7/</link><pubDate>Sun, 31 May 2015 09:49:36 +0000</pubDate><guid>https://blog.zwindler.fr/2015/05/31/mise-en-place-de-guacamole-0-9-5-sur-centos-7/</guid><description>&lt;img src="https://blog.zwindler.fr/2015/05/guac-tricolor.webp" alt="Featured image of post Mise en place de Guacamole 0.9.5 sur CentOS 7" /&gt;&lt;p&gt;&lt;strong&gt;Pour information&lt;/strong&gt; : je me suis basé sur le très bon article de &lt;strong&gt;Deviant Engineer&lt;/strong&gt;, qui est concis, s’affranchit de la conf par fichier plat au profit du module MySQL, &lt;strong&gt;et surtout&lt;/strong&gt; qui fonctionne, ce qui n’est pas le cas de tous les tutoriels que j’ai pu croiser sur la toile.&lt;/p&gt;
&lt;p&gt;Aujourd’hui, au même titre que l’informatique s’est généralisée, Internet est de plus en plus présent, où qu’on se trouve. Mais ce n’est pas toujours un Internet comme à la maison.&lt;/p&gt;
&lt;p&gt;Pour des raisons de sécurité et/ou de bande passante, certains ports/protocoles/site web sont souvent bloqués sur les points d’accès public ou d’entreprise. Il n’est pas rare que seul l’HTTP et l’HTTPS soient disponible, me privant ainsi de mes accès SSH/VPN/FTP/&amp;hellip;&lt;br&gt;
C’est un vrai casse tête pour moi : je déploie des services chez moi et j’en deviens dépendant au point d’être agacé de ne pas y avoir accès en toutes circonstances. Et plutôt que de relativiser cet absence d’accès absolu à mes services/données, je préfère chercher des moyens de contournement ;).&lt;/p&gt;
&lt;p&gt;Si l’autohébergement d’applications web et l’utilisation d’un reverse proxy (Vulture/Apache) répond à une partie de cette problématique, des fois, j’ai parfois besoin d’avoir accès aux machines qui hébergent ces services. C’est pourquoi j’utilisais jusqu’à présent Ajaxterm, puis Gateone pour disposer d’un accès SSH à mes serveurs en cas de filtrage.&lt;/p&gt;
&lt;p&gt;Cependant, j’ai aussi besoin de me connecter en mode graphique sur mes serveurs. En présentant au travers d’une interface HTML5 des clients pour les protocoles SSH, VNC et RDP, Guacamole répond à ce besoin.&lt;/p&gt;
&lt;p&gt;Quelques ressources pour bien commencer :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="http://guac-dev.org/" target="_blank" rel="noopener"
&gt;le site officiel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="http://guac-dev.org/doc/gug/installing-guacamole.html" target="_blank" rel="noopener"
&gt;la documentation d’installation officielle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://web.archive.org/web/20160814174529/https://deviantengineer.com/2015/02/guacamole-centos7/" target="_blank" rel="noopener"
&gt;le tutoriel de Devian Engineer (lien mort, j&amp;rsquo;utilise Internet Archive)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La documentation officielle décrit comment l’installer à partir des sources. Cependant, sur certains systèmes, les applications ont été packagées et sont disponibles (0.8.4 si je ne m’abuse sur RHEL et CentOS). Je voulais avoir la version la plus récente, je me suis donc penché sur la solution « compilation ».&lt;/p&gt;
&lt;p&gt;Et pour avoir une compatibilité maximale en terme de fonctionnalités, il faut disposer de Tomcat 7, présent nativement dans RHEL7/CentOS7, que j’ai donc installé (mon premier CentOS7, youhou !)&lt;/p&gt;
&lt;h2 id="prérequis"&gt;Prérequis
&lt;/h2&gt;&lt;p&gt;Forcément, la première chose à faire lorsqu’on installe une application web un peu exotique sur un CentOS, c’est d’installer les dépôts additionnels pour les dépendances (ici EPEL).&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;rpm -Uvh http://mirror.metrocast.net/fedora/epel/7/x86_64/e/epel-release-7-5.noarch.rpm # EPEL Repo
yum -y install wget
wget http://download.opensuse.org/repositories/home:/felfert/Fedora_19/home:felfert.repo &amp;amp;&amp;amp; mv home\:felfert.repo /etc/yum.repos.d/ # Felfert Repo
yum -y install tomcat libvncserver freerdp libvorbis libguac libguac-client-vnc libguac-client-rdp libguac-client-ssh
yum -y install cairo-devel pango-devel libvorbis-devel openssl-devel gcc pulseaudio-libs-devel libvncserver-devel \
freerdp-devel uuid-devel libssh2-devel libtelnet libtelnet-devel tomcat-webapps tomcat-admin-webapps java-1.7.0-openjdk.x86_64
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="installation-du-composant-serveur"&gt;Installation du composant « serveur »
&lt;/h2&gt;&lt;p&gt;Le logiciel est découpé en deux parties. Une partie « serveur » qui correspond au portail web, et une partie dite « cliente », qui se charge de la connexion aux différents serveurs SSH/&lt;del&gt;telnet&lt;/del&gt;/VNC/RDP que vous aurez configurés. J’ai rayé telnet car je refuse d’utiliser ce protocole (à l’exception de certaines contraintes de travail très particulières).&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cd /distrib
wget http://sourceforge.net/projects/guacamole/files/current/source/guacamole-server-0.9.5.tar.gz
tar -xzf guacamole-server-0.9.5.tar.gz &amp;amp;&amp;amp; cd guac*0.9.5
./configure --with-init-dir=/etc/init.d
make
make install
ldconfig
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="installation-du-du-composant-client"&gt;Installation du du composant « client »
&lt;/h2&gt;&lt;p&gt;La partie client peut directement être récupérée tel quel sur le site du projet.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;mkdir -p /var/lib/guacamole &amp;amp;&amp;amp; cd /var/lib/guacamole/
wget http://sourceforge.net/projects/guacamole/files/current/binary/guacamole-0.9.5.war -O guac.war
ln -s /var/lib/guacamole/guac.war /var/lib/tomcat/webapps/
rm -rf /usr/lib64/freerdp/guacdr.so
ln -s /usr/local/lib/freerdp/guacdr.so /usr/lib64/freerdp/
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="mariadb-mysql"&gt;MariaDB (MySQL)
&lt;/h2&gt;&lt;p&gt;Ne soyez pas surpris de découvrir MariaDB. MariaDB, c’est MySQL. Ou plutôt ce que MySQL aurait du devenir. Il s’agit d’un fork de MySQL initié par son créateur qui a réalisé qu’Oracle (qui a racheté Sun Microsystems en 2009) risquait d’envoyer le produit dans le mur (en concurrence avec Oracle Database).&lt;br&gt;
MariaDB a donc progressivement remplacé MySQL dans les communautés Open Source et les entreprises (citons Google en 2013), et RedHat a suivi le mouvement avec la version 7 de RHEL.&lt;br&gt;
Pas de mauvaise surprise si vous êtes habitués à MySQL : tout est identique en terme d’administration. Vos scripts fonctionneront toujours, les binaires n’ont pas changés.&lt;/p&gt;
&lt;h3 id="installation-de-la-base-de-données"&gt;Installation de la base de données
&lt;/h3&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;yum -y install mariadb mariadb-server
cd /distrib
wget http://sourceforge.net/projects/guacamole/files/current/extensions/guacamole-auth-mysql-0.9.5.tar.gz
tar -zxf guacamole-auth-mysql-0.9.5.tar.gz
wget http://dev.mysql.com/get/Downloads/Connector/j/mysql-connector-java-5.1.32.tar.gz
tar -zxf mysql-connector-java-5.1.32.tar.gz
mv mysql-connector-java-5.1.32/mysql-connector-java-5.1.32-bin.jar guacamole-auth-mysql-0.9.5/lib/
mkdir /var/lib/guacamole/classpath/
cp /distrib/guacamole-auth-mysql-0.9.5/lib/* /var/lib/guacamole/classpath/
systemctl restart mariadb.service
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="configuration-de-la-base-de-données"&gt;Configuration de la base de données
&lt;/h3&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;mysqladmin -u root password MySQLRootPass
mysql -u root -p # Enter above password
create database guacdb;
create user &amp;#39;guacuser&amp;#39;@&amp;#39;localhost&amp;#39; identified by &amp;#39;guacDBpass&amp;#39;;
grant select,insert,update,delete on guacdb.* to &amp;#39;guacuser&amp;#39;@&amp;#39;localhost&amp;#39;;
flush privileges;
quit
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="création-du-schéma-pour-guacd"&gt;Création du schéma pour Guacd
&lt;/h3&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;cd /distrib/sqlauth/guacamole-auth-mysql-0.9.5/schema/
cat ./*.sql | mysql -u root -p guacdb # Enter SQL root password set above
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="configuration-création-du-fichier-properties"&gt;Configuration, création du fichier « .properties »
&lt;/h2&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;mkdir -p /etc/guacamole/ &amp;amp;&amp;amp; vi /etc/guacamole/guacamole.properties
# Hostname and port of gucamole proxy
guacd-hostname: localhost
guacd-port: 4822
# Location to read extra .jar&amp;#39;s from
lib-directory: /var/lib/guacamole/classpath/
# Authentication provider class
auth-provider: net.sourceforge.guacamole.net.auth.mysql.MySQLAuthenticationProvider
# MySQL properties
mysql-hostname: localhost
mysql-port: 3306
mysql-database: guacdb
mysql-username: guacuser
mysql-password: guacDBpass
# Additional settings
mysql-disallow-duplicate-connections: false
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="post-installation"&gt;Post-installation
&lt;/h2&gt;&lt;p&gt;Ne pas oublier de nettoyer les répertoires contenant les sources (dans /distrib chez moi), ajouter un lien symbolique vers le fichier de configuration et ajouter le démarrage automatique des services&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;mkdir -p /usr/share/tomcat/.guacamole
ln -s /etc/guacamole/guacamole.properties /usr/share/tomcat/.guacamole/
systemctl enable tomcat.service &amp;amp;&amp;amp; systemctl enable mariadb.service &amp;amp;&amp;amp; chkconfig guacd on
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Le serveur devrait être accessible à l’adresse http://@IP_serveur:8080/gucamole**/**. A partir de là, vous pouvez configurer vos serveurs SSH/RDP/VNC, créer des utilisateurs et vous connecter.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/05/x_guacamole.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Deux derniers points :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;les logs ne sont pas toujours très locaces. Chez moi, il se trouvent dans /var/log/messages et /var/log/tomcat/&lt;/li&gt;
&lt;li&gt;il manque selon moi un menu pour gérer les connexions actives. Typiquement, dans le cas de VNC, le soft m’indique que j’ai 4 ou 5 sessions ouvertes. Elles n’ont pas l’air concurrentes (je n’en ai qu’une réellement active), mais me parait potentiellement même problématique&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Partage de VMDK entre plusieurs VMs</title><link>https://blog.zwindler.fr/2015/01/07/partage-de-vmdk-entre-plusieurs-vms/</link><pubDate>Wed, 07 Jan 2015 16:05:17 +0000</pubDate><guid>https://blog.zwindler.fr/2015/01/07/partage-de-vmdk-entre-plusieurs-vms/</guid><description>&lt;img src="https://blog.zwindler.fr/2015/07/vmware2.webp" alt="Featured image of post Partage de VMDK entre plusieurs VMs" /&gt;&lt;p&gt;Si vous déjà voulu faire un POC de cluster Linux sur des machines virtuelles VMware, vous vous êtes déjà demandé comment vous alliez faire pour partager entre deux serveurs un espace de stockage commun à ces deux machines.&lt;/p&gt;
&lt;p&gt;Une façon de faire consiste à rajouter une couche d’abstraction du stockage au dessus de l’OS (via GlusterFS ou DRBD par exemple), mais dans le cas d’un POC pour valider un cluster connecté au SAN, ce n’est pas forcément la première solution qui vient à l’esprit. Personnellement, la plupart des clusters que je construis sont encore dans un schéma plus simple à base de LUNs  iSCSI ou FC partagés sur un SAN en actif/actif ou actif/passif.&lt;/p&gt;
&lt;p&gt;Cependant, pour simuler ce fonctionnement sur vos VMs, il va falloir bidouiller un peu.&lt;/p&gt;
&lt;p&gt;En effet, pour éviter toute erreur malencontreuse (et même désastreuse), VMware interdit par défaut le démarrage de toute machine virtuelle qui aurait un disque en cours d’utilisation par une autre machine virtuelle. Aïe&amp;hellip;&lt;/p&gt;
&lt;p&gt;Voici un petit mode opératoire pour s’en sortir ;-)&lt;/p&gt;
&lt;p&gt;Dans ce mode opératoire, les disques qu’on souhaite partager entre les deux serveurs sont des disques LVM en miroir, hébergés sur les baies de disques qui sont accessibles depuis les deux serveurs ESXi.&lt;/p&gt;
&lt;p&gt;Cet exemple permet de valider la fiabilité de la méthode dans le cadre d’un cluster Linux virtuel de type RedHat Cluster Suite. Le principe reste tout de même valide pour une utilisation en dehors de RedHat Cluster Suite, certaines opérations ne seront juste pas nécessaires (qui peut le plus peut le moins).&lt;/p&gt;
&lt;h2 id="prérequis"&gt;Prérequis
&lt;/h2&gt;&lt;p&gt;Pour les besoins de la documentation, deux machines virtuelles &lt;strong&gt;test_partage_vmdk_1&lt;/strong&gt; et &lt;strong&gt;test_partage_vmdk_2&lt;/strong&gt; ont été créés. Elles disposent des caractéristiques techniques suivantes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;test_partage_vmdk_1&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;hébergée sur ESXi1&lt;/li&gt;
&lt;li&gt;RedHat Entreprise Linux 5.8&lt;/li&gt;
&lt;li&gt;2 vCPU, 1 Go de RAM&lt;/li&gt;
&lt;li&gt;50 Go de disque interne sur un espace partagé&lt;/li&gt;
&lt;li&gt;IP 192.168.111.1/24 sur un réseau virtuel&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;test_partage_vmdk_2&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;hébergée sur ESXi2&lt;/li&gt;
&lt;li&gt;RedHat Entreprise Linux 5.8&lt;/li&gt;
&lt;li&gt;2 vCPU, 1 Go de RAM&lt;/li&gt;
&lt;li&gt;50 Go de disque interne sur un espace partagé&lt;/li&gt;
&lt;li&gt;IP 192.168.111.2/24 sur un réseau virtuel&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="création-des-disques-virtuels"&gt;Création des disques virtuels
&lt;/h2&gt;&lt;p&gt;Les machines &lt;strong&gt;test_partage_vmdk_1&lt;/strong&gt; et &lt;strong&gt;test_partage_vmdk_2&lt;/strong&gt; doivent être éteintes avant de réaliser les modifications.&lt;/p&gt;
&lt;p&gt;Ouvrir les paramètres de la machine virtuelle &lt;strong&gt;test_partage_vmdk_1&lt;/strong&gt;, et ajouter un nouveau périphérique (Disque dur).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/01/vmdk_partage1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Le provisionnement du disque doit impérativement être « statique immédiatement mis à zéro ». De plus, il doit aussi être hébergé sur un datastore commun aux deux machines physiques ESXi.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/01/vmdk_partage31.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Créer le disque et l’affecter à un &lt;em&gt;Nœud périphérique virtuel&lt;/em&gt; qui n’est pas encore utilisé.&lt;/p&gt;
&lt;p&gt;Ici, le disque interne est stocké sur l’adresse SCSI (0:0). &lt;strong&gt;Par défaut&lt;/strong&gt; VMware propose de créer le disque à la suite en SCSI (**0:**1).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Il faut impérativement&lt;/strong&gt; dérouler la liste pour affecter le disque à l’adresse SCSI (**1:**0) qui représente un nouveau contrôleur SCSI.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/01/vmdk_partage4.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;De plus, pour permettre l’usage des snapshots sur la partie disque dur interne, les disques doivent être créés en Mode Indépendant/Persistant. &lt;em&gt;Dans le cas contraire, les snapshots seront impossibles sur la machine virtuelle&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Une fois le disque créé, un nouveau contrôleur SCSI est également créé. Avant de valider la création du disque et du contrôleur SCSI, il faut modifier le paramètre de Partage de bus de SCSI en mode « Physique ».&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/01/vmdk_partage5.avif"
loading="lazy"
&gt;[4]Le second disque dur devra être créé de la même manière, et affecté au même contrôleur SCSI (on prendra l’adresse &lt;strong&gt;1:1&lt;/strong&gt;).&lt;/p&gt;
&lt;p&gt;Remettre &lt;strong&gt;test_partage_vmdk_1&lt;/strong&gt; sous tension.&lt;/p&gt;
&lt;h2 id="ajout-des-disques-virtuels-sur-la-deuxième-machine-virtuelle"&gt;Ajout des disques virtuels sur la deuxième machine virtuelle
&lt;/h2&gt;&lt;p&gt;Ouvrir les paramètres de la machine virtuelle &lt;strong&gt;test_partage_vmdk_2&lt;/strong&gt;, ajouter un nouveau périphérique (Disque dur) puis sélectionner « Utiliser un disque virtuel déjà configuré ».&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/01/vmdk_partage6.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Sélectionner le premier disque créé précédemment.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/01/vmdk_partage7.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;De la même manière que précédemment, on doit créer un disque dur virtuel sur un nouveau contrôleur SCSI et en mode &lt;strong&gt;Indépendant-Persistant&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/01/vmdk_partage8.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Modifier le nouveau contrôleur SCSI comme précédemment :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/01/vmdk_partage9.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Ajouter enfin le second disque de la même manière à l’adresse SCSI (1:1).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/01/vmdk_partage101.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Valider et mettre la machine virtuelle sous tension. Si elle boot correctement c’est que le partage fonctionne.&lt;/p&gt;
&lt;h2 id="créer-le-miroir-lvm-partagé"&gt;Créer le miroir LVM partagé
&lt;/h2&gt;&lt;p&gt;Sur &lt;strong&gt;les deux&lt;/strong&gt; serveurs, exécuter les commandes suivantes :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;chkconfig acpid off #seulement pour RHCS
service acpid stop #seulement pour RHCS
vi /etc/lvm/lvm.conf
     filter = [ &amp;#34;a/.*/&amp;#34; ]
   #filter = [ &amp;#34;a|/dev/cciss/.*|&amp;#34;, &amp;#34;a|/dev/mpath.*|&amp;#34;, &amp;#34;r|.*|&amp;#34; ] #utiliser cette ligne en cas d’utilisation de multipath et de disques locaux présentés en tant que /dev/cciss. A adapter au contexte
[…]
volume_list = [ &amp;#34;vg01&amp;#34; , &amp;#34;@[TAG]&amp;#34; ]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Dans le cas de RedHat Cluster Suite, remplacer &lt;em&gt;[TAG]&lt;/em&gt; par le nom de la machine tel qu’il est définit dans le fichier /etc/cluster/cluster.conf.&lt;/p&gt;
&lt;p&gt;En dehors du cas d’un traitement automatisé par cluster, n’importe quel tag convient du moment qu’il est unique à la machine. Dans le cas présent, les tags choisis sont respectivement tag_vm1 et tag_vm2.&lt;/p&gt;
&lt;p&gt;Quelques précisions :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;filter&lt;/strong&gt; permet de traiter les cas où on doit ignorer certains disques. C’est typiquement nécessaire lorsque l’on utilise LVM avec multipath ou powerpath, car l’OS voit plusieurs « disques » sda ,sdb, &amp;hellip; pour un même disque mpath (1 sdX pour chaque chemin vers mpathY).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;volume_list&lt;/strong&gt; indique à LVM que seul le vg01 (interne) et les VG explicitement taggués avec le nom de la machine qui peuvent être utilisés. Cela permet de s’assurer qu’il n’y a qu’une seule machine qui peut activer le VG du moment qu’on n’ajoute jamais plus d’un tag au VG.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Même si les modifications du fichier lvm.conf sont prises en compte immédiatement, RedHat Cluster Suite impose une recompilation de l’initrd. Dans le cas d’un cluster RHCS, il faut donc lancer la commande suivante :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;mkinitrd -f /boot/initrd-$(uname -r).img $(uname -r)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Sur un seul nœud (le premier) :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;pvcreate /dev/sdb
pvcreate /dev/sdc
vgcreate -c n vg_mirror /dev/sdb /dev/sdc
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Tagger le VG pour pouvoir travailler dessus sur ce nœud.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;vgchange --addtag tag_vm1 -ay vg_mirror
lvcreate -n lv_mirror -m1 -l 5116 /dev/vg_mirror
Logical volume &amp;#34;lv_mirror&amp;#34; created
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Le journal des écritures doit lui aussi être en miroir&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;lvconvert --mirrorlog mirrored /dev/vg_mirror/lv_mirror
Logical volume lv_mirror converted.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Il est enfin possible de formater le disque, et de le monter sur le &lt;strong&gt;test_partage_vmdk_1&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;mkfs.ext3 /dev/vg_mirror/lv_mirror
mount /dev/vg_mirror/lv_mirror /mnt
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="tester-la-bascule"&gt;Tester la bascule
&lt;/h2&gt;&lt;p&gt;Scanner les VGs pour vérifier que le nouveau VG est bien disponible sur le &lt;strong&gt;test_partage_vmdk_2&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;vgscan
vgs
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Même s’il le VG est visible, il n’est pas possible de le monter car il n’a pas le bon tag (tel que spécifié dans le lvm.conf). Cela permet de vérifier que l’on ne pourra pas écrire sur les disques sur les deux nœuds en même temps.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Not activating vg_mirror/lv_mirror since it does not pass activation filter.
0 logical volume(s) in volume group “vg_mirror” now active
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;On peut démonter le FS, désactiver le vg et enlever le tag sur le serveur &lt;strong&gt;test_partage_vmdk_1&lt;/strong&gt; et vérifier qu’on peut bien le monter et écrire dessus sur le &lt;strong&gt;test_partage_vmdk_2&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Ce comportement est automatique sous RedHat Cluster Suite, qui gère lui même les tags lors de la bascule d’un VG/LV.&lt;/p&gt;
&lt;p&gt;Sur &lt;strong&gt;test_partage_vmdk_1&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;umount /mnt
vgchange --deltag tag_vm1 -an vg_mirror
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Sur &lt;strong&gt;test_partage_vmdk_2&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;vgchange --addtag tag_vm1 -ay vg_mirror
mount /dev/vg_mirror/lv_mirror /mnt
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Have fun&lt;/strong&gt;&lt;/p&gt;</description></item></channel></rss>