
Сегодня я хочу поделиться опытом управления инфраструктурой с помощью DevOps инструментов. Этот метод может быть полезен, если у вас разнородная инфраструктура (облака, Kubernetes, виртуальные машины и т.д.).
Статья будет разбита на два этапа:
управление приложениями в ArgoCD через API запросы
использование Ansible для автоматизации этого процесса.
Предварительные требования
Данная статья предполагает, что у вас уже установлены ArgoCD, Ansible, а также имеются необходимые права и доступы.
Управление приложениями в ArgoCD через API запросы.
Генерация токена
Для взаимодействия с ArgoCD через API необходим токен. Его можно получить двумя способами: через API запрос или веб-интерфейс.
Получение токена через API запрос
Токен можно получить с помощью следующего API запроса:
curl $ARGOCD_SERVER/api/v1/session -d $'{"username":"admin","password":"your_password_here"}'
Генерация постоянного токена через веб-интерфейс
Еще один способ получить токен — сгенерировать постоянный токен через веб-интерфейс ArgoCD:
Для этого нужно
1. Отредактировать configMap, который называется argocd-cm в namespace ArgoCD, обычно он так и называется argocd. Нужно добавить следующую строку в раздел data:
data: accounts.admin: apiKey, login
Перезапустить деплоймент
argo-cd-argocd-server.Сгенерировать новый токен для пользователя 'admin' через веб-интерфейс ArgoCD:
Перейти в раздел
/settings/accounts/admin.В разделе Token ID выберать
Generate NEW ‘Token ID’.Выбрать пользователя 'admin' и сгенерировать новый токен.
Примеры API запросов
Экспорт токена в переменную окружения
export ARGOCD_TOKEN="ваш токен здесь"
Создать приложение в ArgoCD через cURL запрос:
curl -X POST -H "Authorization: Bearer $ARGOCD_TOKEN" -H "Content-Type: application/json" \ -d '{ "metadata": { "name": "test-api-app", "namespace": "argocd" }, "spec": { "project": "default", "source": { "repoURL": "https://your-argocd-instance/helm.git", "path": "vault-secrets-webhook", "targetRevision": "master", "helm": { "parameters": [ {"name": "resources.limits.memory", "value": "256Mi"}, {"name": "resources.limits.cpu", "value": "250m"} ] } }, "destination": { "server": "https://kubernetes.default.svc", "namespace": "test-app-yaml" }, "syncPolicy": { "automated": {"prune": true, "selfHeal": true} } } }' \ https://your-argocd-instance/api/v1/applications
Удалить приложение можно с помощью следующего API запроса:
curl -X DELETE -H "Authorization: Bearer $ARGOCD_TOKEN" https://your-argocd-instance/api/v1/applications/test-api-app
Доступ к документации API ArgoCD с помощью Swagger
Можно получить доступ к подробной документации API с помощью Swagger. Для это нужно открыть браузер и перейти к интерфейсу Swagger:
https://your-argocd-instance/swagger-ui
Интеграция Ansible с ArgoCD
Теперь рассмотрим, как можно использовать Ansible для управления приложениями в ArgoCD.
Ansible интегрируется с ArgoCD через модуль URI, позволяя выполнять API запросы.
Пример 1: Создание приложения в ArgoCD
Вот пошаговый плейбук Ansible для создания приложения в ArgoCD:
- hosts: localhost tasks: - name: Create ArgoCD application uri: url: "https://{{ ARGOCD_URL }}/api/v1/applications" method: POST headers: Authorization: "Bearer {{ ARGOCD_TOKEN }}" Content-Type: "application/json" body_format: json body: metadata: name: "{{ APP_NAME }}" namespace: "argocd" spec: project: "default" source: repoURL: "https://{{ ARGOCD_HELM_REPO }}/stash/scm/do/helm.git" path: "vault-secrets-webhook" targetRevision: "master" helm: parameters: - name: "replicaCount" value: "1" - name: "env.VAULT_IMAGE" value: "vault:1.11.11" - name: "resources.limits.memory" value: "256Mi" - name: "resources.limits.cpu" value: "250m" destination: server: "https://kubernetes.default.svc" namespace: "test-app-yaml" syncPolicy: automated: prune: true selfHeal: true return_content: yes validate_certs: no register: response - name: Display API response debug: var: response.content
В этом плейбуке убедитесь, что вы определили переменные ARGOCD_URL, ARGOCD_TOKEN и APP_NAME соответственно.
Пример 2: Удаление приложения в ArgoCD
Удаление приложения также просто:
- hosts: localhost tasks: - name: Delete ArgoCD application uri: url: "https://{{ ARGOCD_URL }}/api/v1/applications/{{ APP_NAME }}" method: DELETE headers: Authorization: "Bearer {{ ARGOCD_TOKEN }}" Content-Type: "application/json" status_code: 200,202,204 validate_certs: no
Проверьте, что переменные ARGOCD_URL, ARGOCD_TOKEN и APP_NAME установлены и для этого плейбука.
Пример структуры Ansible роли
Как может выглядеть структура файлов и директорий в репозитории
roles/app-k8s-deploy ├── defaults │ └── main.yaml ├── tasks │ ├── create_application.yml │ ├── delete_application.yml │ └── main.yaml
В defaults/main.yaml определите значения по умолчанию:
ARGOCD_URL: "https://your-argocd-instance" ARGOCD_TOKEN: "" ARGOCD_APP_NAME: "test-api-app" # ... (другие переменные)
Плейбук main.yaml может выглядеть так:
--- - name: Include create application tasks include_tasks: create_application.yml when: task == 'install' - name: Include delete application tasks include_tasks: delete_application.yml when: task == 'delete'
Внутри create_application.yml и delete_application.yml можно определить соответствующие задачи, используя структуру из предыдущих примеров.
Плейбук для запуска роли
Наконец, вы можете запустить роль из следующего плейбука
--- - hosts: "{{ exec_hosts | default(['localhost']) | join(',') }}" roles: - { role: app-k8s-deploy, task: install }
Надеюсь что мой опыт будет полезен и поможет эффективно управлять приложениями ArgoCD с помощью Ansible. Удачной автоматизации!
