package devopsmodules import ( "fmt" "rubric/utils" "strings" ) type Module struct { Key string Aliases []string Title string Description string Run func() } var All = []Module{ GitModule, DockerModule, KubernetesModule, CicdModule, AnsibleModule, TerraformModule, MonitoringModule, NginxModule, } func Find(key string) (Module, bool) { key = strings.ToLower(strings.TrimSpace(key)) for _, m := range All { if m.Key == key { return m, true } for _, a := range m.Aliases { if a == key { return m, true } } } return Module{}, false } func ListModules() { fmt.Printf("\n%s%sРазделы справочника DevOps:%s\n\n", utils.ColorBold, utils.ColorCyan, utils.ColorReset) for i, m := range All { fmt.Printf(" %s%d.%s %-14s — %s\n", utils.ColorDim, i+1, utils.ColorReset, utils.ColorYellow+utils.ColorBold+m.Key+utils.ColorReset, m.Title, ) } fmt.Println() } // Keywords возвращает ключевые слова для поиска по модулю func Keywords(key string) []string { kw := map[string][]string{ "git": { "git", "ветки", "branch", "merge", "rebase", "commit", "push", "pull", "clone", "stash", "tag", "cherry-pick", "bisect", "gitflow", "GitHub", "GitLab", "pull request", "PR", "конфликты", "conflicts", "remote", "origin", "HEAD", "diff", "log", "blame", "workflow", }, "docker": { "docker", "контейнеры", "containers", "образы", "images", "Dockerfile", "docker compose", "volumes", "тома", "networks", "сети", "registry", "Hub", "GHCR", "ECR", "podman", "buildx", "multi-stage", "RUN", "CMD", "ENTRYPOINT", "COPY", "FROM", "healthcheck", }, "kubernetes": { "kubernetes", "k8s", "kubectl", "Pod", "Deployment", "Service", "Ingress", "ConfigMap", "Secret", "Namespace", "PVC", "PV", "StatefulSet", "DaemonSet", "Job", "CronJob", "Helm", "chart", "RBAC", "Role", "ClusterRole", "HPA", "autoscaling", "kube", "node", "cluster", "контейнер", "оркестрация", }, "cicd": { "CI", "CD", "пайплайн", "pipeline", "GitHub Actions", "GitLab CI", "Jenkins", "ArgoCD", "GitOps", "workflow", "job", "runner", "артефакт", "artifact", "deploy", "деплой", "тесты", "автоматизация", "continuous integration", "continuous delivery", "YAML", }, "ansible": { "ansible", "playbook", "inventory", "инвентарь", "роли", "roles", "модули", "modules", "задачи", "tasks", "handlers", "шаблоны", "templates", "Jinja2", "vault", "секреты", "agentless", "SSH", "конфигурация", "автоматизация", "idempotent", }, "terraform": { "terraform", "IaC", "инфраструктура как код", "HCL", "провайдер", "provider", "ресурс", "resource", "state", "план", "plan", "apply", "destroy", "модуль", "module", "workspace", "backend", "S3", "AWS", "GCP", "Azure", "переменные", "output", }, "monitoring": { "мониторинг", "Prometheus", "Grafana", "AlertManager", "Loki", "метрики", "metrics", "алерты", "alerts", "PromQL", "LogQL", "dashboard", "дашборд", "exporter", "node exporter", "Tempo", "трассировка", "tracing", "observability", "наблюдаемость", "SIEM", "логи", "scrape", }, "nginx": { "nginx", "веб-сервер", "reverse proxy", "балансировка", "load balancing", "upstream", "virtual host", "server block", "SSL", "TLS", "HTTPS", "Let's Encrypt", "certbot", "HAProxy", "rate limiting", "кэширование", "cache", "gzip", "location", "proxy_pass", "CORS", }, } if v, ok := kw[key]; ok { return v } return []string{} }