Что вы писали на Go (Golang) в контексте DevOps?

«Что вы писали на Go (Golang) в контексте DevOps?» — вопрос из категории Скриптинг и автоматизация, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В DevOps я использовал Go для создания высокопроизводительных и легко распространяемых утилит. Его статическая компиляция и богатая стандартная библиотека идеально подходят для задач автоматизации.

Конкретные примеры из моего опыта:

  1. CLI-инструменты для инженерной платформы:

    • Утилита для автоматического сбора и агрегации метрик из разных источников (Prometheus, Loki) в единый отчет для Slack.
    • Инструмент для валидации конфигураций Kubernetes (YAML/JSON) перед применением через kubectl apply.
  2. Микросервисы для внутренних систем:

    • Простой REST API на gin для управления динамической конфигурацией feature-flags в staging-окружениях.
    • Webhook-обработчик для GitLab CI, который парсил события пайплайнов и отправлял уведомления в Mattermost с деталями о failed jobs.
  3. Интеграция с облачными 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-задачами (горутины) и отличная поддержка работы с сетью и файлами.