butler_ddochi/ansible_manager/views.py
icurfer 0e59c11818
All checks were successful
Build And Test / build-and-push (push) Successful in 4m14s
버전 정보 표기 기능추가, 카테고리, 링크 등 수정
2024-12-15 23:58:47 +09:00

123 lines
3.9 KiB
Python

from django.shortcuts import render, redirect, get_object_or_404
from django.contrib.auth.decorators import login_required
from .models import AnsibleJob
from .forms import AnsibleJobForm
import subprocess
import tempfile
import os
def run_ansible_job(request, job):
user = request.user
decrypted_key = ""
if user.encrypted_private_key:
try:
decrypted_key = user.decrypt_private_key().strip().replace("\r", "")
except Exception as e:
job.result = f"SSH 키 복호화 오류: {str(e)}"
job.status = 'FAILED'
job.save()
return
job.status = 'RUNNING'
job.save()
try:
private_key = decrypted_key
playbook_file = tempfile.NamedTemporaryFile(delete=False, mode="w", newline='')
inventory_file = tempfile.NamedTemporaryFile(delete=False, mode="w", newline='')
private_key_file = tempfile.NamedTemporaryFile(delete=False, mode="w", newline='')
try:
playbook_file.write(job.playbook_content.strip())
playbook_file.close()
inventory_file.write(job.inventory_content.strip())
inventory_file.close()
private_key_file.write(f"{private_key}\n")
private_key_file.close()
os.chmod(private_key_file.name, 0o600)
command = [
"ansible-playbook", playbook_file.name,
"-i", inventory_file.name,
"--private-key", private_key_file.name,
# "-vvv"
]
result = subprocess.run(command, capture_output=True, text=True)
job.result = result.stdout
job.status = 'SUCCESS' if result.returncode == 0 else 'FAILED'
finally:
os.remove(playbook_file.name)
os.remove(inventory_file.name)
os.remove(private_key_file.name)
except Exception as e:
job.result = f"오류 발생: {str(e)}"
job.status = 'FAILED'
job.save()
@login_required
def create_ansible_job(request):
if request.method == 'POST':
form = AnsibleJobForm(request.POST)
if form.is_valid():
job = form.save(commit=False)
job.owner = request.user
job.status = 'PENDING'
job.save()
return redirect('ansible_manager:job_list')
else:
form = AnsibleJobForm()
return render(request, 'ansible_manager/create_job.html', {'form': form})
@login_required
def edit_ansible_job(request, job_id):
job = get_object_or_404(AnsibleJob, id=job_id, owner=request.user)
if request.method == 'POST':
form = AnsibleJobForm(request.POST, instance=job)
if form.is_valid():
job = form.save(commit=False)
job.owner = request.user
job.status = 'PENDING'
job.save()
# return redirect('ansible_manager:job_detail', job_id=job.id)
return redirect('ansible_manager:job_list')
else:
form = AnsibleJobForm(instance=job)
return render(request, 'ansible_manager/edit_job.html', {'form': form, 'job': job})
@login_required
def job_list(request):
jobs = AnsibleJob.objects.filter(owner=request.user).order_by('-created_at')
return render(request, 'ansible_manager/job_list.html', {'jobs': jobs})
@login_required
def run_job(request, job_id):
job = get_object_or_404(AnsibleJob, id=job_id, owner=request.user)
run_ansible_job(request, job)
return redirect('ansible_manager:job_detail', job_id=job.id)
@login_required
def job_detail(request, job_id):
job = get_object_or_404(AnsibleJob, id=job_id, owner=request.user)
return render(request, 'ansible_manager/job_detail.html', {'job': job})
@login_required
def delete_job(request, job_id):
job = get_object_or_404(AnsibleJob, id=job_id, owner=request.user)
job.delete()
return redirect('ansible_manager:job_list')
def notice(request):
return render(request, "ansible_manager/notice.html", {})