-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.py
110 lines (87 loc) · 4.04 KB
/
app.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
from flask import Flask, render_template, request, redirect, url_for, flash, session
from flask_login import LoginManager, UserMixin, login_user, logout_user, login_required, current_user
from config import Config
import subprocess
import yaml
import os
app = Flask(__name__)
app.config.from_object(Config) # Lädt alle Konfigurationsvariablen aus config.py
login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = 'login' # Dies setzt die Login-Route
# Konfigurationsdaten aus playbooks_config.yaml laden
with open("playbooks_config.yaml", 'r') as config_file:
config = yaml.safe_load(config_file)
playbooks = config['playbooks'] # Hier wird die playbooks-Liste aus der YAML-Datei geladen
# Dummy-Benutzer-Daten (In der Produktion solltest du eine Datenbank verwenden)
users = {'admin': 'passwort'} # Benutzername: Passwort
class User(UserMixin):
def __init__(self, username):
self.username = username
def get_id(self):
return self.username # Gibt die Benutzer-ID zurück
@login_manager.user_loader
def load_user(username):
return User(username)
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
if username in users and users[username] == password:
user = User(username)
login_user(user)
return redirect(url_for('playbooks_view')) # Auf die Playbook-Liste umleiten
else:
flash('Ungültiger Benutzername oder Passwort', 'danger')
return render_template('login.html')
@app.route('/logout', methods=['GET', 'POST'])
@login_required
def logout():
logout_user()
return redirect(url_for('login'))
@app.route('/')
def home():
return render_template('home.html')
@app.route('/playbooks')
@login_required
def playbooks_view():
return render_template('playbooks.html', playbooks=playbooks)
@app.route('/playbook/<int:playbook_id>/execute', methods=['GET', 'POST'])
@login_required
def execute_playbook(playbook_id):
# Suche das Playbook basierend auf der ID
playbook_config = next((p for p in playbooks if p['id'] == playbook_id), None)
if not playbook_config:
return "Playbook nicht gefunden", 404
if request.method == 'POST':
# Erstelle die Umgebungsvariablen aus den POST-Daten, falls welche vorhanden sind
playbook_vars = {}
if 'variables' in playbook_config:
for var in playbook_config['variables']:
if var['type'] == 'checkbox':
playbook_vars[var['name']] = request.form.get(var['name'], 'false')
else:
playbook_vars[var['name']] = request.form[var['name']]
# Playbook-Pfad und Verzeichnis festlegen
playbook_path = playbook_config['path']
playbook_dir = os.path.dirname(playbook_path)
# Erstelle den Befehl zum Ausführen des Playbooks
command = ['ansible-playbook', playbook_path]
# Füge die Variablen zum Befehl hinzu, falls vorhanden
for key, value in playbook_vars.items():
command.append('-e')
command.append(f"{key}={value}")
# Debugging-Ausgabe des Befehls
print("Auszuführender Befehl:", " ".join(command))
# Führe den Befehl aus, ohne dass bei Fehlern eine Exception ausgelöst wird
result = subprocess.run(command, capture_output=True, text=True, cwd=playbook_dir, check=False)
# Unabhängig vom Erfolg das Ergebnis und eventuelle Fehler an das Template übergeben
output = result.stdout
error = result.stderr
# Render die execute.html mit der Ausgabe
return render_template('execute.html', playbook=playbook_config, output=output, error=error)
# Bei GET-Anfrage zeige das Formular für die Eingabe der Variablen (falls vorhanden)
return render_template('execute.html', playbook=playbook_config)
if __name__ == '__main__':
app.run(host=app.config['HOST'], port=app.config['PORT'], debug=app.config['DEBUG'])