initial commit
This commit is contained in:
commit
995950b25b
38
.gitignore
vendored
Normal file
38
.gitignore
vendored
Normal file
@ -0,0 +1,38 @@
|
||||
|
||||
# Local .terraform directories
|
||||
**/.terraform/*
|
||||
|
||||
# .tfstate files
|
||||
*.tfstate
|
||||
*.tfstate.*
|
||||
|
||||
# Crash log files
|
||||
crash.log
|
||||
crash.*.log
|
||||
|
||||
# Terraform lock file
|
||||
.terraform.lock.hcl
|
||||
|
||||
# Exclude all .tfvars files, which are likely to contain sensitive data, such as
|
||||
# password, private keys, and other secrets. These should not be part of version
|
||||
# control as they are data points which are potentially sensitive and subject
|
||||
# to change depending on the environment.
|
||||
*.tfvars
|
||||
*.tfvars.json
|
||||
|
||||
# Ignore override files as they are usually used to override resources locally and so
|
||||
# are not checked in
|
||||
override.tf
|
||||
override.tf.json
|
||||
*_override.tf
|
||||
*_override.tf.json
|
||||
|
||||
# Include override files you do wish to add to version control using negated pattern
|
||||
# !example_override.tf
|
||||
|
||||
# Include tfplan files to ignore the plan output of command: terraform plan -out=tfplan
|
||||
# example: *tfplan*
|
||||
|
||||
# Ignore CLI configuration files
|
||||
.terraformrc
|
||||
terraform.rc
|
1
README.md
Normal file
1
README.md
Normal file
@ -0,0 +1 @@
|
||||
Terraform files to easily create resources on OCI with whats available on the free-tier.
|
31
a1_flex.tf
Normal file
31
a1_flex.tf
Normal file
@ -0,0 +1,31 @@
|
||||
resource "oci_core_instance" "a1_flex_instances" {
|
||||
for_each = var.a1_flex
|
||||
|
||||
display_name = each.key
|
||||
shape = "VM.Standard.A1.Flex"
|
||||
compartment_id = var.compartment_ocid
|
||||
|
||||
availability_domain = data.oci_identity_availability_domains.ads.availability_domains[each.value.ad].name
|
||||
# fault_domain = "FAULT-DOMAIN-3"
|
||||
|
||||
metadata = {
|
||||
"ssh_authorized_keys" = var.ssh_key
|
||||
}
|
||||
|
||||
create_vnic_details {
|
||||
assign_public_ip = "true"
|
||||
display_name = each.key
|
||||
hostname_label = each.key
|
||||
subnet_id = oci_core_subnet.list[each.value.vcn].id
|
||||
}
|
||||
|
||||
shape_config {
|
||||
memory_in_gbs = each.value.ram
|
||||
ocpus = each.value.cpu
|
||||
}
|
||||
|
||||
source_details {
|
||||
source_id = data.oci_core_images.latest_ubuntu_image_arm_minimal.images.0.id
|
||||
source_type = "image"
|
||||
}
|
||||
}
|
29
data.tf
Normal file
29
data.tf
Normal file
@ -0,0 +1,29 @@
|
||||
data "oci_identity_availability_domains" "ads" {
|
||||
compartment_id = var.compartment_ocid
|
||||
}
|
||||
|
||||
data "oci_core_images" "latest_ubuntu_image_amd_minimal" {
|
||||
compartment_id = var.compartment_ocid
|
||||
operating_system = "Canonical Ubuntu"
|
||||
shape = "VM.Standard.E2.1.Micro"
|
||||
sort_by = "TIMECREATED"
|
||||
|
||||
filter {
|
||||
name = "display_name"
|
||||
values = ["Minimal"]
|
||||
regex = true
|
||||
}
|
||||
}
|
||||
|
||||
data "oci_core_images" "latest_ubuntu_image_arm_minimal" {
|
||||
compartment_id = var.compartment_ocid
|
||||
operating_system = "Canonical Ubuntu"
|
||||
shape = "VM.Standard.A1.Flex"
|
||||
sort_by = "TIMECREATED"
|
||||
|
||||
filter {
|
||||
name = "display_name"
|
||||
values = ["Minimal"]
|
||||
regex = true
|
||||
}
|
||||
}
|
21
dns.tf
Normal file
21
dns.tf
Normal file
@ -0,0 +1,21 @@
|
||||
resource "cloudflare_record" "dns_a1_flex" {
|
||||
for_each = var.a1_flex
|
||||
|
||||
zone_id = var.cloudflare_zone_id
|
||||
|
||||
name = "${each.key}.${var.base_domain}"
|
||||
value = oci_core_instance.a1_flex_instances[each.key].public_ip
|
||||
type = "A"
|
||||
ttl = 1 # For automatic
|
||||
}
|
||||
|
||||
resource "cloudflare_record" "dns_e2_micro" {
|
||||
for_each = var.e2_micro
|
||||
|
||||
zone_id = var.cloudflare_zone_id
|
||||
|
||||
name = "${each.key}.${var.base_domain}"
|
||||
value = oci_core_instance.e2_micro_instances[each.key].public_ip
|
||||
type = "A"
|
||||
ttl = 1 # For automatic
|
||||
}
|
31
e2_micro.tf
Normal file
31
e2_micro.tf
Normal file
@ -0,0 +1,31 @@
|
||||
resource "oci_core_instance" "e2_micro_instances" {
|
||||
for_each = var.e2_micro
|
||||
|
||||
display_name = each.key
|
||||
shape = "VM.Standard.E2.1.Micro"
|
||||
compartment_id = var.compartment_ocid
|
||||
|
||||
availability_domain = data.oci_identity_availability_domains.ads.availability_domains[each.value.ad].name
|
||||
# fault_domain = "FAULT-DOMAIN-3"
|
||||
|
||||
metadata = {
|
||||
"ssh_authorized_keys" = var.ssh_key
|
||||
}
|
||||
|
||||
create_vnic_details {
|
||||
assign_public_ip = "true"
|
||||
display_name = each.key
|
||||
hostname_label = each.key
|
||||
subnet_id = oci_core_subnet.list[each.value.vcn].id
|
||||
}
|
||||
|
||||
shape_config {
|
||||
memory_in_gbs = 1
|
||||
ocpus = 1
|
||||
}
|
||||
|
||||
source_details {
|
||||
source_id = data.oci_core_images.latest_ubuntu_image_amd_minimal.images.0.id
|
||||
source_type = "image"
|
||||
}
|
||||
}
|
24
provider.tf
Normal file
24
provider.tf
Normal file
@ -0,0 +1,24 @@
|
||||
terraform {
|
||||
required_providers {
|
||||
oci = {
|
||||
source = "oracle/oci"
|
||||
version = "~> 4.100.0"
|
||||
}
|
||||
cloudflare = {
|
||||
source = "cloudflare/cloudflare"
|
||||
version = "~> 3.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
provider "oci" {
|
||||
tenancy_ocid = var.compartment_ocid
|
||||
user_ocid = var.user_ocid
|
||||
fingerprint = var.fingerprint_oci
|
||||
private_key_path = var.private_key_path_oci
|
||||
region = var.region_oci
|
||||
}
|
||||
|
||||
provider "cloudflare" {
|
||||
api_token = var.cloudflare_api_token
|
||||
}
|
79
variables.tf
Normal file
79
variables.tf
Normal file
@ -0,0 +1,79 @@
|
||||
variable "compartment_ocid" {
|
||||
type = string
|
||||
description = "Equal to the Tenancy ocid"
|
||||
}
|
||||
|
||||
variable "user_ocid" {
|
||||
type = string
|
||||
description = "The User ocid"
|
||||
}
|
||||
|
||||
variable "fingerprint_oci" {
|
||||
type = string
|
||||
description = "The fingerprint of the key used in OCI provider"
|
||||
}
|
||||
|
||||
variable "private_key_path_oci" {
|
||||
type = string
|
||||
description = "Path to the private key used in OCI provider"
|
||||
}
|
||||
|
||||
variable "region_oci" {
|
||||
type = string
|
||||
description = "Region to use in OCI provider"
|
||||
}
|
||||
|
||||
variable "cloudflare_api_token" {
|
||||
type = string
|
||||
description = "cloudflare API token"
|
||||
}
|
||||
|
||||
variable "cloudflare_zone_id" {
|
||||
type = string
|
||||
description = "Cloudflare zone id"
|
||||
}
|
||||
|
||||
variable "base_domain" {
|
||||
type = string
|
||||
description = "The base domain to set the dns records to e.g. 'example.com' "
|
||||
}
|
||||
|
||||
variable "ssh_key" {
|
||||
type = string
|
||||
description = "Public ssh key to add"
|
||||
}
|
||||
|
||||
variable "e2_micro" {
|
||||
type = map(object({
|
||||
vcn = string
|
||||
ad = number
|
||||
}))
|
||||
description = "VM.Standard.E2.1.Micro"
|
||||
default = {}
|
||||
}
|
||||
|
||||
variable "a1_flex" {
|
||||
type = map(object({
|
||||
vcn = string
|
||||
cpu = string
|
||||
ram = string
|
||||
ad = number
|
||||
}))
|
||||
description = "VM.Standard.A1.Flex"
|
||||
default = {}
|
||||
}
|
||||
|
||||
variable "vcn" {
|
||||
type = map(object({
|
||||
cidr_block = string
|
||||
firewall_rules = list(object({
|
||||
description = string
|
||||
is_udp = bool
|
||||
cidr = string
|
||||
port_min = number
|
||||
port_max = number
|
||||
}))
|
||||
}))
|
||||
|
||||
default = {}
|
||||
}
|
146
vcn.tf
Normal file
146
vcn.tf
Normal file
@ -0,0 +1,146 @@
|
||||
resource "oci_core_vcn" "list" {
|
||||
for_each = var.vcn
|
||||
|
||||
compartment_id = var.compartment_ocid
|
||||
display_name = "VCN ${each.key}"
|
||||
cidr_blocks = [each.value.cidr_block]
|
||||
dns_label = each.key
|
||||
}
|
||||
|
||||
|
||||
resource "oci_core_subnet" "list" {
|
||||
for_each = var.vcn
|
||||
|
||||
compartment_id = var.compartment_ocid
|
||||
vcn_id = oci_core_vcn.list[each.key].id
|
||||
cidr_block = each.value.cidr_block
|
||||
display_name = "Subnet ${each.key}"
|
||||
dns_label = each.key
|
||||
}
|
||||
|
||||
resource "oci_core_internet_gateway" "list" {
|
||||
for_each = var.vcn
|
||||
|
||||
compartment_id = var.compartment_ocid
|
||||
vcn_id = oci_core_vcn.list[each.key].id
|
||||
}
|
||||
|
||||
resource "oci_core_default_route_table" "list" {
|
||||
for_each = var.vcn
|
||||
|
||||
manage_default_resource_id = oci_core_vcn.list[each.key].default_route_table_id
|
||||
compartment_id = var.compartment_ocid
|
||||
|
||||
route_rules {
|
||||
destination = "0.0.0.0/0"
|
||||
destination_type = "CIDR_BLOCK"
|
||||
network_entity_id = oci_core_internet_gateway.list[each.key].id
|
||||
}
|
||||
}
|
||||
|
||||
resource "oci_core_default_security_list" "list" {
|
||||
for_each = var.vcn
|
||||
|
||||
manage_default_resource_id = oci_core_vcn.list[each.key].default_security_list_id
|
||||
compartment_id = var.compartment_ocid
|
||||
|
||||
egress_security_rules {
|
||||
destination = "0.0.0.0/0"
|
||||
destination_type = "CIDR_BLOCK"
|
||||
protocol = "all"
|
||||
stateless = false
|
||||
}
|
||||
|
||||
ingress_security_rules {
|
||||
protocol = "1" # ICMP
|
||||
source = "172.16.2.0/24"
|
||||
source_type = "CIDR_BLOCK"
|
||||
stateless = false
|
||||
|
||||
icmp_options {
|
||||
code = -1
|
||||
type = 3
|
||||
}
|
||||
}
|
||||
|
||||
ingress_security_rules {
|
||||
protocol = "1" # ICMP
|
||||
source = "0.0.0.0/0"
|
||||
source_type = "CIDR_BLOCK"
|
||||
stateless = false
|
||||
|
||||
icmp_options {
|
||||
code = 4
|
||||
type = 3
|
||||
}
|
||||
}
|
||||
|
||||
ingress_security_rules {
|
||||
description = "SSH"
|
||||
protocol = "6" # TCP
|
||||
source = "0.0.0.0/0"
|
||||
source_type = "CIDR_BLOCK"
|
||||
stateless = false
|
||||
|
||||
tcp_options {
|
||||
max = 22
|
||||
min = 22
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
ingress_security_rules {
|
||||
description = "HTTPS"
|
||||
protocol = "6" # TCP
|
||||
source = "0.0.0.0/0"
|
||||
source_type = "CIDR_BLOCK"
|
||||
stateless = false
|
||||
|
||||
tcp_options {
|
||||
max = 443
|
||||
min = 443
|
||||
}
|
||||
}
|
||||
|
||||
ingress_security_rules {
|
||||
description = "HTTPS"
|
||||
protocol = "6" # TCP
|
||||
source = "0.0.0.0/0"
|
||||
source_type = "CIDR_BLOCK"
|
||||
stateless = false
|
||||
|
||||
tcp_options {
|
||||
max = 80
|
||||
min = 80
|
||||
}
|
||||
}
|
||||
|
||||
dynamic "ingress_security_rules" {
|
||||
for_each = each.value.firewall_rules
|
||||
|
||||
content {
|
||||
description = ingress_security_rules.value.description
|
||||
protocol = ingress_security_rules.value.is_udp ? "17" : "6"
|
||||
source = ingress_security_rules.value.cidr
|
||||
source_type = "CIDR_BLOCK"
|
||||
|
||||
dynamic "tcp_options" {
|
||||
for_each = ingress_security_rules.value.is_udp ? [] : [1]
|
||||
content{
|
||||
max = ingress_security_rules.value.port_max
|
||||
min = ingress_security_rules.value.port_min
|
||||
}
|
||||
}
|
||||
|
||||
dynamic "udp_options"{
|
||||
for_each = ingress_security_rules.value.is_udp ? [1] : []
|
||||
|
||||
content{
|
||||
max = ingress_security_rules.value.port_max
|
||||
min = ingress_security_rules.value.port_min
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user