feat(terraform): Remove ansible dependency
[csit.git] / fdio.infra.terraform / terraform-aws-2n-c7gn / main.tf
1 data "vault_aws_access_credentials" "creds" {
2   backend = "${var.vault-name}-path"
3   role    = "${var.vault-name}-role"
4 }
5
6 locals {
7   ansible_python_executable = "/usr/bin/python3"
8   availability_zone         = "eu-central-1b"
9   name                      = "csit-vpc"
10   environment               = "csit-vpc-environment"
11   key_pair_key_name         = "${var.resource_prefix}-${var.testbed_name}-pk"
12   placement_group_name      = "${var.resource_prefix}-${var.testbed_name}-pg"
13   security_group_name       = "${var.resource_prefix}-${var.testbed_name}-sg"
14   testbed_name              = "testbed1"
15   topology_name             = "2n-c7gn"
16   tg_name                   = "${var.resource_prefix}-${var.testbed_name}-tg"
17   sut1_name                 = "${var.resource_prefix}-${var.testbed_name}-sut1"
18 }
19
20 # Create VPC
21 module "vpc" {
22   source                   = "../terraform-aws-vpc"
23   security_group_name      = local.security_group_name
24   subnet_availability_zone = local.availability_zone
25   tags_name                = local.name
26   tags_environment         = local.environment
27   vpc_enable_dns_hostnames = false
28 }
29
30 # Create Subnet
31 module "subnet_b" {
32   source                   = "../terraform-aws-subnet"
33   subnet_cidr_block        = "192.168.10.0/24"
34   subnet_ipv6_cidr_block   = cidrsubnet(module.vpc.vpc_ipv6_cidr_block, 8, 2)
35   subnet_availability_zone = local.availability_zone
36   tags_name                = local.name
37   tags_environment         = local.environment
38   subnet_vpc_id            = module.vpc.vpc_id
39 }
40
41 module "subnet_d" {
42   source                   = "../terraform-aws-subnet"
43   subnet_cidr_block        = "192.168.20.0/24"
44   subnet_ipv6_cidr_block   = cidrsubnet(module.vpc.vpc_ipv6_cidr_block, 8, 4)
45   subnet_availability_zone = local.availability_zone
46   tags_name                = local.name
47   tags_environment         = local.environment
48   subnet_vpc_id            = module.vpc.vpc_id
49 }
50
51 # Create Private Key
52 module "private_key" {
53   source  = "pmikus/private-key/tls"
54   version = "4.0.4"
55
56   private_key_algorithm = var.private_key_algorithm
57 }
58
59 # Create Key Pair
60 module "key_pair" {
61   source  = "pmikus/key-pair/aws"
62   version = "5.7.0"
63
64   key_pair_key_name   = local.key_pair_key_name
65   key_pair_public_key = module.private_key.public_key_openssh
66
67   key_pair_tags = {
68     "Environment" = local.environment
69   }
70 }
71
72 # Create Placement Group
73 resource "aws_placement_group" "placement_group" {
74   name     = local.placement_group_name
75   strategy = var.placement_group_strategy
76 }
77
78 # Create Instance
79 resource "aws_instance" "tg" {
80   depends_on = [
81     module.vpc,
82     aws_placement_group.placement_group
83   ]
84   ami                                  = var.tg_ami
85   availability_zone                    = local.availability_zone
86   associate_public_ip_address          = var.tg_associate_public_ip_address
87   instance_initiated_shutdown_behavior = var.tg_instance_initiated_shutdown_behavior
88   instance_type                        = var.tg_instance_type
89   key_name                             = module.key_pair.key_pair_key_name
90   placement_group                      = aws_placement_group.placement_group.id
91   private_ip                           = var.tg_private_ip
92   source_dest_check                    = var.tg_source_dest_check
93   subnet_id                            = module.vpc.vpc_subnet_id
94   vpc_security_group_ids               = [module.vpc.vpc_security_group_id]
95   # host_id                            = "1"
96
97   root_block_device {
98     delete_on_termination = true
99     volume_size           = 50
100   }
101
102   tags = {
103     "Name"        = local.tg_name
104     "Environment" = local.environment
105   }
106 }
107
108 resource "aws_network_interface" "tg_if1" {
109   depends_on = [
110     module.subnet_b,
111     aws_instance.tg
112   ]
113   private_ip        = var.tg_if1_private_ip
114   private_ips       = [var.tg_if1_private_ip]
115   security_groups   = [module.vpc.vpc_security_group_id]
116   source_dest_check = var.tg_source_dest_check
117   subnet_id         = module.subnet_b.subnet_id
118
119   attachment {
120     instance     = aws_instance.tg.id
121     device_index = 1
122   }
123
124   tags = {
125     "Name"        = local.tg_name
126     "Environment" = local.environment
127   }
128 }
129
130 resource "aws_network_interface" "tg_if2" {
131   depends_on = [
132     module.subnet_d,
133     aws_instance.tg
134   ]
135   private_ip        = var.tg_if2_private_ip
136   private_ips       = [var.tg_if2_private_ip]
137   security_groups   = [module.vpc.vpc_security_group_id]
138   source_dest_check = var.tg_source_dest_check
139   subnet_id         = module.subnet_d.subnet_id
140
141   attachment {
142     instance     = aws_instance.tg.id
143     device_index = 2
144   }
145
146   tags = {
147     "Name"        = local.tg_name
148     "Environment" = local.environment
149   }
150 }
151
152 data "aws_network_interface" "tg_if1" {
153   id = aws_network_interface.tg_if1.id
154 }
155
156 data "aws_network_interface" "tg_if2" {
157   id = aws_network_interface.tg_if2.id
158 }
159
160 resource "aws_route" "route_tg_if1" {
161   depends_on = [
162     aws_instance.tg
163   ]
164   destination_cidr_block = var.destination_cidr_block_tg_if1
165   network_interface_id   = aws_instance.tg.primary_network_interface_id
166   route_table_id         = module.vpc.vpc_main_route_table_id
167 }
168
169 resource "aws_route" "route_tg_if2" {
170   depends_on = [
171     aws_instance.tg
172   ]
173   destination_cidr_block = var.destination_cidr_block_tg_if2
174   network_interface_id   = aws_instance.tg.primary_network_interface_id
175   route_table_id         = module.vpc.vpc_main_route_table_id
176 }
177
178 resource "aws_instance" "sut1" {
179   depends_on = [
180     module.vpc,
181     aws_placement_group.placement_group
182   ]
183   ami                                  = var.sut1_ami
184   availability_zone                    = local.availability_zone
185   associate_public_ip_address          = var.sut1_associate_public_ip_address
186   instance_initiated_shutdown_behavior = var.sut1_instance_initiated_shutdown_behavior
187   instance_type                        = var.sut1_instance_type
188   key_name                             = module.key_pair.key_pair_key_name
189   placement_group                      = aws_placement_group.placement_group.id
190   private_ip                           = var.sut1_private_ip
191   source_dest_check                    = var.sut1_source_dest_check
192   subnet_id                            = module.vpc.vpc_subnet_id
193   vpc_security_group_ids               = [module.vpc.vpc_security_group_id]
194   # host_id                            = "2"
195
196   root_block_device {
197     delete_on_termination = true
198     volume_size           = 50
199   }
200
201   tags = {
202     "Name"        = local.sut1_name
203     "Environment" = local.environment
204   }
205 }
206
207 resource "aws_network_interface" "sut1_if1" {
208   depends_on = [
209     module.subnet_b,
210     aws_instance.sut1
211   ]
212   private_ip        = var.sut1_if1_private_ip
213   private_ips       = [var.sut1_if1_private_ip]
214   security_groups   = [module.vpc.vpc_security_group_id]
215   source_dest_check = var.sut1_source_dest_check
216   subnet_id         = module.subnet_b.subnet_id
217
218   attachment {
219     instance     = aws_instance.sut1.id
220     device_index = 1
221   }
222
223   tags = {
224     "Name"        = local.sut1_name
225     "Environment" = local.environment
226   }
227 }
228
229 resource "aws_network_interface" "sut1_if2" {
230   depends_on = [
231     module.subnet_d,
232     aws_instance.sut1
233   ]
234   private_ip        = var.sut1_if2_private_ip
235   private_ips       = [var.sut1_if2_private_ip]
236   security_groups   = [module.vpc.vpc_security_group_id]
237   source_dest_check = var.sut1_source_dest_check
238   subnet_id         = module.subnet_d.subnet_id
239
240   attachment {
241     instance     = aws_instance.sut1.id
242     device_index = 2
243   }
244
245   tags = {
246     "Name"        = local.sut1_name
247     "Environment" = local.environment
248   }
249 }
250
251 data "aws_network_interface" "sut1_if1" {
252   id = aws_network_interface.sut1_if1.id
253 }
254
255 data "aws_network_interface" "sut1_if2" {
256   id = aws_network_interface.sut1_if2.id
257 }
258
259 resource "null_resource" "deploy_tg" {
260   depends_on = [
261     aws_instance.tg,
262     aws_network_interface.tg_if1,
263     aws_network_interface.tg_if2,
264     aws_instance.sut1,
265     aws_network_interface.sut1_if1,
266     aws_network_interface.sut1_if2
267   ]
268
269   connection {
270     user        = "ubuntu"
271     host        = aws_instance.tg.public_ip
272     private_key = module.private_key.private_key_pem
273   }
274
275   provisioner "remote-exec" {
276     inline = var.first_run_commands
277   }
278 }
279
280 resource "null_resource" "deploy_sut1" {
281   depends_on = [
282     aws_instance.tg,
283     aws_network_interface.tg_if1,
284     aws_network_interface.tg_if2,
285     aws_instance.sut1,
286     aws_network_interface.sut1_if1,
287     aws_network_interface.sut1_if2
288   ]
289
290   connection {
291     user        = "ubuntu"
292     host        = aws_instance.sut1.public_ip
293     private_key = module.private_key.private_key_pem
294   }
295
296   provisioner "remote-exec" {
297     inline = var.first_run_commands
298   }
299 }
300
301 resource "local_file" "topology_file" {
302   depends_on = [
303     aws_instance.tg,
304     aws_instance.sut1
305   ]
306
307   content = templatefile(
308     "${path.module}/topology-${local.topology_name}.tftpl",
309     {
310       tg_if1_mac     = data.aws_network_interface.tg_if1.mac_address
311       tg_if2_mac     = data.aws_network_interface.tg_if2.mac_address
312       dut1_if1_mac   = data.aws_network_interface.sut1_if1.mac_address
313       dut1_if2_mac   = data.aws_network_interface.sut1_if2.mac_address
314       tg_public_ip   = aws_instance.tg.public_ip
315       dut1_public_ip = aws_instance.sut1.public_ip
316     }
317   )
318   filename = "${path.module}/../../topologies/available/${local.topology_name}-${local.testbed_name}.yaml"
319 }
320
321 resource "local_file" "hosts" {
322   depends_on = [
323     aws_instance.tg,
324     aws_instance.sut1
325   ]
326
327   content = templatefile(
328     "${path.module}/hosts.tftpl",
329     {
330       tg_public_ip   = aws_instance.tg.public_ip
331       dut1_public_ip = aws_instance.sut1.public_ip
332     }
333   )
334   filename = "${path.module}/../../fdio.infra.ansible/inventories/cloud_inventory/hosts.yaml"
335 }