Для того, чтобы управлять инстансом 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 -yfor 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#!/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