Шаблон Consul — условие «Если служба существует»?

#nginx #nginx-reverse-proxy #consul #consul-template

#nginx #nginx-обратный прокси #консул #консул-шаблон

Вопрос:

Я только что унаследовал настройку прокси-сервера / сервера приложений Nginx, которая использует шаблон Consul и Consul для обнаружения и регистрации служб. Прокси-сервер Nginx имеет конфигурационный файл с подобной записью для регистрации нижестоящих серверов приложений:

 <snip>

upstream appservers {
  {{ range service "my-app-servers" }}
     server {{ .Address }}.{{ .Port }};
  {{ end }}
}

<snip>
 

Я consul-template работаю в фоновом режиме, чтобы отслеживать любые обновления my-app-servers , nginx.conf соответствующим образом обновлять файл, а затем перезагружать конфигурацию nginx. Все это отлично работает, и мы можем добавлять и удалять серверы приложений из набора по мере необходимости. Тем не менее, если существует сценарий, в котором у нас нет доступных серверов приложений, мы получаем пустой upstream блок, и это приводит к сбою перезагрузки nginx.

Есть ли способ в consul-template иметь "if service my-app-servers exists, then..." "if not, then..." логику и? Я хотел бы иметь возможность иметь в моем nginx.conf файле одну конфигурацию для сценариев, в которых существуют вышестоящие серверы, и другую настройку на случай непредвиденных обстоятельств, которая отображает страницы ошибок, когда вышестоящие серверы не существуют. Я все еще набираю скорость в consul-template и не видел примеров, показывающих синтаксис для такой логики. Любая помощь?

Ответ №1:

Вы можете добиться этого, сохранив результат service поиска в переменной, а затем используя условие, которое выводит блок восходящего потока только в том случае, если переменная не пуста.

 {{- $upstream_services := service "my-app-servers" -}}
{{- if $upstream_services -}}
upstream appservers {
  {{- range $upstream_services }}
     server {{ .Address }}.{{ .Port }};
  {{- end }}
}
{{- end }}