Ответ
В DevOps я использовал Go для создания высокопроизводительных и легко распространяемых утилит. Его статическая компиляция и богатая стандартная библиотека идеально подходят для задач автоматизации.
Конкретные примеры из моего опыта:
-
CLI-инструменты для инженерной платформы:
- Утилита для автоматического сбора и агрегации метрик из разных источников (Prometheus, Loki) в единый отчет для Slack.
- Инструмент для валидации конфигураций Kubernetes (YAML/JSON) перед применением через
kubectl apply.
-
Микросервисы для внутренних систем:
- Простой REST API на
ginдля управления динамической конфигурацией feature-flags в staging-окружениях. - Webhook-обработчик для GitLab CI, который парсил события пайплайнов и отправлял уведомления в Mattermost с деталями о failed jobs.
- Простой REST API на
-
Интеграция с облачными API и инфраструктурой:
- Скрипт для автоматического создания snapshots дисков в GCP по расписанию с фильтрацией по тегам.
- Утилита, которая с помощью библиотеки
terraform-execзапускала планирование для выбранных модулей Terraform и форматировала вывод для удобного review.
Пример кода: утилита для проверки доступности эндпоинтов (healthcheck)
package main
import (
"context"
"fmt"
"net/http"
"time"
)
func checkEndpoint(url string) bool {
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
req, _ := http.NewRequestWithContext(ctx, "GET", url, nil)
resp, err := http.DefaultClient.Do(req)
if err != nil {
return false
}
defer resp.Body.Close()
return resp.StatusCode == http.StatusOK
}
func main() {
endpoints := []string{"http://api.service-1", "http://api.service-2"}
for _, ep := range endpoints {
status := "OK"
if !checkEndpoint(ep) {
status = "FAIL"
}
fmt.Printf("%s: %sn", ep, status)
}
}
Главные преимущества Go для DevOps: один бинарный файл без зависимостей, быстрая компиляция, эффективная работа с concurrent-задачами (горутины) и отличная поддержка работы с сетью и файлами.