Управление Argo CD с помощью Ansible через API вызовы
Сегодня я хочу поделиться опытом управления инфраструктурой с помощью DevOps инструментов. Этот метод может быть полезен, если у вас разнородная инфраструктура (облака, Kubernetes, виртуальные машины и т.д.).
Статья будет разбита на два этапа:
Предварительные требования
Данная статья предполагает, что у вас уже установлены 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. Удачной автоматизации!