Сегодня я хочу поделиться опытом управления инфраструктурой с помощью 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 
  1. Перезапустить деплоймент argo-cd-argocd-server.

  2. Сгенерировать новый токен для пользователя '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_URLARGOCD_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_URLARGOCD_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. Удачной автоматизации!