크로니클(Cronicle)에 등록된 스케줄 이벤트를 다른 위치의 크로니클로 이관하는 과정을 정리합니다. 수동으로 작성 이관하는 번거로움을 줄이기 위해 크로니클의 API와 Python 코드를 활용하여 이관 자동화를 진행합니다.
1. 크로니클 설명
크로니클은 이벤트 기반 작업 스케줄 수행 어플리케이션으로 Job을 구성하여 다양한 작업을 등록 관리할 수 있습니다. 기본 솔루션 어플리케이션으로 Cronicle을 사용하고 있어서 이벤트를 이관해야하는 경우가 자주 발생하여 자동화 이관이 필요했습니다.
참고 URL https://github.com/jhuckaby/Cronicle#environment-variables
2. 크로니클 UI 구성
- 상단 메뉴 : Home, Schedule, Completed, My Account, Admin
- 좌측 메뉴 : Activity Log, API Keys, Categories, Plugins, Servers, Users
3. 크로니클에서 수행 작업
3.1. API Keys 에서 키 등록
3.2. 대상 크로니클에서 카테고리 등록
4. 자동화 Python 소스 작성
FROM 서버에서 이벤트 목록을 조회 후 목표 카테고리 기준으로 내용을 필터링 & 재구성하여
최종 정리된 내용을 기준으로 TO 서버로 이벤트 목록을 전송합니다.
import requests
# -------- 설정 --------
FROM_API_KEY = 'aaaaaaaaaaaaaa'
FROM_CATEGORY = 'cmc2roegok9'
FROM_URL = 'https://cronicle.x2bee.com/api/app/get_schedule/v1'
TO_API_KEY = 'xxxxxxxxxxx' # TO 대상의 API KEY
TO_CATEGORY = 'cmc8ttd84rz'
TO_URL = 'https://cronicle-dev.x2bee.com/api/app/create_event' # 또는 /create_schedule
# -------- FROM 요청 --------
from_headers = {
'X-API-Key': FROM_API_KEY
}
print(f"[FROM] 요청 시작 (category = {FROM_CATEGORY})")
from_response = requests.get(FROM_URL, headers=from_headers)
from_data = from_response.json()
rows = from_data.get('rows', [])
# -------- 필터링 --------
filtered_jobs = [
{
'title': job.get('title'),
'category': TO_CATEGORY,
'timing': job.get('timing'),
'params': job.get('params'),
'target': job.get('target'),
'plugin': job.get('plugin')
}
for job in rows if job.get('category') == FROM_CATEGORY
]
print(f"[FROM] 가져온 항목 수: {len(filtered_jobs)}")
# -------- 필터링 후 추가 --------
for job in filtered_jobs:
job['enabled'] = False
#job['target'] = "allgrp"
#job['plugin'] = "urlplug"
if isinstance(job.get('params'), dict):
url = job['params'].get('url', '')
if url and isinstance(url, str):
job['params']['url'] = url.replace(
'batch-search.osstem.x2bee.com',
'batch-search-dev.x2bee.com'
)
# -------- TO 요청 (POST) --------
to_headers = {
'X-API-Key': TO_API_KEY
}
for job in filtered_jobs:
print(job)
to_response = requests.post(TO_URL, headers=to_headers, json=job)
status = to_response.status_code
result = to_response.json() if to_response.headers.get("Content-Type", "").startswith("application/json") else to_response.text
print(f"[TO] {job['title']} → status: {status}, response: {result}")
위와 같이 구성하면 편리하게 자동화 시킬 수 있습니다.
필요에 따라 카테고리 전체를 자동 이관 시키는 구현소스를 작성해보세요.
'DevOps와 Infra > DevOps 일반' 카테고리의 다른 글
Nexus에서 NPM 레지스트리 설정 방법 (0) | 2025.04.16 |
---|---|
docker-compose.yml 파일로 Jenkins 복구 (0) | 2025.04.09 |
Rclone을 docker로 띄워 Object Storage browser로 이용하기 (1) | 2025.04.04 |
Docker Monitoring & Management Tools 추천 (0) | 2025.03.28 |
Nginx 502 error 디버깅 (0) | 2025.03.26 |