feat(terraform): 1n_aws_c5n
[csit.git] / fdio.infra.terraform / terraform-aws-1n-aws-c5n / 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-1a"
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             = "1n-aws-c5n"
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 }
28
29 # Create Subnet
30 module "subnet_b" {
31   source                   = "../terraform-aws-subnet"
32   subnet_cidr_block        = "192.168.10.0/24"
33   subnet_ipv6_cidr_block   = cidrsubnet(module.vpc.vpc_ipv6_cidr_block, 8, 2)
34   subnet_availability_zone = local.availability_zone
35   tags_name                = local.name
36   tags_environment         = local.environment
37   subnet_vpc_id            = module.vpc.vpc_id
38 }
39
40 # Create Private Key
41 resource "tls_private_key" "private_key" {
42   algorithm   = var.private_key_algorithm
43   ecdsa_curve = var.private_key_ecdsa_curve
44   rsa_bits    = var.private_key_rsa_bits
45 }
46
47 # Create Key Pair
48 resource "aws_key_pair" "key_pair" {
49   depends_on = [
50     tls_private_key.private_key
51   ]
52   key_name   = local.key_pair_key_name
53   public_key = tls_private_key.private_key.public_key_openssh
54 }
55
56 # Create Placement Group
57 resource "aws_placement_group" "placement_group" {
58   name     = local.placement_group_name
59   strategy = var.placement_group_strategy
60 }
61
62 # Create Instance
63 resource "aws_instance" "tg" {
64   depends_on = [
65     module.vpc,
66     aws_placement_group.placement_group
67   ]
68   ami                                  = var.tg_ami
69   availability_zone                    = local.availability_zone
70   associate_public_ip_address          = var.tg_associate_public_ip_address
71   instance_initiated_shutdown_behavior = var.tg_instance_initiated_shutdown_behavior
72   instance_type                        = var.tg_instance_type
73   key_name                             = aws_key_pair.key_pair.key_name
74   placement_group                      = aws_placement_group.placement_group.id
75   private_ip                           = var.tg_private_ip
76   source_dest_check                    = var.tg_source_dest_check
77   subnet_id                            = module.vpc.vpc_subnet_id
78   vpc_security_group_ids               = [module.vpc.vpc_security_group_id]
79   # host_id                            = "1"
80
81   root_block_device {
82     delete_on_termination = true
83     volume_size           = 50
84   }
85
86   tags = {
87     "Name"        = local.tg_name
88     "Environment" = local.environment
89   }
90 }
91
92 resource "aws_network_interface" "tg_if1" {
93   depends_on = [
94     module.subnet_b,
95     aws_instance.tg
96   ]
97   private_ips       = [var.tg_if1_private_ip]
98   security_groups   = [module.vpc.vpc_security_group_id]
99   source_dest_check = var.tg_source_dest_check
100   subnet_id         = module.subnet_b.subnet_id
101
102   attachment {
103     instance     = aws_instance.tg.id
104     device_index = 1
105   }
106
107   tags = {
108     "Name"        = local.tg_name
109     "Environment" = local.environment
110   }
111 }
112
113 resource "aws_network_interface" "tg_if2" {
114   depends_on = [
115     module.subnet_b,
116     aws_instance.tg
117   ]
118   private_ips       = [var.tg_if2_private_ip]
119   security_groups   = [module.vpc.vpc_security_group_id]
120   source_dest_check = var.tg_source_dest_check
121   subnet_id         = module.subnet_b.subnet_id
122
123   attachment {
124     instance     = aws_instance.tg.id
125     device_index = 2
126   }
127
128   tags = {
129     "Name"        = local.tg_name
130     "Environment" = local.environment
131   }
132 }
133
134 data "aws_network_interface" "tg_if1" {
135   id = aws_network_interface.tg_if1.id
136 }
137
138 data "aws_network_interface" "tg_if2" {
139   id = aws_network_interface.tg_if2.id
140 }
141
142 resource "aws_route" "route_tg_if1" {
143   depends_on = [
144     aws_instance.tg
145   ]
146   destination_cidr_block = var.destination_cidr_block_tg_if1
147   network_interface_id   = aws_instance.tg.primary_network_interface_id
148   route_table_id         = module.vpc.vpc_main_route_table_id
149 }
150
151 resource "aws_route" "route_tg_if2" {
152   depends_on = [
153     aws_instance.tg
154   ]
155   destination_cidr_block = var.destination_cidr_block_tg_if2
156   network_interface_id   = aws_instance.tg.primary_network_interface_id
157   route_table_id         = module.vpc.vpc_main_route_table_id
158 }
159
160 resource "null_resource" "deploy_tg" {
161   depends_on = [
162     aws_instance.tg,
163     aws_network_interface.tg_if1,
164     aws_network_interface.tg_if2
165   ]
166
167   connection {
168     user        = "ubuntu"
169     host        = aws_instance.tg.public_ip
170     private_key = tls_private_key.private_key.private_key_pem
171   }
172
173   provisioner "remote-exec" {
174     inline = var.first_run_commands
175   }
176 }
177
178
179 resource "null_resource" "deploy_topology" {
180   depends_on = [
181     aws_instance.tg
182   ]
183
184   provisioner "ansible" {
185     plays {
186       playbook {
187         file_path = var.ansible_topology_path
188       }
189       hosts = ["local"]
190       extra_vars = {
191         ansible_python_interpreter = local.ansible_python_executable
192         testbed_name               = local.testbed_name
193         cloud_topology             = local.topology_name
194         tg_if1_mac                 = data.aws_network_interface.tg_if1.mac_address
195         tg_if2_mac                 = data.aws_network_interface.tg_if2.mac_address
196         tg_public_ip               = aws_instance.tg.public_ip
197         public_ip_list             = "${aws_instance.tg.public_ip}"
198       }
199     }
200   }
201 }