You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

210 lines
6.2 KiB

  1. # Define CloudComp group number
  2. variable "group_number" {
  3. type = string
  4. default = "32"
  5. }
  6. ## OpenStack credentials can be used in a more secure way by using
  7. ## cloud.yaml from https://private-cloud.informatik.hs-fulda.de/project/api_access/clouds.yaml/
  8. # or by using env vars exported from openrc here,
  9. # e.g., using 'export TF_VAR_os_password=$OS_PASSWORD'
  10. # Define OpenStack credentials, project config etc.
  11. locals {
  12. auth_url = "https://10.32.4.182:5000/v3"
  13. user_name = "CloudComp32"
  14. user_password = "demo"
  15. tenant_name = "CloudComp${var.group_number}"
  16. #network_name = "CloudComp${var.group_number}-net"
  17. router_name = "CloudComp${var.group_number}-router"
  18. image_name = "ubuntu-22.04-jammy-x86_64"
  19. flavor_name = "m1.small"
  20. region_name = "RegionOne"
  21. floating_net = "ext_net"
  22. dns_nameservers = [ "10.33.16.100" ]
  23. }
  24. # Define OpenStack provider
  25. terraform {
  26. required_version = ">= 0.14.0"
  27. required_providers {
  28. openstack = {
  29. source = "terraform-provider-openstack/openstack"
  30. # last version before 2.0.0, shows octavia/neutron lbaas deprecation warnings
  31. # "~> 1.54.1"
  32. version = ">= 2.0.0"
  33. }
  34. }
  35. }
  36. # Configure the OpenStack Provider
  37. provider "openstack" {
  38. user_name = local.user_name
  39. tenant_name = local.tenant_name
  40. password = local.user_password
  41. auth_url = local.auth_url
  42. region = local.region_name
  43. # due to currenty missing valid certificate
  44. insecure = true
  45. }
  46. ###########################################################################
  47. #
  48. # create keypair
  49. #
  50. ###########################################################################
  51. # import keypair, if public_key is not specified, create new keypair to use
  52. resource "openstack_compute_keypair_v2" "terraform-keypair" {
  53. name = "my-terraform-pubkey"
  54. #public_key = file("~/.ssh/id_rsa.pub")
  55. }
  56. ###########################################################################
  57. #
  58. # create security group
  59. #
  60. ###########################################################################
  61. resource "openstack_networking_secgroup_v2" "terraform-secgroup" {
  62. name = "my-terraform-secgroup"
  63. description = "for terraform instances"
  64. }
  65. resource "openstack_networking_secgroup_rule_v2" "terraform-secgroup-rule-http" {
  66. direction = "ingress"
  67. ethertype = "IPv4"
  68. protocol = "tcp"
  69. port_range_min = 80
  70. port_range_max = 80
  71. #remote_ip_prefix = "0.0.0.0/0"
  72. security_group_id = openstack_networking_secgroup_v2.terraform-secgroup.id
  73. }
  74. resource "openstack_networking_secgroup_rule_v2" "terraform-secgroup-rule-ssh" {
  75. direction = "ingress"
  76. ethertype = "IPv4"
  77. protocol = "tcp"
  78. port_range_min = 22
  79. port_range_max = 22
  80. #remote_ip_prefix = "0.0.0.0/0"
  81. security_group_id = openstack_networking_secgroup_v2.terraform-secgroup.id
  82. }
  83. ###########################################################################
  84. #
  85. # create network
  86. #
  87. ###########################################################################
  88. resource "openstack_networking_network_v2" "terraform-network-1" {
  89. name = "my-terraform-network-1"
  90. admin_state_up = "true"
  91. }
  92. resource "openstack_networking_subnet_v2" "terraform-subnet-1" {
  93. name = "my-terraform-subnet-1"
  94. network_id = openstack_networking_network_v2.terraform-network-1.id
  95. cidr = "192.168.255.0/24"
  96. ip_version = 4
  97. dns_nameservers = local.dns_nameservers
  98. }
  99. resource "openstack_networking_port_v2" "port_1" {
  100. name = "port_1"
  101. network_id = openstack_networking_network_v2.terraform-network-1.id
  102. admin_state_up = "true"
  103. fixed_ip {
  104. subnet_id = openstack_networking_subnet_v2.terraform-subnet-1.id
  105. }
  106. }
  107. data "openstack_networking_router_v2" "router-1" {
  108. name = local.router_name
  109. }
  110. resource "openstack_networking_router_interface_v2" "router_interface_1" {
  111. router_id = data.openstack_networking_router_v2.router-1.id
  112. subnet_id = openstack_networking_subnet_v2.terraform-subnet-1.id
  113. }
  114. ###########################################################################
  115. #
  116. # create instances
  117. #
  118. ###########################################################################
  119. resource "openstack_compute_instance_v2" "terraform-instance-1" {
  120. name = "my-terraform-instance-1"
  121. image_name = local.image_name
  122. flavor_name = local.flavor_name
  123. key_pair = openstack_compute_keypair_v2.terraform-keypair.name
  124. security_groups = [openstack_networking_secgroup_v2.terraform-secgroup.name]
  125. depends_on = [openstack_networking_subnet_v2.terraform-subnet-1]
  126. network {
  127. uuid = openstack_networking_network_v2.terraform-network-1.id
  128. }
  129. user_data = <<-EOF
  130. #!/bin/bash
  131. apt-get update
  132. apt-get -y install apache2
  133. rm /var/www/html/index.html
  134. cat > /var/www/html/index.html << INNEREOF
  135. <!DOCTYPE html>
  136. <html>
  137. <body>
  138. <h1>It works!</h1>
  139. <p>hostname</p>
  140. </body>
  141. </html>
  142. INNEREOF
  143. sed -i "s/hostname/terraform-instance-1/" /var/www/html/index.html
  144. sed -i "1s/$/ terraform-instance-1/" /etc/hosts
  145. EOF
  146. }
  147. ###########################################################################
  148. #
  149. # assign floating ip to instance
  150. #
  151. ###########################################################################
  152. resource "openstack_networking_floatingip_v2" "fip_1" {
  153. pool = local.floating_net
  154. }
  155. resource "openstack_networking_floatingip_associate_v2" "terraform-instance-1-ip" {
  156. floating_ip = openstack_networking_floatingip_v2.fip_1.address
  157. port_id = "port_1"
  158. }
  159. # does work, though openstack_compute_floatingip_associate_v2 is deprecated,
  160. # openstack_compute_instance_v2.terraform-instance-1.network[0].port is empty after instance creation: ""
  161. #
  162. #resource "openstack_networking_floatingip_associate_v2" "terraform-instance-1-ip" {
  163. # floating_ip = openstack_networking_floatingip_v2.fip_1.address
  164. # port_id = openstack_compute_instance_v2.terraform-instance-1.network[0].port
  165. #}
  166. #
  167. # even better, as soon as openstack_compute_instance_v2.terraform-instance-1.network[0].port is not "":
  168. #resource "openstack_networking_floatingip_v2" "fip_1" {
  169. # pool = local.floating_net
  170. # port_id = openstack_compute_instance_v2.terraform-instance-1.network[0].port
  171. #}
  172. output "vip_addr" {
  173. value = openstack_networking_floatingip_v2.fip_1
  174. }