Проверка на дублирование Application в ArgoCD с помощью OPA
Так уж вышло, что в ArgoCD плоская структура для хранения описания приложений - все они живут в одном namespace, а значит должны иметь уникальные имена, чтобы предостеречь себя от разных непонятных ситуаций есть простое решение - проверять, не дублируются ли эти самые имена.
Для реализации проверки будем использовать проверенный инструмент – Open Policy Agent, точнее даже не инструмент, а движок, который это все реализует, для самого запуска проверки будет использоваться conftest.
Для поиска дублей нужно описать политику (policy), она описывается в синтаксисе rego - не самая понятная штука, поэтому моя заметка служит просто готовым решением, детальное описание синтаксиса можно найти на сайте с документацией (есть даже песочница).
В репозитории, где храним спецификации для ArgoCD, создаем каталог policy, в нем файл argocd-applications.rego (например), с таким содержимым:
package main deny[msg] { i != j currentFilePath = input[i].path input[i].contents.kind == input[j].contents.kind input[i].contents.metadata.name == input[j].contents.metadata.name msg := sprintf("Объект с именем %s (kind: %s) из файла %s дублируется в файле %s", [input[i].contents.metadata.name, input[i].contents.kind, currentFilePath, input[j].path]) }
Ну, а дальше встраиваем вызов в нашем CI:
--- stages: - lint conftest: image: name: openpolicyagent/conftest:v0.34.0 entrypoint: [""] stage: lint script: - conftest test --combine kubernetes/argocd-apps
Где kubernetes/argocd-apps
- путь до описания ваших Application для ArgoCD.