Управление ArgoCD через CLI и скриптами

Для того, чтобы управлять инстансом ArgoCD через командную строку, можно воспользоваться как средствами самого Kubernetes, так и ArgoCD. В Kubernetes при установке сервера добавляются кастомные CRD, благодаря которым, можно через kubectl управлять приложениями и проектами. Также ArgoCD предоставляет свою утилиту командной строки для работы со своими серверами.

Чтобы воспользоваться ArgoCD CLI, достаточно скачать его релиз, его распаковать и использовать из него бинарник. Ниже представлен пример стабильной версии для архитектуры AMD64.

VERSION=$(curl -L -s https://raw.githubusercontent.com/argoproj/argo-cd/stable/VERSION)
curl -sSL -o argocd-linux-amd64 https://github.com/argoproj/argo-cd/releases/download/v$VERSION/argocd-linux-amd64
sudo install -m 555 argocd-linux-amd64 /usr/local/bin/argocd
rm argocd-linux-amd64

После этого необходимо аутентифицироваться на argocd сервере и получить сессионный токен. Для этого надо использовать локальный аккаунт, например admin. Auth-token хранится в файле ~/.config/argocd/config. Этот файл позволяет хранить информацию о всех серверах и токены для них, а также переключаться между активными контекстами (серверами).

Вот пример автоматической аутентификации при наличии доступа в куб для арго хоста argocd-srv1.net.local:

ARGO_PASS=$(kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d)
argocd login argocd-srv1.net.local --grpc-web --username admin --password $ARGO_PASS

Чтобы поменять контекст, необходимо посмотреть текущей командой:

argocd context

и переключиться на новый командой:

argocd context <context-name>

Полезные скрипты для работы с ArgoCD

Получить количество приложений в каждом кластере:

argocd cluster list -o json | jq -r '.[] | .name + " - " + (.info.applicationsCount | tostring)'

Получить список приложений по лейблу с именами и целевыми серверами

argocd app list -l ${1} --grpc-web -o json | jq -r ".[] | .metadata.name, .spec.destination.server"

Получить список приложений в проекте и посмотреть список изменений в тех, что находятся в статусе out-of-sync

argocd app list -p $PROJECT --grpc-web --output name
argocd app sync --project $PROJECT --apply-out-of-sync-only --preview-changes --grpc-web

Удалить все приложения по лейблу с статусе Unknown, лейбл передается в скрипт в качестве входного параметра ($1)

STATUS=Unknown
echo "Number of app in status ${STATUS}:"
argocd app list -l ${1} --grpc-web -o json | jq -r ".[] | select(.status.sync.status == \"${STATUS}\") | .metadata.name" | wc -l
read -n 1 -s -r -p "Press any key to continue..."
argocd app list -l ${1} --grpc-web -o json | jq -r ".[] | select(.status.sync.status == \"${STATUS}\") | .metadata.name" | \
xargs -r -n1 argocd app delete -y
Убрать finalizer для «зависших» приложений и удалить их
for app in $(kubectl get applications -n argocd -l branch=performance -o json | jq -r '.items[] |
  select(.status.sync.status == "Unknown") | .metadata.name');
do
  echo "  Removing finalizer from application: $app"
  kubectl patch application $app -n argocd -p '{"metadata":{"finalizers":[]}}' --type=merge
  kubectl delete applications -n argocd $app
done
Отключить auto-sync для приложений по паттерну имени
#!/bin/bash

# Check if a filter pattern was provided as an argument
if [ -z "$1" ]; then
  echo "Usage: $0 <grep-filter-pattern>"
  exit 1
fi

FILTER_PATTERN="$1"
NAMESPACE="argocd"

# Get all application names in the namespace
all_apps=$(kubectl get applications -n $NAMESPACE -o jsonpath='{.items[*].metadata.name}')

# Filter apps using the provided pattern
apps=$(echo $all_apps | tr ' ' '\n' | grep "^${FILTER_PATTERN}*")
# Loop through filtered apps and patch sync policy
for app in $apps; do
  kubectl patch application $app -n argocd --type merge -p '{
    "spec": {
      "syncPolicy": {
        "automated": null
      }
    }
  }'
  echo "Patched sync policy for $app"
done

Был ли наш пост полезен?

Нажмите на звезду, чтобы оценить мои труды!

Средний рейтинг: 0 / 5. Количество голосов: 0

Пока голосов нет. Проголосуй первым!

Мне жаль, что пост вам не помог 🙁

Позвольте мне исправиться.

Поделитесь, что можно улучшить?

Похожие посты