<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Curator on Zwindler's Reflection</title><link>https://blog.zwindler.fr/tags/curator/</link><description>Recent content in Curator 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, 11 Dec 2018 12:45:39 +0000</lastBuildDate><atom:link href="https://blog.zwindler.fr/tags/curator/index.xml" rel="self" type="application/rss+xml"/><item><title>Gérez vos sauvegardes ElasticSearch avec Curator</title><link>https://blog.zwindler.fr/2018/12/11/gerez-vos-sauvegardes-elasticsearch-avec-curator/</link><pubDate>Tue, 11 Dec 2018 12:45:39 +0000</pubDate><guid>https://blog.zwindler.fr/2018/12/11/gerez-vos-sauvegardes-elasticsearch-avec-curator/</guid><description>&lt;img src="https://blog.zwindler.fr/2017/10/elastic_3.webp" alt="Featured image of post Gérez vos sauvegardes ElasticSearch avec Curator" /&gt;&lt;h2 id="curator-et-elasticsearch"&gt;Curator et Elasticsearch
&lt;/h2&gt;&lt;p&gt;Il y a quelques mois, j’ai écris un article pour parler de mon expérience &lt;a class="link" href="https://blog.zwindler.fr/2018/07/04/sauvegarder-et-restaurer-des-index-dans-elasticsearch/" &gt;« supprime tes données dans ton cluster Elasticsearch par erreur »&lt;/a&gt;. Et par conséquent, &lt;a class="link" href="https://blog.zwindler.fr/2018/07/04/sauvegarder-et-restaurer-des-index-dans-elasticsearch/" &gt;de la sauvegarde que j’avais mis en place&lt;/a&gt; pour éviter de se retrouver sans rien en cas de récidive ;-).&lt;/p&gt;
&lt;p&gt;Le moins qu’on puisse dire, c’est que l’utilisation des API pour une opération aussi régulière qu’une sauvegarde (ou la suppression des vieux index, par exemple) est quelque chose d’assez lourd à mettre en place.&lt;/p&gt;
&lt;p&gt;Un des lecteurs avait pris le temps de me conseiller un outil fourni par les gens de chez Elastic, et qui permet de gérer plus simplement ces tâches fastidieuses : &lt;a class="link" href="https://www.elastic.co/guide/en/elasticsearch/client/curator/current/index.html" target="_blank" rel="noopener"
&gt;Curator&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="prérequis-côté-serveur"&gt;Prérequis côté serveur
&lt;/h2&gt;&lt;p&gt;J’avais donc dis que je regarderai et j’ai donc profité d’un de mes clusters ElasticSearch sur Kubernetes pour tester l’outil.&lt;/p&gt;
&lt;p&gt;La première chose à faire est donc de récupérer l’adresse IP (ou le nom DNS) qui nous permet d’accéder à l’API web de notre cluster ElasticSearch. Pour rester cohérent avec l’exemple, je vais dérouler la procédure de mise en place d’une sauvegarde avec &lt;strong&gt;Curator&lt;/strong&gt; dans un cluster Kubernetes qui contient un cluster ElasticSearch existant (ça ne complique pas beaucoup). Mais dans tout les cas il vous faudra une adresse ;-).&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl --context=andromeda --namespace=elastic get svc elasticsearch
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
elasticsearch ClusterIP 10.10.10.15 9200/TCP,9300/TCP 115d
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;En se connectant dans le container Elastic, je peux regarder comment est configuré la base, et en particulier les destinations physiques « repo ».&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl --context=andromeda --namespace=elastic exec -it docker-elasticsearch-0 /bin/bash
cat /opt/elasticsearch/config/elasticsearch.yml
[...]
path:
data: ${ELASTICSEARTCH_DATA_DIR}/data
logs: ${ELASTICSEARTCH_DATA_DIR}/logs
repo: ${REPO_LOCATIONS}
[...]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Dans le cas d’ElasticSearch en tant que container Docker, il existe dans l’image Docker officielle une variable &lt;strong&gt;REPO_LOCATIONS&lt;/strong&gt;. Dans mon cas, j’ai donc modifié la configuration de mon déploiement pour spécifier à ElasticSearch où trouver les variables.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[...]
- env:
- name: REPO_LOCATIONS
value: &amp;#39;[&amp;#34;/data/bkp&amp;#34;]&amp;#39;
[...]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Pour ceux qui n’utilisent pas Elasticsearch en tant que cluster Docker (&lt;a class="link" href="https://blog.zwindler.fr/2017/10/03/elasticstack-kibana-elasticsearch-logstash-beats/" &gt;si vous l’avez installé avec un de mes playbooks Ansible par exemple&lt;/a&gt;), vous pouvez éditer le fichier de configuration et ajouter les lignes suivantes (et vous assurer que le chemin existe effectivement) :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sudo vim /etc/elasticsearch/elasticsearch.yml
[...]
path:
repo: [&amp;#34;/my/backup/directory/path&amp;#34;]
[...]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Redémarrer ElasticSearch pour prise en compte (ou &lt;em&gt;deletez&lt;/em&gt; le pod, niark niark niark). Notre base ElasticSearch sait maintenant où déposer les futures sauvegardes.&lt;/p&gt;
&lt;h2 id="prérequis-côté-client"&gt;Prérequis côté client
&lt;/h2&gt;&lt;p&gt;Lancer un curl sur l’adresse IP que vous avez collecter au début du tuto, pour voir si on arrive à lister les indices présents.&lt;/p&gt;
&lt;p&gt;Dans mon cas, je lance un container Ubuntu directement dans le cluster K8s pour faire simple.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl --context=andromeda run my-shell --rm -i --tty --image ubuntu -- bash
#install prerequisites for curl
apt-get update
apt-get -y install curl
#do the actual curl
curl -X GET &amp;#34;10.10.10.15:9200/_cat/indices?v&amp;#34;
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
yellow open awesomeapp-health-2018.11.30 6VrEZk-XTGm3eeKJEzDZnA 5 1 17054 0 2mb 2mb
[...]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;OK ! On a bien accès à l’API. On peut maintenant configurer la variable d’environnement REPO_LOCATIONS&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;curl -XPUT &amp;#39;http://10.10.10.15:9200/_snapshot/svg&amp;#39; -H &amp;#39;Content-Type: application/json&amp;#39; -d &amp;#39;{
&amp;#34;type&amp;#34;: &amp;#34;fs&amp;#34;,
&amp;#34;settings&amp;#34;: {
&amp;#34;location&amp;#34;: &amp;#34;/data/bkp&amp;#34;,
&amp;#34;compress&amp;#34;: true
}
}&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Cette commande devrait vous renvoyer ceci :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;{&amp;#34;acknowledged&amp;#34;:true}
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="et-maintenant-"&gt;Et maintenant ?
&lt;/h2&gt;&lt;p&gt;Cette partie du tuto était identique (à Kubernetes près) au tutoriel précédent. Maintenant, ça diffère.&lt;/p&gt;
&lt;p&gt;On va installer &lt;strong&gt;Curator&lt;/strong&gt;, mais pas via le gestionnaire de package du système. En effet, si vous avez une version récente d’ElasticSearch et que vous vous contentez d’APT, vous risquez d’obtenir l’erreur suivante :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;apt-get install elasticsearch-curator
curator_cli show_indices
elasticsearch.exceptions.ElasticsearchException: Unable to create client connection to Elasticsearch. Error: Elasticsearch version 6.3.0 incompatible with this version of Curator (5.2.0)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;La version conseillée par Elastic est l’utilisation du gestionnaire de package Python (pip) :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;apt-get update
apt-get -y install curl python
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python get-pip.py --force-reinstall
pip install elasticsearch-curator --user
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Dans ce tutoriel, on va commencer par utiliser la CLI de &lt;strong&gt;Curator&lt;/strong&gt;. Mais il faut savoir qu’il existe aussi une version qui permet de jouer des scenarii prédéfinis (les &lt;strong&gt;Actions&lt;/strong&gt;). Du coup, il est logique que tout la partie connexion et authentification soit gérée par un fichier de configuration. Malheureusement, cette partie n’est pas super bien documentée si on se contente de la doc d’install (il faut fouiller un peu). Dans les grandes lignes, voilà ce qu’il faut faire :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;mkdir ~/.curator
cat &amp;gt; ~/.curator/curator.yml &amp;lt;&amp;lt; EOF
client:
hosts: 10.10.10.15
port: 9200
url_prefix:
use_ssl: False
certificate:
client_cert:
client_key:
ssl_no_validate: False
http_auth:
timeout: 30
master_only: False
logging:
loglevel: INFO
logfile: /data
logformat: default
blacklist: [&amp;#39;elasticsearch&amp;#39;, &amp;#39;urllib3&amp;#39;]
EOF
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ici, j’ai juste ajouté mon IP et mon port de connexion à l’API, mais on peut donc aussi configurer pas mal de choses en plus.&lt;/p&gt;
&lt;p&gt;Curator maintenant configuré, on peut tester la même commande qu’avec le cURL pour lister les indices.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;/root/.local/bin/curator_cli show_indices
awesomeapp-health-2018.11.12
awesomeapp-health-2018.11.13
awesomeapp-health-2018.11.14
[...]
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="création-dun-snapshot"&gt;Création d’un snapshot
&lt;/h2&gt;&lt;p&gt;Maintenant qu’on a &lt;strong&gt;Curator&lt;/strong&gt; qui peut se connecter à ElasticSearch, on va enfin pouvoir lancer notre sauvegarde, via la feature des snapshots ! (Plus d’info sur les filtres, vous pouvez aller sur &lt;a class="link" href="https://www.elastic.co/guide/en/elasticsearch/client/curator/current/singleton-cli.html" target="_blank" rel="noopener"
&gt;la page de documentation officielle&lt;/a&gt;)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;root/.local/bin/curator_cli snapshot --repository svg --filter_list &amp;#39;{&amp;#34;filtertype&amp;#34;:&amp;#34;none&amp;#34;}&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;La commande devrait prendre un certain temps, en particulier si vous avez beaucoup de données. Une fois qu’elle a rendu la main, vérifiez que le snapshot existe, avec la CLI, et en allant voir le contenu du dossier configuré précédemment.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;root/.local/bin/curator_cli show_snapshots --repository svg
curator-20181204095300
ll /data/bck
total 36
drwxr-xr-x 3 elasticsearch elasticsearch 4096 Dec 4 09:54 ./
drwxr-xr-x 6 elasticsearch elasticsearch 4096 Dec 4 09:47 ../
-rw-r--r-- 1 elasticsearch elasticsearch 29 Dec 4 09:54 incompatible-snapshots
-rw-r--r-- 1 elasticsearch elasticsearch 5522 Dec 4 09:54 index-0
-rw-r--r-- 1 elasticsearch elasticsearch 8 Dec 4 09:54 index.latest
drwxr-xr-x 56 elasticsearch elasticsearch 4096 Dec 4 09:53 indices/
-rw-r--r-- 1 elasticsearch elasticsearch 103 Dec 4 09:53 meta-yMBl9IsPRYGCitWqGjxh2Q.dat
-rw-r--r-- 1 elasticsearch elasticsearch 470 Dec 4 09:54 snap-yMBl9IsPRYGCitWqGjxh2Q.dat
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="je-suis-expert-en-sauvegarde-moi-pas-en-restauration"&gt;Je suis expert en sauvegarde moi, pas en restauration&amp;hellip;
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;True story&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Bon, sauvegarder c’est bien, restaurer c’est mieux ! Il existe bien évidemment une commande restore pour ça ;)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;root/.local/bin/curator_cli restore --repository svg --name curator-20181204095300 --filter_list &amp;#39;{&amp;#34;filtertype&amp;#34;:&amp;#34;none&amp;#34;}&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="et-après-"&gt;Et après !
&lt;/h2&gt;&lt;p&gt;Clairement, on ne va pas se contenter de ça. C’est déjà mieux que précédemment avec les appels d’API, mais on peut faire encore mieux. Déjà, si vous avez fait attention, j’ai teasé qu’on pouvait gérer les indices (et ainsi virer les plus vieux) avec &lt;strong&gt;Curator&lt;/strong&gt;. C’est clairement un usecase hyper sympa de l’outil.&lt;/p&gt;
&lt;p&gt;Ensuite, j’ai également teasé la possibilité de gérer des tâches en mode batch, avec les actions, qui sont des fichiers de définition simple de vos actions à faire avec &lt;strong&gt;Curator&lt;/strong&gt;. Il y aura bien entendu des articles à suivre pour en apprendre plus ;-)&lt;/p&gt;
&lt;h2 id="ressources-additionnelles"&gt;Ressources additionnelles
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.elastic.co/guide/en/elasticsearch/reference/current/_list_all_indices.html" target="_blank" rel="noopener"
&gt;www.elastic.co/guide/en/elasticsearch/reference/current/_list_all_indices.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://postmarkapp.com/blog/tools-we-use-curator-for-elasticsearch" target="_blank" rel="noopener"
&gt;postmarkapp.com/blog/tools-we-use-curator-for-elasticsearch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="http://ikeptwalking.com/taking-elasticsearch-snapshots-using-curator/" target="_blank" rel="noopener"
&gt;ikeptwalking.com/taking-elasticsearch-snapshots-using-curator/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>