
Сегодня я хочу поделиться опытом управления инфраструктурой с помощью 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. Удачной автоматизации!
Комментарии (6)
vasyakrg
05.06.2024 07:49+1Удобно (наверное) только если арго сам по себе на отдельной машине. Но писать гигантские роли для дёргания курлом (опять же дописывать кучу исключений и дебага, если хочешь все это реально автоматизировать) - ну такое себе.
В кластере куба Агро легко управляется манифестами. Относительно недавно даже applicationSet заработал как надо. Красота.
gorokhovdenis Автор
05.06.2024 07:49Согласен, что использование Ansible для работы с ArgoCD может добавить сложности. Этот метод больше подходит для случаев, когда часть инфраструктуры находится вне Kubernetes и, как вариант, можно использовать ansible как единую систему конфигурирования.
Если вся инфраструктура находится в k8s, стандартный gitops подход действительно удобнее.
Nyralei
05.06.2024 07:49+1У API ArgoCD соблюдается идемпотентность?
gorokhovdenis Автор
05.06.2024 07:49Да, API ArgoCD соблюдает идемпотентность. Например, если создать приложение с помощью API запроса и затем повторно сделать тот же запрос, состояние приложения останется неизменным (если все параметры запроса не изменялись).
freelook27
прикольное решение, не знал про апи, я делал через манифесты application, но решает точно такую же задачу
gorokhovdenis Автор
Спасибо за отзыв! Рад, что понравилось решение. Да, через API создается тот же самый application манифест, но его не нужно класть в репозиторий в виде yaml файлика для создания ArgoCD-приложения. Это может быть полезно, когда часть инфраструктуры вне k8s. Например, можно с помощью Ansible настроить БД и через API добавить приложение в ArgoCD. Это может быть удобно для автоматизации создания временных стендов, которые требуются для краткосрочных задач.