Представьте себе, что на ваших плечах лежит инфраструктура около дюжины проектов, которые написаны на разных языках программирования и имеют свой стек технологий. Некоторые из них совсем свежие и используют самые современные веяния веб-индустрии, а другие – кладезь легаси и устаревшего кода.
У каждого из этих проектов, помимо продового, есть еще 1-3 окружения для тестирования. И вот вам, как DevOps инженеру прилетает следующая задача: нужно для каждого тестового окружения добавить robots.txt файл, который будет запрещать поисковикам индексацию.
Есть несколько способов, как это сделать, но я нашел самый простой и оптимальный.
Конечно, можно заставить всех бекендеров добавить этот файл в каждый проект, но это сложный подход, который DevOps инженер не контролирует. Поэтому мы пойдем по другому пути.
Решение очень зависит от используемых вами технологий. У нас используются следущие:
- Kubernetes кластер;
- Ingress Nginx;
- Helm.
Каждый из этих инструментов вносит свои улучшения в решение этой задачи.
Чистый Kubernetes #
Если у вас используется чистый Kubernetes без установленного Nginx Ingress, то у вас есть 2 пути.
Nginx #
Вы можете взять самый легкий чистый образ с Nginx,
куда с помощью ConfigMap примонтировать как конфиг сервера,
так и содержимое файла robots.txt
.
После этого достаточно только настроить Ingress на то, чтобы он все запросы на /robots.txt
направлял в этот контейнер.
Примеры конфигов приводить не буду, так как есть вариант получше.
“Robots Disallow” #
Второе, еще более простое решение, это взять wikiwi/robots-disallow образ в Docker Hub. Принцип работы абсолютно такой же, только теперь не придется ничего настраивать. Только Ingress.
Ingress Nginx #
Если вы еще не установили его себе в кластер, то я вам настоятельно рекомендую это сделать. Это мощный инструмент, который умеет делать все, что умеет Nginx, но имеет такой же подход к использованию, как и все сущности в Kubernetes.
Вы только посмотрите на количество параметров, которые можно настроить через аннотации или конфиг мапы.
В общем, этим мы и воспользуемся, чтобы решить поставленную задачу. Достаточно добавить в Ingress приложения следующие строки:
metadata:
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/server-snippet: |
location = /robots.txt {
add_header Content-Type text/plain;
return 200 'User-agent: *\nDisallow: /\n';
}
Да, Nginx умеет не только выдавать статику или проксировать запросы. Он может генерировать ответ самостоятельно.
Строка return 200 'Content'
именно это и делает.
Таким образом, мы решили задачу буквально в 5 строк.
Helm #
В этой ситуации Helm не делает ничего особенного, но позволяет переиспользовать один манифест в разных окружениях. В простейшем его использовании, Helm по своей сути является шаблонизатором для конфигов Kubernetes.
Поэтому можно сделать так:
{{- if ne .Values.env "production" }}
nginx.ingress.kubernetes.io/server-snippet: |
location = /robots.txt {
add_header Content-Type text/plain;
return 200 'User-agent: *\nDisallow: /\n';
}
{{- end }}
То есть если окружение не продовое, запрещаем поисковикам индексирование.
Либо так, если хочется большей власти:
{{- if .Values.disallowRobots }}
nginx.ingress.kubernetes.io/server-snippet: |
location = /robots.txt {
add_header Content-Type text/plain;
return 200 'User-agent: *\nDisallow: /\n';
}
{{- end }}
Пользуйтесь на здоровье :fox: