feat: add script to manage Hetzner servers

Introduce a new script to manage Hetzner servers which includes capabilities to list, update, and delete servers. The script integrates with the local Wireguard VPN configuration tool, running an update script and subsequently removing old servers. This automates the process, ensuring efficient server management and updated local configurations.
This commit is contained in:
Kumi 2024-07-18 18:58:17 +02:00
parent f075cc668b
commit aebc5adaf3
Signed by: kumi
GPG key ID: ECBCC9082395383F

68
manage_hetzner_servers.py Normal file
View file

@ -0,0 +1,68 @@
import subprocess
import configparser
from hcloud import Client
import argparse
import pathlib
UPDATE_SCRIPT_PATH = pathlib.Path(__file__).parent / "update_local_config.py"
CONFIG_PATH = pathlib.Path(__file__).parent / "config.ini"
def get_hetzner_client():
config = configparser.ConfigParser()
config.read(CONFIG_PATH)
api_token = config["hetzner"]["api_token"]
return Client(token=api_token)
def list_hetzner_servers(client):
return client.servers.get_all()
def delete_hetzner_server(client, server):
server.delete()
def run_update_script(provider, location, server_type, interface, config_path):
command = [
"python", UPDATE_SCRIPT_PATH,
"--provider", provider,
"--location", location,
"--server_type", server_type,
"--interface", interface
]
if config_path:
command.extend(["--config_path", config_path])
result = subprocess.run(command, capture_output=True, text=True)
if result.returncode != 0:
raise Exception(f"Error executing update script: {result.stderr}")
print(result.stdout)
def main():
parser = argparse.ArgumentParser(description="Manage Hetzner servers and update local Wireguard VPN.")
parser.add_argument("--provider", type=str, required=True, help="Cloud provider (e.g., hetzner)")
parser.add_argument("--location", type=str, required=True, help="Server location")
parser.add_argument("--server_type", type=str, required=True, help="Server type")
parser.add_argument("--interface", type=str, required=True, help="Wireguard interface (e.g., wg0)")
parser.add_argument("--config_path", type=str, help="Path to the Wireguard configuration file")
args = parser.parse_args()
provider = args.provider
location = args.location
server_type = args.server_type
interface = args.interface
config_path = args.config_path
# Step 1: Get Hetzner client and list existing servers
client = get_hetzner_client()
existing_servers = list_hetzner_servers(client)
# Step 2: Run the update_local_config.py script
run_update_script(provider, location, server_type, interface, config_path)
# Step 3: Delete old servers that existed before running the update script
for server in existing_servers:
delete_hetzner_server(client, server)
print(f"Deleted server: {server.name}")
if __name__ == "__main__":
main()