Définitions pour RabbitMQ

Le fichier de définitions permet de déclarer les principaux éléments d’un serveur RabbitMQ.

Il peut être pris en compte au démarrage ou importé a posteriori.

Virtual hosts

  "vhosts": [
    {
      "limits": [],
      "metadata": {
        "description": "Virtual host for jtips examples",
        "tags": []
      },
      "name": "/jtips"
    }
  ]

Queues et exchanges

Queues

Les types de queues peuvent être classic, en mono-noeud ou quorum en distribué, ainsi que stream.

  "queues": [
    {
      "name": "q.activity.AB",
      "type": "classic",
      "durable": true,
      "vhost": "/jtips"
    },
    {
      "name": "q.segment",
      "type": "stream",
      "arguments": {
        "x-queue-type": "stream"
      },
      "durable": true,
      "vhost": "/jtips"
    }
  ]

Référence:

Exchanges

Les types d'exchanges peuvent être direct, topic ou fanout.

  "exchanges": [
    {
      "name": "x.segment",
      "type": "topic",
      "auto_delete": false,
      "durable": true,
      "vhost": "/jtips"
    },
    {
      "name": "x.activity.ride",
      "type": "topic",
      "auto_delete": false,
      "durable": true,
      "vhost": "/jtips"
    }
  ]

Bindings

  "bindings": [
    {
      "source": "x.segment",
      "destination": "q.segment",
      "destination_type": "queue",
      "routing_key": "#",
      "vhost": "/jtips"
    },
    {
      "source": "x.activity",
      "destination": "q.activity.ride",
      "destination_type": "queue",
      "routing_key": "ride",
      "vhost": "/jtips"
    }
  ]

Users et permissions

Utilisateurs

Pour chaque utilisateur, le mot de passe est digéré. Ça peut être fait avec rabbitmqctl et sa commande hash_password.

$ rabbitmqctl hash_password adminpwd
Will hash password adminpwd
NYvHheVKOpEzhHTrugfvr1PpmA0Hb6SAMXHWRnFD9uO5xdsW
  "users": [
    {
      "name": "admin",
      "password_hash": "NYvHheVKOpEzhHTrugfvr1PpmA0Hb6SAMXHWRnFD9uO5xdsW",
      "tags": [
        "administrator"
      ]
    },
    {
      "name": "varko",
      "password_hash": "VUKoAxZoyVAhC2vJZZPpa+U1dUTGoCW1L52WHq8tJINtduzs",
      "tags": []
    }
  ]

Permissions

Pour chaque utilisateur, on peut définir les queues et exchanges auquels il a accès, en lecture / écriture et pour configuration. Ça se fait par des expressions régulières.

Dans l’exemple ci-dessous, l’utilisateur admin a tous les accès, du moins pour le virtual host /, alors que l’utilisateur gateway a un accès limité.

  "permissions": [
    {
      "user": "admin",
      "vhost": "/jtips",
      "read": ".",
      "write": ".",
      "configure": "."
    },
    {
      "user": "varko",
      "vhost": "/jtips",
      "read": "(q\.segment|x\.activity\..)",
      "write": "(q\.segment|q\.activity\..|x\.client\..|x\.activity\..)",
      "configure": "(q\.segment|q\.client\..|x\.client\..|x\.user\..)"
    }
  ],

  "topic_permissions": [
    {
      "user": "varko",
      "vhost": "/jtips",
      "exchange": "x\.activity\.ABC",
      "read": ".",
      "write": "."
    }
  ]

Les topic permissions servent uniquement pour les exchanges de type topic. Elles doivent être vues comme une surcouche aux permissions classique et non un remplacement.

Dans cette partie, le nom de l'exchange est complet, sans caractère joker ou regex. Les parties read et write acceptent les expressions régulières. Il n’y a pas de configure.

Import / Export

Au démarrage

# /etc/rabbitmq/conf.d/20-definitions.conf ou /etc/rabbitmq/rabbitmq.conf
load_definitions = /etc/rabbitmq/definitions.json

Sans le plugin de management

rabbitmqctl export_definitions /etc/rabbitmq/definitions-export.json
# ou
rabbitmqctl export_definitions -
rabbitmqctl import_definitions /etc/rabbitmq/definitions.json

Avec le plugin de management

rabbitmqadmin export
# ou
curl --user admin:adminpwd --request GET http://localhost:15672/api/definitions
rabbitmqadmin import /etc/rabbitmq/definitions.json
# ou
curl --user admin:adminpwd                                \
     --header "Content-Type: application/json"            \
     --upload-file /etc/rabbitmq/definitions.json         \
     --request POST http://localhost:15672/api/definitions