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