<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>The Ops Community ⚙️: xavki</title>
    <description>The latest articles on The Ops Community ⚙️ by xavki (@xavki).</description>
    <link>https://community.ops.io/xavki</link>
    <image>
      <url>https://community.ops.io/images/OHsqwfbt_NIMZIdcVNbPZwf7rwGP23TrhnaDzv_PJ1k/rs:fill:90:90/g:sm/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL3Vz/ZXIvcHJvZmlsZV9p/bWFnZS8yMDI5LzRl/ZjFjY2ZiLTY0ODkt/NDdjMi05MTdiLTFi/ZWQ2NzllNjM2OS5w/bmc</url>
      <title>The Ops Community ⚙️: xavki</title>
      <link>https://community.ops.io/xavki</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://community.ops.io/feed/xavki"/>
    <language>en</language>
    <item>
      <title>Bridge, namespaces et vethernet comme docker0</title>
      <dc:creator>xavki</dc:creator>
      <pubDate>Wed, 19 Apr 2023 19:05:27 +0000</pubDate>
      <link>https://community.ops.io/xavki/bridge-namespaces-et-vethernet-comme-docker0-n4n</link>
      <guid>https://community.ops.io/xavki/bridge-namespaces-et-vethernet-comme-docker0-n4n</guid>
      <description>&lt;p&gt;Souvent quand on introduit docker, on le présente comme un outil qui utilise des fonctionnalités de Linux : les cgroups et les namespaces… Je sais je l’ai fait plusieurs fois sur la chaine Xavki. Bon c’est bien et ça buzz bien mais bon si on montre jamais comment ça marche on passe à côté d’un truc. Aujourd’hui on va comprendre comment docker simplifie les choses avec son bridge Docker0.&lt;/p&gt;

&lt;p&gt;Eh oui on va installer un bridge, 2 namespaces et 2 vethernets.&lt;/p&gt;

&lt;p&gt;Alors le but c’est de créer un script qui va nous permettre de créer la structure suivante :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://community.ops.io/images/CSVjA0RSJ-8hDw40Mo9qNtfQrOq9kM0MsN4eZRph5cw/w:800/mb:500000/ar:1/aHR0cHM6Ly94YXZr/aS5ibG9nL3dwLWNv/bnRlbnQvdXBsb2Fk/cy8yMDIzLzA0LzEx/LW5vcy1uYW1lc3Bh/Y2VzLTEwMjR4NTc2/LnBuZw" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ops.io/images/CSVjA0RSJ-8hDw40Mo9qNtfQrOq9kM0MsN4eZRph5cw/w:800/mb:500000/ar:1/aHR0cHM6Ly94YXZr/aS5ibG9nL3dwLWNv/bnRlbnQvdXBsb2Fk/cy8yMDIzLzA0LzEx/LW5vcy1uYW1lc3Bh/Y2VzLTEwMjR4NTc2/LnBuZw" alt="" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Et on va faire original, on va créer un bridge nommé Xavki0 !! La gloire éternel merci Linux !!&lt;/p&gt;

&lt;h2&gt;
  
  
  Première choses les variables de tout ce petit monde…
&lt;/h2&gt;

&lt;p&gt;Alors voici les variables que l’on définit dans la partie haute de notre script bash :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#!/usr/bin/bash

## Variables Namespace
NS1="x1"
NS2="x2"

## Variables vethernet
VETH1="xeth1"
VETH2="xeth2"

## Variables interface des conteneurs
VPEER1="xpeer1"
VPEER2="xpeer2"

# Variables ip des conteneurs
VPEER_ADDR1="10.11.0.10"
VPEER_ADDR2="10.11.0.20"

## Variables du bridge
BR_ADDR="10.11.0.1"
BR_DEV="xavki0"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Première chose les 2 namespaces x1 et x2 qui sont les deux boites isolées d’un point de vue réseau. Et c’est important, aujourd’hui on ne voit que l’isolation réseau. Donc on va considérer que cela pourrait s’apparenter à 2 conteneurs si on ne regarde que la partie réseau.&lt;/p&gt;

&lt;p&gt;Ensuite pour connecter ces deux namespaces à notre bridge, il faut un cable. Ce cable, il est virtuellement forcément, ce sont ce que l’on appelle des vethernets : xeth1 et xeth2.&lt;/p&gt;

&lt;p&gt;Et pour chaque namespace comme dans nos conteneurs, il nous faut une interface virtuelle les vpeers : xpeer1 et xpeer2.&lt;/p&gt;

&lt;p&gt;Pour chacune de ces interfaces, il nous faut une ip pour chaque : 10.11.0.10 et 10.11.0.20.&lt;/p&gt;

&lt;p&gt;Bon et enfin, il nous faut un bridge xavki0 et l’adresse de ce bridge, en l’occurence l’ip1 de notre cidr (range d’ip).&lt;/p&gt;

&lt;h2&gt;
  
  
  Maintenant créons tout ces éléments réseaux
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;## Création des namespaces
ip netns add $NS1
ip netns add $NS2

##Création des vethernet (cables) &amp;amp; interfaces
ip link add ${VETH1} type veth peer name ${VPEER1}
ip link add ${VETH2} type veth peer name ${VPEER2}

## Ajout des interfaces au namespace
ip link set ${VPEER1} netns ${NS1}
ip link set ${VPEER2} netns ${NS2}

## Activation des vethernet
ip link set ${VETH1} up
ip link set ${VETH2} up
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A noter particulièrement que pour la création des vethernets on précise le nim mais aussi les vpeers. nos fameuses interfaces vituelles de chaque namespace. Ensuite, on va ajouter ces vpeers à nos namespaces. Et enfin on va activer nos vethernet.&lt;/p&gt;

&lt;p&gt;Vous remarquerez que l’on a pas tout créé 😉&lt;/p&gt;

&lt;h2&gt;
  
  
  Ajout des ip dans les namespaces
&lt;/h2&gt;

&lt;p&gt;Alors pour l’instant c’est bien tout cela mais on a pas d’ip dans nos namespaces : ni loopback (127.0.0.1), ni nos fameuses ip définies dans nos variables au début. Bon ben go…&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;## Activation des interfaces dans les namespaces
ip netns exec ${NS1} ip link set lo up
ip netns exec ${NS2} ip link set lo up
ip netns exec ${NS1} ip link set ${VPEER1} up
ip netns exec ${NS2} ip link set ${VPEER2} up
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Et là vous voyez que notre commande ip avec son argument netns ne sert pas qu’à créer des namespaces… Non en fait elle permet de lancer les commandes de votre choix dans le contexte du namespace que vous allez préciser. On pourrait lancer un LS mais là on décide d’activer nos fameuses ip… Donc pour vérifier on pourrait passer un “ip a” plutôt que ip link set…&lt;/p&gt;

&lt;p&gt;Maintenant ces ip on va les attribuer à nos interfaces de chacun de nos namespaces :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;## Ajout des ip pour chaque interface
ip netns exec ${NS1} ip addr add ${VPEER_ADDR1}/16 dev ${VPEER1}
ip netns exec ${NS2} ip addr add ${VPEER_ADDR2}/16 dev ${VPEER2}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Et je dirais que classiquement on fait cela avec ‘ip addr add’ et le device en question. Remarquez aussi que l’on choisit ici de définir un masque /16.&lt;/p&gt;

&lt;h2&gt;
  
  
  Et notre bridge associé à nos namespaces ???
&lt;/h2&gt;

&lt;p&gt;Ah quand même on vient pour avoir un bridge et on l’a toujours pas créé. Alors voilà ce que l’on fait :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;## Création et activation du bridge
ip link add ${BR_DEV} type bridge
ip link set ${BR_DEV} up

## Ajout des vethernet au bridge
ip link set ${VETH1} master ${BR_DEV}
ip link set ${VETH2} master ${BR_DEV}

## Ajout de l'ip du bridge
ip addr add ${BR_ADDR}/16 dev ${BR_DEV}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On créé le bridge et on le rend up (active).&lt;/p&gt;

&lt;p&gt;On y branche nos deux câbles virtuels (souvenez vous ils sont déjà branchés de l’autre côté à l’interface de nos namespaces).&lt;/p&gt;

&lt;p&gt;Et ensuite on définit le CIDR ou range d’ip c’est à dire notre /16 et du coup l’ip qui sera attribué à ce bridge au niveau de notre host.&lt;/p&gt;

&lt;h2&gt;
  
  
  Router le traffic via le bridge
&lt;/h2&gt;

&lt;p&gt;Alors c’est bien d’avoir de IP, des vethernet et tout le bazard mais quand je suis dans un namespace je ne sait pas par où passer pour communiquer à l’extérieur… Et ien on va ajouter des routes dans nos namespaces et donc dans notre cas pour faire simple on va juste avoir des routes par défaut :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;## Ajout des routes poru chaque namespace pour passer par le bridge
ip netns exec ${NS1} ip route add default via ${BR_ADDR}
ip netns exec ${NS2} ip route add default via ${BR_ADDR}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Et pour accéder à internet !!! (à l’extérieur du host plutôt)&lt;/p&gt;

&lt;p&gt;Oui c’est toujours cette fameuse question : comment je fais pour accéder à internet.&lt;/p&gt;

&lt;p&gt;Et bien on va autoriser l’ip_forwarding au niveau de notre noyau linux. Et surtout on va utiliser iptables pour faire ce que l’on appelle un masquerade pour encapsuler nos paquets qui sortent et savoir dans quel namespace il doivent rentrer (par quelle interface plus précisément).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;## Accès externe
echo 1 &amp;gt; /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s ${BR_ADDR}/16 ! -o ${BR_DEV} -j MASQUERADE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Et bim c’est terminé !!! Tout le script &lt;a href="https://gitlab.com/xavki/docker-v2/-/blob/main/11-xavki-0/code.sh"&gt;est ici&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Voilà j’espère que cela a été assez clair. Vous avez bien sûr la vidéo. Et n’hésitez pas à faire connaître : le blog, la chaine et le podcast !!!&lt;/p&gt;

&lt;p&gt;L’article &lt;a href="https://xavki.blog/bridge-namespaces-et-vethernet-comme-docker0/"&gt;Bridge, namespaces et vethernet comme docker0&lt;/a&gt; est apparu en premier sur &lt;a href="https://xavki.blog"&gt;Xavki&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>docker</category>
      <category>linux</category>
      <category>network</category>
    </item>
    <item>
      <title>Premier pas avec Rabbitmq pour les débutants</title>
      <dc:creator>xavki</dc:creator>
      <pubDate>Fri, 09 Dec 2022 12:48:43 +0000</pubDate>
      <link>https://community.ops.io/xavki/premier-pas-avec-rabbitmq-pour-les-debutants-3d9c</link>
      <guid>https://community.ops.io/xavki/premier-pas-avec-rabbitmq-pour-les-debutants-3d9c</guid>
      <description>&lt;p&gt;Rabbitmq est l’une des solutions de message queue les plus connues au niveau mondial. Sa simplicité d’installation et de compréhension le rend très facile à déployer et mettre en place en entreprise.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://community.ops.io/images/0XdomgNyKzN8qpTCptzCCW-U3d94i3_3zOUp2J4vXgc/w:800/mb:500000/ar:1/aHR0cHM6Ly94YXZr/aS5ibG9nL3dwLWNv/bnRlbnQvdXBsb2Fk/cy8yMDIyLzEyL3dh/bGxoYXZlbi0zazVn/eHktMTAyNHg2NDAu/anBn" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ops.io/images/0XdomgNyKzN8qpTCptzCCW-U3d94i3_3zOUp2J4vXgc/w:800/mb:500000/ar:1/aHR0cHM6Ly94YXZr/aS5ibG9nL3dwLWNv/bnRlbnQvdXBsb2Fk/cy8yMDIyLzEyL3dh/bGxoYXZlbi0zazVn/eHktMTAyNHg2NDAu/anBn" alt="" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Devenez un dompteur&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;de lapin !!!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Je vous propose une &lt;strong&gt;brève introduction à Rabbitmq&lt;/strong&gt; et vous pourrez continuer votre autoformation en consultant&lt;a href="https://xavki.blog/tutoriels-rabbitmq-pour-debuter/"&gt;la page regroupant l’ensemble des tutoriels.&lt;/a&gt; Et vous pourrez également retrouver les slides et codes proposés dans cette autoformation&lt;a href="https://gitlab.com/xavki/tutoriels-rabbitmq"&gt;ici sur gitlab&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Rabbitmq, c’est quoi ??
&lt;/h2&gt;

&lt;p&gt;Rabbitmq est une technologie qui a fait ses preuves. Créée en 2007, elle a fait l’objet de rachats par la suite pour finir par être rattachée à vmware.&lt;/p&gt;

&lt;p&gt;Son principe historique repose sur la connexion entre des producers et des consumers de messages. Historiquement, Rabbbimq utilise le &lt;a href="https://en.wikipedia.org/wiki/FIFO_(computing_and_electronics)"&gt;principe de First In First Out (FIFO)&lt;/a&gt;. Les messages sont donc consommés dans le même ordre d’où ils ont été produit (hors exception lors de quorum queues ou de sharding c’est à dire lorsque les messgaes sont déposés dans des queues partitionnées).&lt;/p&gt;

&lt;p&gt;L’explosion des infrastructures à base de microservices mais surtout la volonté de rendre les infrastructures asynchrones et permettant de scaler facilement (augmenter/diminuer sans délai le nombre de consumers ou de producers). de fait la possibilité d’accroitre facilement le nombre de ces instances, permet aussi de plus facilement réaliser leurs maintenances.&lt;/p&gt;

&lt;p&gt;Bien sûr, Rabbitmq lui-même est un système redondé et distribué, permettant aussi d’assurer facilement les upgrades et autres tâches à réaliser pour maintenir un cluster.&lt;/p&gt;

&lt;p&gt;En outre Rabbitmq permet de travailler avec plusieurs protocoles d’échanges de messages :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  * AMQP : Advanced Message Queuing Protocol (diff langages C/P)

  * STOMP : Streaming Text Oriented Message Protocol (sous TCP)

  * MQTT : Message Queuing Telemetry Transport (pub/sub léger, IoT)

  * HTTP : Hypertext Transfer Protocol
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Par ailleurs, comme tout bon outil opensource, il dispose d’une communauté. Vous pourrez facilement retrouver des informations sur les sites de questions réponses habituels : &lt;a href="https://stackoverflow.com/questions/tagged/rabbitmq"&gt;stackoverflow&lt;/a&gt; &amp;amp; &lt;a href="https://www.reddit.com/r/rabbitmq/"&gt;reddit&lt;/a&gt;. Ou encore, la communauté permet de développer des plugins permettant d’augmenter les cas d’usages et de facilité l’utilisation de l’application.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quelques notions, définitions et concepts avant de commencer
&lt;/h2&gt;

&lt;p&gt;Broker : serveur portant une instance rabbitmq au sein d’un cluster (ensemble de brokers)&lt;/p&gt;

&lt;p&gt;Consumer : consommateur de messages après connexion à une queue&lt;/p&gt;

&lt;p&gt;Messages : ordonnés ou non, sont composés de metadatas et de données&lt;/p&gt;

&lt;p&gt;Channel : élément permettant la connexion des producteurs pour recueillir les messages. Permet de gérer les connexions par multiplexage (plusieurs connexions en une).&lt;/p&gt;

&lt;p&gt;Exchange : recueille les messgaes de producteur et a la charge de les router suivant le type d”exchange et de binding. C’est le coeur de l’intelligence de la répartition des messages entrant vers les queues rabbitmq.&lt;/p&gt;

&lt;p&gt;Binding : connexion d’un exchange avec une queue.&lt;/p&gt;

&lt;p&gt;Queue : ensemble de message avec plus ou moins de haute disponibilité.&lt;/p&gt;

&lt;p&gt;Vhosts : il s’agit d’une couche logique permettant l’isolation de tous les objets au sein de rabbitmq (hormis les utilisateurs) et de gérer les droits et permissions.&lt;/p&gt;

&lt;p&gt;Routing key : élément du message pris en compte pour filtrer et router les messages au sein d’un exchange.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;En résumé :&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Producer &amp;gt; Channel &amp;gt; Exchange &amp;gt; Binding &amp;gt; Routing Key &amp;gt; Queue &amp;gt; Consumer&lt;/p&gt;

&lt;h2&gt;
  
  
  Comment installer son premier cluster Rabbitmq ?
&lt;/h2&gt;

&lt;p&gt;Pour notre exemple, nous partirons sur 3 serveurs (vm debian). Compte tenu du protocole d’élection de certains éléments permettant la haute disponibilité (comme les quorum queues), il est préférable de toujours avoir un nombre impair de brokers.&lt;/p&gt;

&lt;p&gt;Commençons par installer erlang (langage dans lequel est développé rabbitmq) et rabbitmq en fichier .deb.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt install erlang-nox
wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.9.13/rabbitmq-server_3.9.13-1_all.deb
sudo dpkg -i rabbitmq-server_3.9.13-1_all.deb
rabbitmq-plugins enable rabbitmq_management
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Et vous l’avez peut être remarqué, nous avons également installé un plugin rabbitmq_management qui va nous permettre d’administrer le cluster.&lt;/p&gt;

&lt;p&gt;Puis un à un sur chaque serveur nous allons ajouter un token d’identification de notre cluster alias le erlang cookie.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;echo "YOATBIGKDHUSBLUSTOAW" | sudo tee /var/lib/rabbitmq/.erlang.cookie
echo "listeners.tcp.1 = 0.0.0.0:5672" | sudo tee -a /etc/rabbitmq/rabbitmq.conf
echo "management.tcp.port = 15672" | sudo tee -a /etc/rabbitmq/rabbitmq.conf
systemctl restart rabbitmq-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nous en avons profité également pour permettre l’écoute sur toutes les interfaces réseau du port 5672 c’est le port de communication entre un client et rabbitmq. Et également sur le port 15672 qui est celui de l’interface graphique de rabbitmq.&lt;/p&gt;

&lt;p&gt;Pour les autres serveurs voici les commandes à lancer :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rabbitmqctl stop_app
rabbitmqctl join_cluster rabbit@rmq1
rabbitmqctl start_app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On stop le service rabbitmq au sein de erlang, on demande au serveur de rejoindre le premier serveur et on démarre l’instance de nouveau.&lt;/p&gt;

&lt;p&gt;Enfin pour vérifier la présence de nos brokers au sein du même cluster, nous pouvons lancer un cluster_status.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;rabbitmqctl cluster_status --formatter=json | jq -r .running_nodes[]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Et voilà notre premier cluster rabbitmq.&lt;/p&gt;

&lt;h2&gt;
  
  
  Créer notre premier utilisateur
&lt;/h2&gt;

&lt;p&gt;Tout simplement pour vérifier le bon fonctionnement de notre cluster, nous allons créer notre premier utilisateur :&lt;/p&gt;

&lt;p&gt;&lt;code&gt;rabbitmqctl add_user xavki password&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;rabbitmqctl set_permissions -p / xavki ".*" ".*" ".*"&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;rabbitmqctl set_user_tags xavki administrator&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Et voilà maintenant on à un user xavki avec les droits d’administration de notre cluster. Il ne reste plus qu’à se connecter avec votre navigateur : http://:15672&lt;/p&gt;
&lt;h2&gt;
  
  
  Et maintenant un cluster rabbitmq avec un provisionning Vagrant (Vagrantfile)
&lt;/h2&gt;

&lt;p&gt;Je ne vais pas commenter ici les fichiers en question mais nous en avons 2.&lt;/p&gt;



&lt;p&gt;D’une part le vagrantfile qui va permettre de provisionner les machines et d’autre part un script shell lancé par vagrant (cf dans le vagrantfile).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Vagrant.configure(2) do |config|

    # before you must install these plugins to speed up vagrant provisionning
  # vagrant plugin install vagrant-faster
  # vagrant plugin install vagrant-cachier

  config.cache.auto_detect = true
    # Set some variables
  etcHosts = ""
  rabbitmq = ""

  # Check ingress controller
  case ARGV[0]
    when "provision", "up"
    print "Do you want to install rabbitmq (yes/no) ?\n"
    rabbitmq = STDIN.gets.chomp
    print "\n"
  end

    # some settings for common server (not for haproxy)
  common = &amp;lt;&amp;lt;-SHELL
  sudo apt update -qq 2&amp;gt;&amp;amp;1 &amp;gt;/dev/null
  sudo apt install -y -qq curl git vim tree net-tools telnet git python3-pip sshpass nfs-common 2&amp;gt;&amp;amp;1 &amp;gt;/dev/null
  sed -i 's/ChallengeResponseAuthentication no/ChallengeResponseAuthentication yes/g' /etc/ssh/sshd_config
  sudo systemctl restart sshd
  SHELL

  config.vm.box = "debian/bullseye64"
  config.vm.box_url = "debian/bullseye"

    # set servers list and their parameters
    NODES = [
    { :hostname =&amp;gt; "rmq1", :ip =&amp;gt; "192.168.12.48", :cpus =&amp;gt; 2, :mem =&amp;gt; 2048, :type =&amp;gt; "rmq_leader" },
    { :hostname =&amp;gt; "rmq2", :ip =&amp;gt; "192.168.12.49", :cpus =&amp;gt; 2, :mem =&amp;gt; 2048, :type =&amp;gt; "rmq_follower" },
    { :hostname =&amp;gt; "rmq3", :ip =&amp;gt; "192.168.12.50", :cpus =&amp;gt; 2, :mem =&amp;gt; 2048, :type =&amp;gt; "rmq_follower" }
    ]

    # define /etc/hosts for all servers
  NODES.each do |node|
            etcHosts += "echo '" + node[:ip] + " " + node[:hostname] + "'&amp;gt;&amp;gt; /etc/hosts" + "\n"
    if node[:type] == "gitlab"
      etcHosts += "echo '" + node[:ip] + " " + gitlabUrl + " registry." + gitlabUrl + "' &amp;gt;&amp;gt; /etc/hosts" + "\n"
    end
  end #end NODES

    # run installation
  NODES.each do |node|
    config.vm.define node[:hostname] do |cfg|
            cfg.vm.hostname = node[:hostname]
      cfg.vm.network "private_network", ip: node[:ip]
      cfg.vm.provider "virtualbox" do |v|
                v.customize ["modifyvm", :id, "--cpus", node[:cpus] ]
        v.customize ["modifyvm", :id, "--memory", node[:mem] ]
        v.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
        v.customize ["modifyvm", :id, "--natdnsproxy1", "on"]
        v.customize ["modifyvm", :id, "--name", node[:hostname] ]
                v.customize ["modifyvm", :id, "--ioapic", "on"]
        v.customize ["modifyvm", :id, "--nictype1", "virtio"]
      end #end provider

            #for all
      cfg.vm.provision :shell, :inline =&amp;gt; etcHosts
            cfg.vm.provision :shell, :inline =&amp;gt; common

      if rabbitmq == "yes"
        if node[:type] == "rmq_leader"
          cfg.vm.provision :shell, :path =&amp;gt; "install_rabbitmq.sh", :args =&amp;gt; "leader"
              end

        if node[:type] == "rmq_follower"
          cfg.vm.provision :shell, :path =&amp;gt; "install_rabbitmq.sh", :args =&amp;gt; "follower"
              end
            end

    end # end config
  end # end nodes

end 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Maintenant le script bash d’installation de rabbitmq install_rabbitmq.sh :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#!/bin/bash

## install rabbitmq

IP=$(hostname -I | awk '{print $2}')
echo "START - install rabbitmq "$IP

echo "[1]: install erlang-nox &amp;amp; utils"
apt-get update -qq &amp;gt;/dev/null
apt-get install -qq -y wget unzip dnsutils erlang-nox &amp;gt;/dev/null

echo "[2]: install rabbitmq"
wget -q https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.9.13/rabbitmq-server_3.9.13-1_all.deb
dpkg -i rabbitmq-server_3.9.13-1_all.deb

echo "[3]: minimal configuration"
rabbitmq-plugins enable rabbitmq_management
echo "YOATBIGKDHUSBLUSTOAW" | sudo tee /var/lib/rabbitmq/.erlang.cookie
echo "listeners.tcp.1 = 0.0.0.0:5672" | sudo tee -a /etc/rabbitmq/rabbitmq.conf
echo "management.tcp.port = 15672" | sudo tee -a /etc/rabbitmq/rabbitmq.conf
systemctl restart rabbitmq-server

if [["$1" == "leader"]]; then
echo "[4]: define default user"
rabbitmqctl add_user xavki password
rabbitmqctl set_permissions -p / xavki ".*" ".*" ".*"
rabbitmqctl set_user_tags xavki administrator
rabbitmqctl delete_user guest
fi

if [["$1" == "follower"]]; then
echo "[4]: join leader"
rabbitmqctl stop_app
rabbitmqctl join_cluster rabbit@rmq1
rabbitmqctl start_app
fi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Et donc un petit coup de vagrant up et vous aurez un clsuter rabbitmq à la sortie. Idéal pour faire des tests et se former je trouve.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Si tout cela vous a plus et si vous voulez m’aider, vous pouvez liker, partager et commenter les vidéos. Ou simplement un petit coup de main pour faire connaître la chaine Xavki au plus grand nombre (à la machine à café, autour d’une bière ou autr&lt;/strong&gt;e…).&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Prenez plaisir et apprenons ensemble.&lt;/p&gt;

&lt;p&gt;L’article &lt;a href="https://xavki.blog/premier-pas-avec-rabbitmq-pour-les-debutants/"&gt;Premier pas avec Rabbitmq pour les débutants&lt;/a&gt; est apparu en premier sur &lt;a href="https://xavki.blog"&gt;Xavki&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>rabbitmq</category>
    </item>
  </channel>
</rss>
