Comment puis-je supprimer le noeud équilibré de haproxy via la ligne de commande?

46

Haproxy fonctionne comme équilibreur de charge et, à partir de l'interface Web de statistiques fournie avec haproxy, je peux mettre un serveur Web en mode maintenance (et le rétablir) - ce qui est génial!

Cependant, je souhaite également pouvoir effectuer la même action à partir de la ligne de commande (à utiliser dans certains flux de travaux de déploiement automatisés). Est-ce possible, et si oui comment?

Merci beaucoup

isNaN1247
la source

Réponses:

59

Mise à jour (28 août 2012): J'ai maintenant tendance à utiliser haproxyctl , qui utilise les méthodes décrites ci-dessous.


Je l'ai corrigé après un peu plus de recherches, pour quiconque ayant le même problème: -

Vous pouvez ajouter un socket Unix dans votre configuration, puis interagir avec cela ( voici les commandes possibles ).

Installer:

sudo nano /etc/haproxy/haproxy.cfg

Dans votre section "globale", ajoutez:

stats socket /etc/haproxy/haproxysock level admin

Redémarrez votre démon haproxy (par exemple sudo service haproxy restart)

Maintenant, vous avez besoin de socat (si vous ne l'avez pas, juste apt-get install socatsur Ubuntu).

Il ne vous reste plus qu'à lancer cette commande pour supprimer un nœud:

echo "disable server yourbackendname/yourservername" | socat stdio /etc/haproxy/haproxysock

Pour le remettre en place, remplacez disable par enable dans la commande ci-dessus.

isNaN1247
la source
21

En plus de la méthode echo de beardwizzle, vous pouvez également le faire de manière interactive:

root@ny-lb01:/etc/haproxy# sudo socat readline /var/run/haproxy.stat 

prompt
> set timeout cli 1d
> disable server foo/web01
> help
Unknown command. Please enter one of the following commands only :
  clear counters : clear max statistics counters (add 'all' for all counters)
  clear table    : remove an entry from a table
  help           : this message
  prompt         : toggle interactive mode with prompt
  quit           : disconnect
  show info      : report information about the running process
  show stat      : report counters for each proxy and server
  show errors    : report last request and response errors for each proxy
  show sess [id] : report the list of current sessions or dump this session
  show table [id]: report table usage stats or dump this table's contents
  get weight     : report a server's current weight
  set weight     : change a server's weight
  set timeout    : change a timeout setting
  disable server : set a server in maintenance mode
  enable server  : re-enable a server that was previously in maintenance mode
Kyle Brandt
la source
6
Un gros piège est que le socat de Debian ne supporte pas "readline" bien qu'il soit écrit dans la page de manuel. Ils l'ont corrigé en raison d'un conflit de licences entre libreadline (GPL) et OpenSSL. Dans ce cas, vous utilisez socat /var/run/haproxy.stat stdiopour chaque commande
bentolor
7

Si vous n'avez accès qu'à netcat ( nc), vous pouvez l'utiliser pour interagir avec le fichier de socket de HAProxy de la même manière socat.

$ echo "show info" | nc -U /var/lib/haproxy/stats | head -10
Name: HAProxy
Version: 1.5.2
Release_date: 2014/07/12
Nbproc: 1
Process_num: 1
Pid: 29745
Uptime: 0d 0h14m35s
Uptime_sec: 875
Memmax_MB: 0
Ulimit-n: 8034

Pour désactiver un serveur:

$ echo "enable server bk_dservers/ds02" | nc -U /var/lib/haproxy/stats

Veillez à ce que le fichier de socket ait le niveau d'accès approprié pour effectuer les opérations ci-dessus. Principalement quelque chose comme ceci:

stats       socket /var/lib/haproxy/stats level admin

Sinon, vous obtiendrez des erreurs d'autorisation refusées:

$ echo "disable server bk_dservers/ds02" | nc -U /var/lib/haproxy/stats
Permission denied

$

Références

slm
la source
7

Le moyen le plus simple est:

1 - Configurez votre serveur Web pour renvoyer le code 503 si un fichier nommé maintenance.html (par exemple) existe. Avec Apache, vous pouvez le faire comme suit:

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{ENV:REDIRECT_STATUS} !=503
  RewriteCond "/var/www/maintenance.html" -f
  RewriteRule ^(.*)$ /$1 [R=503,L]
</IfModule>

2 - Configurez votre backend haproxy pour vérifier une URL au lieu de vérifier un port comme suit:

backend site
    balance roundrobin
    option httpchk GET /index.html
    server myserver1.example.com 192.0.2.1:80 cookie S1 check inter 2000 fall 3
    server myserver2.example.com 192.0.2.2:80 cookie S2 check inter 2000 fall 3

3 - Redémarrez votre serveur Web et votre équilibreur de charge.

4 - Mettez votre serveur web en mode maintenance.

touch /var/www/maintenance.html

5 - Retirez votre serveur Web du mode maintenance.

rm -f /var/www/maintenance.html
mijhael3000
la source
2

Vous pouvez également "supprimer" temporairement la page de vérification de l'intégrité d'un serveur pour obtenir le noeud final, puis publier votre application.

Rafael Oliveira
la source
0

Si vous avez debian, readline ne fonctionne pas, netcat est une meilleure option pour les applications interactives:

user@server:/etc/haproxy$ sudo nc -U /etc/haproxy/haproxysock
prompt
> show info
Name: HAProxy
Version: 1.7.11-1ppa1~xenial
Release_date: 2018/04/30
Nbproc: 1
Process_num: 1
Pid: 12307
Uptime: 0d 10h33m22s
...

Non interactif:

echo "show info;show stat" | sudo nc -U /etc/haproxy/haproxysock
wjenkins9
la source