Comment utiliser Ansible pour configurer un cluster Elasticsearch de production

introduction

Dans ce didacticiel, nous allons vous montrer comment utiliser Ansible, un outil de gestion de la configuration, pour installer un cluster de production Elasticsearch sur Ubuntu 14.04 ou CentOS 7 dans un environnement de serveur Cloud. Nous allons tirer parti de la Comment utiliser Ansible et Tinc VPN pour sécuriser votre infrastructure de serveur pour vous assurer que vos nœuds Elasticsearch seront sécurisés à partir d’ordinateurs situés en dehors de votre propre réseau.

Elasticsearch est un serveur de recherche open source populaire utilisé pour la recherche distribuée en temps réel et l’analyse de données. Lorsqu’il est utilisé pour autre chose que le développement, Elasticsearch doit être déployé sur plusieurs serveurs en tant que cluster, pour des performances, une stabilité et une évolutivité optimales.

Conditions préalables

Vous devez disposer d’au moins trois serveurs Ubuntu 14.04 ou CentOS 7, avec réseau privé, pour pouvoir suivre ce didacticiel, car un cluster Elasticsearch doit comporter au moins trois nœuds éligibles au maître. Si vous souhaitez disposer de nœuds maîtres et de données dédiés, vous aurez besoin d’au moins 3 serveurs pour les nœuds maîtres et de serveurs supplémentaires pour tous les nœuds de données. Notez également que, si vous prévoyez d’utiliser la taille de segment de mémoire Elasticsearch par défaut de 2 Go, vos serveurs doivent disposer d’au moins 4 Go de mémoire.

Une fois vos serveurs obtenus, configurez-les de manière à utiliser un réseau VPN maillé avec ce didacticiel: https://www.digitalocean.com/community/tutorials/how-to-use-ansible-and-tinc-vpn-to-secure-your- server-infrastructure [Comment utiliser Ansible et Tinc VPN pour sécuriser votre infrastructure de serveur]. Assurez-vous que chaque serveur a un nom d’hôte d’inventaire Ansible unique.

Si vous utilisez un réseau privé, tel que DigitalOcean Private Networking, vos serveurs pourront communiquer de manière sécurisée avec d’autres serveurs du même compte ou de la même équipe dans la même région. Ceci est particulièrement important lors de l’utilisation d’Elasticsearch, car elle n’a pas de sécurité intégrée dans son interface HTTP.

Hypothèses

Nous supposerons que tous les serveurs que vous souhaitez utiliser en tant que nœuds Elasticsearch ont une interface VPN nommée «tun0», comme décrit dans le tutoriel lié ci-dessus. Sinon, et si vous préférez que vos nœuds ES écoutent sur une interface différente, vous devrez apporter les modifications appropriées dans le fichier + site.yml + du Playbook.

Nous supposerons également que votre Playbook se trouve dans un répertoire appelé + ansible-tinc + dans le répertoire de base de votre ordinateur local.

Téléchargez le Playbook ansible-elasticsearch

Elastic fournit un rôle Ansible qui peut être utilisé pour configurer facilement un cluster Elasticsearch. Pour l’utiliser, nous devons simplement l’ajouter à notre livre de jeu + ansible-tinc +, définir quelques groupes hôtes et attribuer les rôles appropriés à ces groupes. Encore une fois, si vous n’avez pas déjà suivi le didacticiel VPN préalable, vous pouvez le trouver à l’adresse https://www.digitalocean.com/community/tutorials/how-to-use-ansible-and-tinc-vpn-to-secure- votre-infrastructure-serveur [ici].

Tout d’abord, accédez au répertoire dans lequel se trouve votre Playbook Tinc Ansible:

cd ~/ansible-tinc

Ensuite, clonez le rôle + ansible-elasticsearch +, disponible sur le compte GitHub d’Elastic, dans le répertoire + roles + du Playbook:

cd roles
git clone https://github.com/elastic/ansible-elasticsearch

Renommez le rôle en “elasticsearch”:

mv ansible-elasticsearch elasticsearch

Mettre à jour site.yml

Éditons le fichier Playbook principal, + site.yml +, pour mapper trois rôles Elasticsearch différents vers trois groupes hôtes Ansible différents. Cela nous permettra de créer des nœuds Elasticsearch maîtres / données dédiés maîtres et données maîtres en ajoutant simplement des hôtes aux groupes appropriés.

Revenez dans le répertoire Ansible Playbook:

cd ~/ansible-playbook

Dans votre éditeur favori, éditez un nouveau fichier nommé + elasticsearch.yml +. Nous allons utiliser + vi +:

vi site.yml

Mapper le rôle du maître dédié Elasticsearch au groupe

En bas du fichier, mappez le rôle maître dédié + elasticsearch + au groupe + elasticsearch_master_nodes + en ajoutant ces lignes:

site.yml - Noeuds maîtres dédiés

- hosts: elasticsearch_master_nodes
 roles:
   - { role: elasticsearch, es_instance_name: "node1", es_config: { discovery.zen.ping.unicast.hosts: ", , ", network.host: "__, _local_", cluster.name: "production", discovery.zen.ping.multicast.enabled: false,  http.port: 9200, transport.tcp.port: 9300, node.data: false, node.master: true, bootstrap.mlockall: true } }
 vars:
   es_major_version: "2.x"
   es_version: "2.2.1"
   es_heap_size: ""
   es_cluster_name: "production"

Ce rôle créera des nœuds maîtres dédiés car il configure les nœuds avec les valeurs suivantes: + node.master: true + et + node.data: false +.

Veillez à mettre à jour les noms d’hôte mis en surbrillance dans la variable + discovery.zen.ping.unicast.hosts + pour qu’ils correspondent aux noms d’hôte d’inventaire Ansible (ou adresses IP VPN) de quelques-uns de vos serveurs Elasticsearch. Cela permettra à ces nœuds de découvrir le cluster Elasticsearch. Dans l’exemple, nous utilisons + node01 +, + node02 + et + node03 + car il s’agissait des noms d’hôte utilisés dans le tutoriel sur les VPN prérequis. De même, si votre interface VPN porte un nom autre que «tun0», mettez à jour la variable + network.host en conséquence.

Si vous souhaitez utiliser une version différente d’Elasticsearch, mettez à jour + es_version +. Notez que cette configuration ne fonctionnera pas pour les versions antérieures à 2.2 car les anciennes versions n’acceptent pas les listes délimitées par des virgules pour la variable + network.host +.

Mettez à jour + es_heap_size + avec une valeur correspondant à environ la moitié de la mémoire disponible de vos serveurs maîtres dédiés. Par exemple, si votre serveur dispose d’environ 4 Go d’espace libre, définissez la taille du segment de mémoire sur «2g».

Désormais, tous les hôtes appartenant au groupe + elasticsearch_master_nodes + Ansible seront configurés en tant que nœuds maîtres Elasticsearch dédiés.

Mappez le rôle Elasticsearch Master / Data au groupe

Au bas du fichier, mappez le rôle + elasticsearch + du maître et des données éligibles au groupe + elasticsearch_master_data_nodes + en ajoutant ces lignes:

site.yml - Noeuds de données / maîtres éligibles

- hosts: elasticsearch_master_data_nodes
 roles:
   - { role: elasticsearch, es_instance_name: "node1", es_config: { discovery.zen.ping.unicast.hosts: ", , ", network.host: "__, _local_", cluster.name: "production", discovery.zen.ping.multicast.enabled: false, http.port: 9200, transport.tcp.port: 9300, node.data: true, node.master: true, bootstrap.mlockall: true } }
 vars:
   es_major_version: "2.x"
   es_version: "2.2.1"
   es_heap_size: ""
   es_cluster_name: "production"

Ce rôle créera des noeuds de données éligibles au maître, car il configure les noeuds avec les valeurs suivantes: + node.master: true + et + node.data: true +.

Veillez à mettre à jour les noms d’hôte mis en surbrillance dans la variable + discovery.zen.ping.unicast.hosts + pour qu’ils correspondent aux noms d’hôte d’inventaire Ansible (ou adresses IP VPN) de quelques-uns de vos serveurs Elasticsearch. De plus, si votre interface VPN porte un nom autre que «tun0», mettez à jour la variable + network.host + en conséquence.

Définissez + es_version + sur la même valeur que celle que vous avez utilisée pour le rôle de maître dédié.

Mettez à jour + es_heap_size + avec une valeur représentant à peu près la moitié de la mémoire disponible de vos serveurs / serveurs de données éligibles au maître.

Désormais, tous les hôtes appartenant au groupe + elasticsearch_master_data_nodes + Ansible seront configurés en tant que nœuds de données éligibles au maître.

Mappez le rôle de données dédiées Elasticsearch au groupe

En bas du fichier, mappez le rôle de données dédié + elasticsearch + au groupe + elasticsearch_data_nodes + en ajoutant ces lignes:

site.yml - Noeuds de données dédiés

- hosts: elasticsearch_data_nodes
 roles:
   - { role: elasticsearch, es_instance_name: "node1", es_config: { discovery.zen.ping.unicast.hosts: ", , ", network.host: "__, _local_", cluster.name: "production", discovery.zen.ping.multicast.enabled: false, http.port: 9200, transport.tcp.port: 9300, node.data: true, node.master: false, bootstrap.mlockall: true } }
 vars:
   es_major_version: "2.x"
   es_version: "2.2.1"
   es_heap_size: ""
   es_cluster_name: "production"

Ce rôle créera des nœuds de données dédiés car il configure les nœuds avec les valeurs suivantes: + node.master: false + et + node.data: true +.

Veillez à mettre à jour les noms d’hôte mis en surbrillance dans la variable + discovery.zen.ping.unicast.hosts + pour qu’ils correspondent aux noms d’hôte d’inventaire Ansible (ou adresses IP VPN) de quelques-uns de vos serveurs Elasticsearch. De plus, si votre interface VPN porte un nom autre que «tun0», mettez à jour la variable + network.host + en conséquence.

Définissez + es_version + sur la même valeur que celle utilisée dans les rôles précédents.

Mettez à jour + es_heap_size + avec une valeur correspondant à environ la moitié de la mémoire disponible de vos serveurs de données dédiés.

Désormais, tous les hôtes appartenant au groupe + elasticsearch_data_nodes + Ansible seront configurés en tant que nœuds de données Elasticsearch dédiés.

Sauvegarder et quitter

Maintenant que vous avez défini les trois rôles et les avez mappés sur des groupes d’hôtes, vous pouvez enregistrer et quitter + site.yml +.

N’hésitez pas à ajouter ultérieurement des rôles Elasticsearch et des mappages de groupes d’hôtes.

Mettre à jour le fichier d’inventaire de l’hôte

Maintenant que les nouveaux rôles Elasticsearch ont été mappés sur des groupes d’hôtes, vous pouvez créer différents types de nœuds Elasticsearch en ajoutant simplement les hôtes aux groupes d’hôtes appropriés.

Editez le fichier d’inventaire Ansible + hosts +:

vi hosts

Si vous avez suivi le didacticiel préalable, votre fichier doit ressembler à ceci (avec les noms d’hôte et les adresses IP de votre serveur):

Inventaire des hôtes Ansible - Fichier d’origine

[vpn]
node01 vpn_ip=10.0.0.1 ansible_host=45.55.41.106
node02 vpn_ip=10.0.0.2 ansible_host=159.203.104.93
node03 vpn_ip=10.0.0.3 ansible_host=159.203.104.127
node04 vpn_ip=10.0.0.4 ansible_host=159.203.104.129

[removevpn]

Ajoutez maintenant trois groupes correspondant aux mappages que nous avons définis dans + site.yml +.

Inventaire des hôtes Ansible - Groupes Elasticsearch

[elasticsearch_master_nodes]

[elasticsearch_master_data_nodes]

[elasticsearch_data_nodes]

Répartissez maintenant vos hôtes Elasticsearch parmi les nouveaux groupes d’hôtes, en fonction des types de nœuds Elasticsearch dont vous souhaitez que votre cluster se compose. Par exemple, si vous souhaitez trois nœuds maîtres dédiés et un seul nœud de données dédié, votre fichier d’inventaire ressemblera à ceci:

Inventaire des hôtes Ansible - Exemple complet

[vpn]
node01 vpn_ip=10.0.0.1 ansible_host=45.55.41.106
node02 vpn_ip=10.0.0.2 ansible_host=159.203.104.93
node03 vpn_ip=10.0.0.3 ansible_host=159.203.104.127
node04 vpn_ip=10.0.0.4 ansible_host=159.203.104.129

[removevpn]

[elasticsearch_master_nodes]
node01
node02
node03

[elasticsearch_master_data_nodes]

[elasticsearch_data_nodes]
node04

Une fois que votre fichier d’inventaire reflète votre configuration Elasticsearch (et VPN) souhaitée, enregistrez et quittez.

Créer un cluster Elasticsearch

Maintenant que + site.yml + et + hôtes + sont configurés, vous êtes prêt à créer votre cluster Elasticsearch en exécutant le Playbook.

Exécutez le Playbook avec cette commande:

ansible-playbook site.yml

Une fois le Playbook terminé, votre cluster Elasticsearch doit être opérationnel. La prochaine étape consiste à vérifier que tout fonctionne correctement.

Vérifier le statut du cluster Elasticsearch

À partir de l’un de vos serveurs Elasticsearch, exécutez cette commande pour imprimer l’état du cluster:

curl -XGET 'http://localhost:9200/_cluster/state?pretty'

Vous devriez voir une sortie indiquant qu’un cluster nommé «production» est en cours d’exécution. Il devrait également indiquer que tous les nœuds que vous avez configurés sont des membres:

Cluster State:{
 "cluster_name" : "production",
 "version" : 8,
 "state_uuid" : "SgTyn0vNTTu2rdKPrc6tkQ",
 "master_node" : "OzqMzte9RYWSXS6OkGhveA",
 "blocks" : { },
 "nodes" : {
   "OzqMzte9RYWSXS6OkGhveA" : {
     "name" : "node02-node1",
     "transport_address" : "10.0.0.2:9300",
     "attributes" : {
       "data" : "false",
       "master" : "true"
     }
   },
   "7bohaaYVTeeOHvSgBFp-2g" : {
     "name" : "node04-node1",
     "transport_address" : "10.0.0.4:9300",
     "attributes" : {
       "master" : "false"
     }
   },
   "cBat9IgPQwKU_DPF8L3Y1g" : {
     "name" : "node03-node1",
     "transport_address" : "10.0.0.3:9300",
     "attributes" : {
       "master" : "false"
     }
   },
...

Si vous voyez une sortie semblable à celle-ci, votre cluster Elasticsearch est en cours d’exécution! Si certains de vos nœuds sont manquants, examinez votre inventaire Ansible + hosts + pour vous assurer que vos groupes d’hôtes sont définis correctement.

Dépannage

Si vous obtenez + curl: (7) Échec de la connexion au port localhost 9200: connexion refusée +, Elasticsearch n’est pas en cours d’exécution sur ce serveur. Cela est généralement dû à des erreurs de configuration Elasticsearch dans le fichier + site.yml +, telles que des entrées incorrectes + network.host + ou + discovery.zen.ping.unicast.hosts +. En plus d’examiner ce fichier, vérifiez également les journaux Elasticsearch sur vos serveurs (+ / var / log / elasticsearch / -node1 / production.log +) pour obtenir des indices.

Si vous souhaitez voir un exemple du Playbook créé en suivant ce didacticiel, consultez this gitHub repository. Cela devrait vous aider à voir à quoi ressemble un fichier + site.yml + et + + hôtes + `fonctionnel.

Conclusion

Votre cluster Elasticsearch doit fonctionner dans un état sain et configuré avec quelques optimisations de base!

Elasticsearch propose de nombreuses autres options de configuration qui n’ont pas été abordées ici, telles que les paramètres d’index, de partition et de réplication. Il est recommandé de revoir votre configuration ultérieurement, ainsi que la documentation officielle, pour vous assurer que votre cluster est configuré pour répondre à vos besoins.

Related