![Имена хостов в файле конфигурации HAProxy](https://rvso.com/image/623660/%D0%98%D0%BC%D0%B5%D0%BD%D0%B0%20%D1%85%D0%BE%D1%81%D1%82%D0%BE%D0%B2%20%D0%B2%20%D1%84%D0%B0%D0%B9%D0%BB%D0%B5%20%D0%BA%D0%BE%D0%BD%D1%84%D0%B8%D0%B3%D1%83%D1%80%D0%B0%D1%86%D0%B8%D0%B8%20HAProxy.png)
В моем файле haproxy.cfg есть два внутренних сервера, использующих имена хостов:
server ops-ca-revealv2e-prod-1 ops-ca-revealv2e-prod-1:443 cookie ops-ca-revealv2e-prod-1 ssl weight 1 maxconn 512 check
server ops-ca-revealv2e-prod-2 ops-ca-revealv2e-prod-2:443 cookie ops-ca-revealv2e-prod-2 ssl weight 1 maxconn 512 check
Эти имена хостов являются частью Amazon OpsWorks и автоматически вводятся в /etc/hosts всякий раз, когда экземпляр включается или выключается. Если я попытаюсь перезапустить HAProxy, когда один из экземпляров выключается, я получаю ошибку:
[ALERT] 362/225440 (27202) : parsing [/opt/haproxy-ssl/haproxy.cfg:42] : 'server ops-ca-revealv2e-prod-2' : invalid address: 'ops-ca-revealv2e-prod-2' in 'ops-ca-revealv2e-prod-2:443'
[ALERT] 362/225440 (27202) : Error(s) found in configuration file : /opt/haproxy-ssl/haproxy.cfg
[ALERT] 362/225440 (27202) : Fatal errors found in configuration.
Есть ли способ заставить HAProxy проверять, является ли имя хоста действительным? Если оно действительно, используйте его, если нет, игнорируйте его.
решение1
В haproxy >= 1.7 вы сможете использовать эту init-addr
опцию, указав none, чтобы предотвратить разрешение DNS при запуске.
Издокументы:
init-addr {last | libc | none | <ip>},[...]*
Укажите, в каком порядке должен быть разрешен адрес сервера при запуске, если он использует полное доменное имя. Предпринимаются попытки разрешить адрес, применяя по очереди каждый из методов, упомянутых в списке, разделенном запятыми. Используется первый успешный метод. Если достигнут конец списка без нахождения рабочего метода, выдается ошибка. Метод "last" предлагает выбрать адрес, который появляется в файле состояния (см. "server-state-file"). Метод "libc" использует внутренний преобразователь libc (gethostbyname() или getaddrinfo() в зависимости от операционной системы и параметров сборки). Метод "none" специально указывает, что сервер должен запускаться без какого-либо допустимого IP-адреса в нерабочем состоянии. Может быть полезно игнорировать некоторые проблемы DNS при запуске, ожидая, пока ситуация будет исправлена позже. Наконец, может быть предоставлен IP-адрес (IPv4 или IPv6).
Итак, ваша строка конфигурации может быть такой:
server s1 myhostname init-addr none
решение2
Нет, это невозможно изнутри haproxy.
Согласно руководству, address
в server
строке конфигурации указано:
[...] IPv4 или IPv6 адрес сервера. В качестве альтернативы поддерживается разрешаемое имя хоста [...]
Другими словами, в конфигурации не допускается использование неразрешимых имен хостов.
Идея:
Любая часть адресной строки может ссылаться на любое количество переменных среды, предваряя их имена знаком доллара ('$') и при желании заключая их в фигурные скобки ('{}'), аналогично тому, как это делается в оболочке Bourne.