diff --git a/beispiel-terraform/README.md b/beispiel-terraform/README.md new file mode 100644 index 0000000..fc791a8 --- /dev/null +++ b/beispiel-terraform/README.md @@ -0,0 +1,128 @@ +# Trusted AI Demo - OpenTofu Infrastructure + +This project contains OpenTofu/Terraform configuration for the Trusted AI Demo infrastructure on Azure. + +## Infrastructure Components + +This configuration creates: + +- **Resource Group**: Container for all Azure resources +- **Virtual Network**: 10.0.0.0/16 address space +- **Subnet**: 10.0.1.0/24 for VM placement +- **Network Security Group**: With RDP (port 3389) rule for remote access +- **Public IP**: Static public IP for VM access +- **Network Interface**: Connects VM to the virtual network +- **Windows Server 2022 VM**: Standard_B2s (2 vCPUs, 4 GB RAM) + +## Prerequisites + +- [OpenTofu](https://opentofu.org/) >= 1.0 or [Terraform](https://www.terraform.io/) >= 1.0 +- Azure CLI configured with appropriate credentials +- Azure subscription with necessary permissions + +## Getting Started + +### 1. Authenticate with Azure + +```bash +az login +az account set --subscription "" +``` + +### 2. Initialize OpenTofu + +```bash +tofu init +``` + +Or if using Terraform: + +```bash +terraform init +``` + +### 3. Review the Plan + +```bash +tofu plan +``` + +### 4. Apply the Configuration + +```bash +tofu apply +``` + +## Project Structure + +- `main.tf` - Main infrastructure configuration +- `variables.tf` - Input variable definitions +- `outputs.tf` - Output value definitions +- `terraform.tfvars.example` - Example variable values (copy to `terraform.tfvars`) + +## Configuration + +### Required Configuration + +1. Copy the example variables file: + ```bash + cp terraform.tfvars.example terraform.tfvars + ``` + +2. Edit `terraform.tfvars` and set your admin password: + ```hcl + admin_password = "YourSecurePassword123!" + ``` + + **Important**: The password must be at least 12 characters long and contain uppercase, lowercase, and numbers. + +3. **Security Recommendation**: Change `allowed_rdp_source` to your public IP address instead of `"*"`: + ```hcl + allowed_rdp_source = "YOUR_PUBLIC_IP/32" + ``` + + You can find your public IP with: + ```bash + curl ifconfig.me + ``` + +### Optional Customization + +You can also customize: +- `resource_group_name`: Name of the resource group +- `location`: Azure region (default: westeurope) +- `vm_name`: Name of the virtual machine +- `vm_size`: VM size (default: Standard_B2s) +- `vnet_address_space`: Virtual network address space +- `subnet_address_prefix`: Subnet address prefix + +## Connecting to the VM + +After the infrastructure is created, you can connect to the Windows VM via RDP: + +1. Get the public IP address: + ```bash + tofu output vm_public_ip + ``` + +2. Connect using Remote Desktop: + - **Windows**: Use the connection string from output: + ```bash + tofu output rdp_connection_string + ``` + - **macOS**: Use Microsoft Remote Desktop app + - **Linux**: Use Remmina or similar RDP client + +3. Login credentials: + - Username: The value you set for `admin_username` (default: azureadmin) + - Password: The password you set in `terraform.tfvars` + +## Cleanup + +To destroy all resources: + +```bash +tofu destroy +``` + +**Warning**: This will permanently delete all resources created by this configuration. diff --git a/beispiel-terraform/main.tf b/beispiel-terraform/main.tf new file mode 100644 index 0000000..06c4cca --- /dev/null +++ b/beispiel-terraform/main.tf @@ -0,0 +1,123 @@ +terraform { + required_version = ">= 1.0" + + required_providers { + azurerm = { + source = "hashicorp/azurerm" + version = "~> 3.0" + } + } +} + +provider "azurerm" { + features {} +} + +# Resource Group +resource "azurerm_resource_group" "main" { + name = var.resource_group_name + location = var.location + + tags = var.tags +} + +# Virtual Network +resource "azurerm_virtual_network" "main" { + name = "${var.resource_group_name}-vnet" + address_space = [var.vnet_address_space] + location = azurerm_resource_group.main.location + resource_group_name = azurerm_resource_group.main.name + + tags = var.tags +} + +# Subnet +resource "azurerm_subnet" "main" { + name = "default" + resource_group_name = azurerm_resource_group.main.name + virtual_network_name = azurerm_virtual_network.main.name + address_prefixes = [var.subnet_address_prefix] +} + +# Network Security Group +resource "azurerm_network_security_group" "main" { + name = "${var.vm_name}-nsg" + location = azurerm_resource_group.main.location + resource_group_name = azurerm_resource_group.main.name + + security_rule { + name = "SSH" + priority = 1001 + direction = "Inbound" + access = "Allow" + protocol = "Tcp" + source_port_range = "*" + destination_port_range = "22" + source_address_prefix = var.allowed_ssh_source + destination_address_prefix = "*" + } + + tags = var.tags +} + +# Public IP +resource "azurerm_public_ip" "main" { + name = "${var.vm_name}-pip" + location = azurerm_resource_group.main.location + resource_group_name = azurerm_resource_group.main.name + allocation_method = "Static" + sku = "Standard" + + tags = var.tags +} + +# Network Interface +resource "azurerm_network_interface" "main" { + name = "${var.vm_name}-nic" + location = azurerm_resource_group.main.location + resource_group_name = azurerm_resource_group.main.name + + ip_configuration { + name = "internal" + subnet_id = azurerm_subnet.main.id + private_ip_address_allocation = "Dynamic" + public_ip_address_id = azurerm_public_ip.main.id + } + + tags = var.tags +} + +# Associate NSG with Network Interface +resource "azurerm_network_interface_security_group_association" "main" { + network_interface_id = azurerm_network_interface.main.id + network_security_group_id = azurerm_network_security_group.main.id +} + +# Linux Virtual Machine +resource "azurerm_linux_virtual_machine" "main" { + name = var.vm_name + resource_group_name = azurerm_resource_group.main.name + location = azurerm_resource_group.main.location + size = var.vm_size + admin_username = var.admin_username + admin_password = var.admin_password + disable_password_authentication = false + + network_interface_ids = [ + azurerm_network_interface.main.id, + ] + + os_disk { + caching = "ReadWrite" + storage_account_type = "Standard_LRS" + } + + source_image_reference { + publisher = "Canonical" + offer = "0001-com-ubuntu-server-jammy" + sku = "22_04-lts-gen2" + version = "latest" + } + + tags = var.tags +} diff --git a/beispiel-terraform/outputs.tf b/beispiel-terraform/outputs.tf new file mode 100644 index 0000000..afefb82 --- /dev/null +++ b/beispiel-terraform/outputs.tf @@ -0,0 +1,56 @@ +output "resource_group_name" { + description = "Name of the created resource group" + value = azurerm_resource_group.main.name +} + +output "resource_group_id" { + description = "ID of the created resource group" + value = azurerm_resource_group.main.id +} + +output "location" { + description = "Location of the resource group" + value = azurerm_resource_group.main.location +} + +# Network Outputs +output "vnet_name" { + description = "Name of the virtual network" + value = azurerm_virtual_network.main.name +} + +output "vnet_id" { + description = "ID of the virtual network" + value = azurerm_virtual_network.main.id +} + +output "subnet_id" { + description = "ID of the subnet" + value = azurerm_subnet.main.id +} + +# VM Outputs +output "vm_name" { + description = "Name of the virtual machine" + value = azurerm_linux_virtual_machine.main.name +} + +output "vm_id" { + description = "ID of the virtual machine" + value = azurerm_linux_virtual_machine.main.id +} + +output "vm_private_ip" { + description = "Private IP address of the VM" + value = azurerm_network_interface.main.private_ip_address +} + +output "vm_public_ip" { + description = "Public IP address of the VM" + value = azurerm_public_ip.main.ip_address +} + +output "ssh_connection_string" { + description = "SSH connection string for the VM" + value = "ssh ${azurerm_linux_virtual_machine.main.admin_username}@${azurerm_public_ip.main.ip_address}" +} diff --git a/beispiel-terraform/terraform.tfstate b/beispiel-terraform/terraform.tfstate new file mode 100644 index 0000000..3353b08 --- /dev/null +++ b/beispiel-terraform/terraform.tfstate @@ -0,0 +1 @@ +{"version":4,"terraform_version":"1.11.1","serial":11,"lineage":"cad35d7f-13a9-933b-a7ef-af99f16a5d08","outputs":{},"resources":[],"check_results":null} diff --git a/beispiel-terraform/terraform.tfstate.backup b/beispiel-terraform/terraform.tfstate.backup new file mode 100644 index 0000000..fd79379 --- /dev/null +++ b/beispiel-terraform/terraform.tfstate.backup @@ -0,0 +1 @@ +{"version":4,"terraform_version":"1.11.1","serial":7,"lineage":"cad35d7f-13a9-933b-a7ef-af99f16a5d08","outputs":{"location":{"value":"austriaeast","type":"string"},"resource_group_id":{"value":"/subscriptions/77677a80-2dea-493d-9867-f1c961b80fb3/resourceGroups/rg-trusted-ai-demo","type":"string"},"resource_group_name":{"value":"rg-trusted-ai-demo","type":"string"},"ssh_connection_string":{"value":"ssh azureadmin@68.210.97.125","type":"string"},"subnet_id":{"value":"/subscriptions/77677a80-2dea-493d-9867-f1c961b80fb3/resourceGroups/rg-trusted-ai-demo/providers/Microsoft.Network/virtualNetworks/rg-trusted-ai-demo-vnet/subnets/default","type":"string"},"vm_id":{"value":"/subscriptions/77677a80-2dea-493d-9867-f1c961b80fb3/resourceGroups/rg-trusted-ai-demo/providers/Microsoft.Compute/virtualMachines/vm-trusted-ai","type":"string"},"vm_name":{"value":"vm-trusted-ai","type":"string"},"vm_private_ip":{"value":"10.0.1.4","type":"string"},"vm_public_ip":{"value":"68.210.97.125","type":"string"},"vnet_id":{"value":"/subscriptions/77677a80-2dea-493d-9867-f1c961b80fb3/resourceGroups/rg-trusted-ai-demo/providers/Microsoft.Network/virtualNetworks/rg-trusted-ai-demo-vnet","type":"string"},"vnet_name":{"value":"rg-trusted-ai-demo-vnet","type":"string"}},"resources":[{"mode":"managed","type":"azurerm_linux_virtual_machine","name":"main","provider":"provider[\"registry.opentofu.org/hashicorp/azurerm\"]","instances":[{"schema_version":0,"attributes":{"additional_capabilities":[],"admin_password":"Hab2009Keins!","admin_ssh_key":[],"admin_username":"azureadmin","allow_extension_operations":true,"availability_set_id":"","boot_diagnostics":[],"bypass_platform_safety_checks_on_user_schedule_enabled":false,"capacity_reservation_group_id":"","computer_name":"vm-trusted-ai","custom_data":null,"dedicated_host_group_id":"","dedicated_host_id":"","disable_password_authentication":false,"disk_controller_type":"SCSI","edge_zone":"","encryption_at_host_enabled":false,"eviction_policy":"","extensions_time_budget":"PT1H30M","gallery_application":[],"id":"/subscriptions/77677a80-2dea-493d-9867-f1c961b80fb3/resourceGroups/rg-trusted-ai-demo/providers/Microsoft.Compute/virtualMachines/vm-trusted-ai","identity":[],"license_type":"","location":"austriaeast","max_bid_price":-1,"name":"vm-trusted-ai","network_interface_ids":["/subscriptions/77677a80-2dea-493d-9867-f1c961b80fb3/resourceGroups/rg-trusted-ai-demo/providers/Microsoft.Network/networkInterfaces/vm-trusted-ai-nic"],"os_disk":[{"caching":"ReadWrite","diff_disk_settings":[],"disk_encryption_set_id":"","disk_size_gb":30,"name":"vm-trusted-ai_OsDisk_1_26ed4d6fa684410abb7d858ef85be362","secure_vm_disk_encryption_set_id":"","security_encryption_type":"","storage_account_type":"Standard_LRS","write_accelerator_enabled":false}],"os_image_notification":[],"patch_assessment_mode":"ImageDefault","patch_mode":"ImageDefault","plan":[],"platform_fault_domain":-1,"priority":"Regular","private_ip_address":"10.0.1.4","private_ip_addresses":["10.0.1.4"],"provision_vm_agent":true,"proximity_placement_group_id":"","public_ip_address":"68.210.97.125","public_ip_addresses":["68.210.97.125"],"reboot_setting":"","resource_group_name":"rg-trusted-ai-demo","secret":[],"secure_boot_enabled":false,"size":"Standard_B2ats_v2","source_image_id":"","source_image_reference":[{"offer":"0001-com-ubuntu-server-jammy","publisher":"Canonical","sku":"22_04-lts-gen2","version":"latest"}],"tags":{"Environment":"dev","ManagedBy":"OpenTofu","Project":"trusted-ai-demo"},"termination_notification":null,"timeouts":null,"user_data":"","virtual_machine_id":"c0bc058a-065f-44e0-9bf7-e9343e91e666","virtual_machine_scale_set_id":"","vm_agent_platform_updates_enabled":false,"vtpm_enabled":false,"zone":""},"sensitive_attributes":[[{"type":"get_attr","value":"admin_password"}],[{"type":"get_attr","value":"custom_data"}]],"private":"eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoyNzAwMDAwMDAwMDAwLCJkZWxldGUiOjI3MDAwMDAwMDAwMDAsInJlYWQiOjMwMDAwMDAwMDAwMCwidXBkYXRlIjoyNzAwMDAwMDAwMDAwfX0=","dependencies":["azurerm_network_interface.main","azurerm_public_ip.main","azurerm_resource_group.main","azurerm_subnet.main","azurerm_virtual_network.main"]}]},{"mode":"managed","type":"azurerm_network_interface","name":"main","provider":"provider[\"registry.opentofu.org/hashicorp/azurerm\"]","instances":[{"schema_version":0,"attributes":{"accelerated_networking_enabled":false,"applied_dns_servers":[],"auxiliary_mode":"","auxiliary_sku":"","dns_servers":[],"edge_zone":"","enable_accelerated_networking":false,"enable_ip_forwarding":false,"id":"/subscriptions/77677a80-2dea-493d-9867-f1c961b80fb3/resourceGroups/rg-trusted-ai-demo/providers/Microsoft.Network/networkInterfaces/vm-trusted-ai-nic","internal_dns_name_label":"","internal_domain_name_suffix":"cu22vk1awgdetoispofbty41oa.viex.internal.cloudapp.net","ip_configuration":[{"gateway_load_balancer_frontend_ip_configuration_id":"","name":"internal","primary":true,"private_ip_address":"10.0.1.4","private_ip_address_allocation":"Dynamic","private_ip_address_version":"IPv4","public_ip_address_id":"/subscriptions/77677a80-2dea-493d-9867-f1c961b80fb3/resourceGroups/rg-trusted-ai-demo/providers/Microsoft.Network/publicIPAddresses/vm-trusted-ai-pip","subnet_id":"/subscriptions/77677a80-2dea-493d-9867-f1c961b80fb3/resourceGroups/rg-trusted-ai-demo/providers/Microsoft.Network/virtualNetworks/rg-trusted-ai-demo-vnet/subnets/default"}],"ip_forwarding_enabled":false,"location":"austriaeast","mac_address":"7C-1E-52-8E-8B-F8","name":"vm-trusted-ai-nic","private_ip_address":"10.0.1.4","private_ip_addresses":["10.0.1.4"],"resource_group_name":"rg-trusted-ai-demo","tags":{"Environment":"dev","ManagedBy":"OpenTofu","Project":"trusted-ai-demo"},"timeouts":null,"virtual_machine_id":"/subscriptions/77677a80-2dea-493d-9867-f1c961b80fb3/resourceGroups/rg-trusted-ai-demo/providers/Microsoft.Compute/virtualMachines/vm-trusted-ai"},"sensitive_attributes":[],"private":"eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxODAwMDAwMDAwMDAwLCJkZWxldGUiOjE4MDAwMDAwMDAwMDAsInJlYWQiOjMwMDAwMDAwMDAwMCwidXBkYXRlIjoxODAwMDAwMDAwMDAwfX0=","dependencies":["azurerm_public_ip.main","azurerm_resource_group.main","azurerm_subnet.main","azurerm_virtual_network.main"]}]},{"mode":"managed","type":"azurerm_network_interface_security_group_association","name":"main","provider":"provider[\"registry.opentofu.org/hashicorp/azurerm\"]","instances":[{"schema_version":0,"attributes":{"id":"/subscriptions/77677a80-2dea-493d-9867-f1c961b80fb3/resourceGroups/rg-trusted-ai-demo/providers/Microsoft.Network/networkInterfaces/vm-trusted-ai-nic|/subscriptions/77677a80-2dea-493d-9867-f1c961b80fb3/resourceGroups/rg-trusted-ai-demo/providers/Microsoft.Network/networkSecurityGroups/vm-trusted-ai-nsg","network_interface_id":"/subscriptions/77677a80-2dea-493d-9867-f1c961b80fb3/resourceGroups/rg-trusted-ai-demo/providers/Microsoft.Network/networkInterfaces/vm-trusted-ai-nic","network_security_group_id":"/subscriptions/77677a80-2dea-493d-9867-f1c961b80fb3/resourceGroups/rg-trusted-ai-demo/providers/Microsoft.Network/networkSecurityGroups/vm-trusted-ai-nsg","timeouts":null},"sensitive_attributes":[],"private":"eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxODAwMDAwMDAwMDAwLCJkZWxldGUiOjE4MDAwMDAwMDAwMDAsInJlYWQiOjMwMDAwMDAwMDAwMH19","dependencies":["azurerm_network_interface.main","azurerm_network_security_group.main","azurerm_public_ip.main","azurerm_resource_group.main","azurerm_subnet.main","azurerm_virtual_network.main"]}]},{"mode":"managed","type":"azurerm_network_security_group","name":"main","provider":"provider[\"registry.opentofu.org/hashicorp/azurerm\"]","instances":[{"schema_version":0,"attributes":{"id":"/subscriptions/77677a80-2dea-493d-9867-f1c961b80fb3/resourceGroups/rg-trusted-ai-demo/providers/Microsoft.Network/networkSecurityGroups/vm-trusted-ai-nsg","location":"austriaeast","name":"vm-trusted-ai-nsg","resource_group_name":"rg-trusted-ai-demo","security_rule":[{"access":"Allow","description":"","destination_address_prefix":"*","destination_address_prefixes":[],"destination_application_security_group_ids":[],"destination_port_range":"22","destination_port_ranges":[],"direction":"Inbound","name":"SSH","priority":1001,"protocol":"Tcp","source_address_prefix":"*","source_address_prefixes":[],"source_application_security_group_ids":[],"source_port_range":"*","source_port_ranges":[]}],"tags":{"Environment":"dev","ManagedBy":"OpenTofu","Project":"trusted-ai-demo"},"timeouts":null},"sensitive_attributes":[],"private":"eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxODAwMDAwMDAwMDAwLCJkZWxldGUiOjE4MDAwMDAwMDAwMDAsInJlYWQiOjMwMDAwMDAwMDAwMCwidXBkYXRlIjoxODAwMDAwMDAwMDAwfX0=","dependencies":["azurerm_resource_group.main"]}]},{"mode":"managed","type":"azurerm_public_ip","name":"main","provider":"provider[\"registry.opentofu.org/hashicorp/azurerm\"]","instances":[{"schema_version":0,"attributes":{"allocation_method":"Static","ddos_protection_mode":"VirtualNetworkInherited","ddos_protection_plan_id":null,"domain_name_label":null,"edge_zone":"","fqdn":null,"id":"/subscriptions/77677a80-2dea-493d-9867-f1c961b80fb3/resourceGroups/rg-trusted-ai-demo/providers/Microsoft.Network/publicIPAddresses/vm-trusted-ai-pip","idle_timeout_in_minutes":4,"ip_address":"68.210.97.125","ip_tags":{},"ip_version":"IPv4","location":"austriaeast","name":"vm-trusted-ai-pip","public_ip_prefix_id":null,"resource_group_name":"rg-trusted-ai-demo","reverse_fqdn":null,"sku":"Standard","sku_tier":"Regional","tags":{"Environment":"dev","ManagedBy":"OpenTofu","Project":"trusted-ai-demo"},"timeouts":null,"zones":[]},"sensitive_attributes":[],"private":"eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxODAwMDAwMDAwMDAwLCJkZWxldGUiOjE4MDAwMDAwMDAwMDAsInJlYWQiOjMwMDAwMDAwMDAwMCwidXBkYXRlIjoxODAwMDAwMDAwMDAwfSwic2NoZW1hX3ZlcnNpb24iOiIwIn0=","dependencies":["azurerm_resource_group.main"]}]},{"mode":"managed","type":"azurerm_resource_group","name":"main","provider":"provider[\"registry.opentofu.org/hashicorp/azurerm\"]","instances":[{"schema_version":0,"attributes":{"id":"/subscriptions/77677a80-2dea-493d-9867-f1c961b80fb3/resourceGroups/rg-trusted-ai-demo","location":"austriaeast","managed_by":"","name":"rg-trusted-ai-demo","tags":{"Environment":"dev","ManagedBy":"OpenTofu","Project":"trusted-ai-demo"},"timeouts":null},"sensitive_attributes":[],"private":"eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjo1NDAwMDAwMDAwMDAwLCJkZWxldGUiOjU0MDAwMDAwMDAwMDAsInJlYWQiOjMwMDAwMDAwMDAwMCwidXBkYXRlIjo1NDAwMDAwMDAwMDAwfX0="}]},{"mode":"managed","type":"azurerm_subnet","name":"main","provider":"provider[\"registry.opentofu.org/hashicorp/azurerm\"]","instances":[{"schema_version":0,"attributes":{"address_prefixes":["10.0.1.0/24"],"default_outbound_access_enabled":true,"delegation":[],"enforce_private_link_endpoint_network_policies":false,"enforce_private_link_service_network_policies":false,"id":"/subscriptions/77677a80-2dea-493d-9867-f1c961b80fb3/resourceGroups/rg-trusted-ai-demo/providers/Microsoft.Network/virtualNetworks/rg-trusted-ai-demo-vnet/subnets/default","name":"default","private_endpoint_network_policies":"Enabled","private_endpoint_network_policies_enabled":true,"private_link_service_network_policies_enabled":true,"resource_group_name":"rg-trusted-ai-demo","service_endpoint_policy_ids":[],"service_endpoints":[],"timeouts":null,"virtual_network_name":"rg-trusted-ai-demo-vnet"},"sensitive_attributes":[],"private":"eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxODAwMDAwMDAwMDAwLCJkZWxldGUiOjE4MDAwMDAwMDAwMDAsInJlYWQiOjMwMDAwMDAwMDAwMCwidXBkYXRlIjoxODAwMDAwMDAwMDAwfX0=","dependencies":["azurerm_resource_group.main","azurerm_virtual_network.main"]}]},{"mode":"managed","type":"azurerm_virtual_network","name":"main","provider":"provider[\"registry.opentofu.org/hashicorp/azurerm\"]","instances":[{"schema_version":0,"attributes":{"address_space":["10.0.0.0/16"],"bgp_community":"","ddos_protection_plan":[],"dns_servers":[],"edge_zone":"","encryption":[],"flow_timeout_in_minutes":0,"guid":"abca3915-b160-4986-b912-7b8a19e3db70","id":"/subscriptions/77677a80-2dea-493d-9867-f1c961b80fb3/resourceGroups/rg-trusted-ai-demo/providers/Microsoft.Network/virtualNetworks/rg-trusted-ai-demo-vnet","location":"austriaeast","name":"rg-trusted-ai-demo-vnet","resource_group_name":"rg-trusted-ai-demo","subnet":[{"address_prefix":"10.0.1.0/24","id":"/subscriptions/77677a80-2dea-493d-9867-f1c961b80fb3/resourceGroups/rg-trusted-ai-demo/providers/Microsoft.Network/virtualNetworks/rg-trusted-ai-demo-vnet/subnets/default","name":"default","security_group":""}],"tags":{"Environment":"dev","ManagedBy":"OpenTofu","Project":"trusted-ai-demo"},"timeouts":null},"sensitive_attributes":[],"private":"eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxODAwMDAwMDAwMDAwLCJkZWxldGUiOjE4MDAwMDAwMDAwMDAsInJlYWQiOjMwMDAwMDAwMDAwMCwidXBkYXRlIjoxODAwMDAwMDAwMDAwfX0=","dependencies":["azurerm_resource_group.main"]}]}],"check_results":null} diff --git a/beispiel-terraform/terraform.tfvars b/beispiel-terraform/terraform.tfvars new file mode 100644 index 0000000..0366df6 --- /dev/null +++ b/beispiel-terraform/terraform.tfvars @@ -0,0 +1,23 @@ +# Copy this file to terraform.tfvars and customize as needed + +# Resource Group Configuration +resource_group_name = "rg-trusted-ai-demo" +location = "austriaeast" + +# Network Configuration +vnet_address_space = "10.0.0.0/16" +subnet_address_prefix = "10.0.1.0/24" +allowed_ssh_source = "*" # Change to your public IP for better security, e.g., "1.2.3.4/32" + +# Virtual Machine Configuration +vm_name = "vm-trusted-ai" +vm_size = "Standard_B2ats_v2" +admin_username = "azureadmin" +admin_password = "Hab2009Keins!" + +# Tags +tags = { + Environment = "dev" + Project = "trusted-ai-demo" + ManagedBy = "OpenTofu" +} diff --git a/beispiel-terraform/terraform.tfvars.example b/beispiel-terraform/terraform.tfvars.example new file mode 100644 index 0000000..353f170 --- /dev/null +++ b/beispiel-terraform/terraform.tfvars.example @@ -0,0 +1,23 @@ +# Copy this file to terraform.tfvars and customize as needed + +# Resource Group Configuration +resource_group_name = "rg-trusted-ai-demo" +location = "westus" + +# Network Configuration +vnet_address_space = "10.0.0.0/16" +subnet_address_prefix = "10.0.1.0/24" +allowed_rdp_source = "*" # Change to your public IP for better security, e.g., "1.2.3.4/32" + +# Virtual Machine Configuration +vm_name = "vm-trusted-ai" +vm_size = "Standard_B2s" +admin_username = "azureadmin" +admin_password = "YourSecurePassword123!" # IMPORTANT: Change this! Min 12 characters, must include upper, lower, number + +# Tags +tags = { + Environment = "dev" + Project = "trusted-ai-demo" + ManagedBy = "OpenTofu" +} diff --git a/beispiel-terraform/variables.tf b/beispiel-terraform/variables.tf new file mode 100644 index 0000000..d2abc25 --- /dev/null +++ b/beispiel-terraform/variables.tf @@ -0,0 +1,65 @@ +variable "resource_group_name" { + description = "Name of the resource group" + type = string + default = "rg-trusted-ai-demo" +} + +variable "location" { + description = "Azure region for resources" + type = string + default = "austriaeast" +} + +variable "tags" { + description = "Tags to apply to all resources" + type = map(string) + default = { + Environment = "dev" + Project = "trusted-ai-demo" + ManagedBy = "OpenTofu" + } +} + +# Network Configuration +variable "vnet_address_space" { + description = "Address space for the virtual network" + type = string + default = "10.0.0.0/16" +} + +variable "subnet_address_prefix" { + description = "Address prefix for the subnet" + type = string + default = "10.0.1.0/24" +} + +variable "allowed_ssh_source" { + description = "Source IP address or range allowed to SSH to the VM (use your public IP or '*' for any - not recommended)" + type = string + default = "*" +} + +# Virtual Machine Configuration +variable "vm_name" { + description = "Name of the virtual machine" + type = string + default = "vm-trusted-ai" +} + +variable "vm_size" { + description = "Size of the virtual machine" + type = string + default = "Standard_B2s" +} + +variable "admin_username" { + description = "Admin username for the virtual machine" + type = string + default = "azureadmin" +} + +variable "admin_password" { + description = "Admin password for the virtual machine (use strong password, min 12 characters)" + type = string + sensitive = true +}