diff --git a/.github/dependabot.yml b/.github/dependabot.yml index ec14d30..2c3fef2 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -10,10 +10,14 @@ updates: schedule: interval: "weekly" - package-ecosystem: "terraform" # See documentation for possible values - directory: "examples/mysql-flexible-server" # Location of package manifests + directory: "_example/basic" # Location of package manifests schedule: interval: "weekly" - package-ecosystem: "terraform" # See documentation for possible values - directory: "examples/mysql-flexible-server-replication" # Location of package manifests + directory: "_example/complete" # Location of package manifests + schedule: + interval: "weekly" + - package-ecosystem: "terraform" # See documentation for possible values + directory: "_example/mysql-flexible-server-replication" # Location of package manifests schedule: interval: "weekly" diff --git a/.github/workflows/semantic-releaser.yml b/.github/workflows/semantic-releaser.yml index 6e685a0..b4aec91 100644 --- a/.github/workflows/semantic-releaser.yml +++ b/.github/workflows/semantic-releaser.yml @@ -6,7 +6,7 @@ on: - main paths: - '**.tf' - - '!examples/**.tf' + - '!_example/**.tf' jobs: release: diff --git a/.github/workflows/static-checks.yml b/.github/workflows/static-checks.yml index c1b6978..bcc0db0 100644 --- a/.github/workflows/static-checks.yml +++ b/.github/workflows/static-checks.yml @@ -30,8 +30,9 @@ jobs: - ${{ needs.versionExtract.outputs.minVersion }} - ${{ needs.versionExtract.outputs.maxVersion }} directory: - - examples/mysql-flexible-server - - examples/mysql-flexible-server-replication + - _example/basic + - _example/complete + - _example/mysql-flexible-server-replication steps: - name: Checkout uses: actions/checkout@v2 diff --git a/_example/basic/main.tf b/_example/basic/main.tf new file mode 100644 index 0000000..bf1321e --- /dev/null +++ b/_example/basic/main.tf @@ -0,0 +1,29 @@ +##----------------------------------------------------------------------------- +## Flexible Mysql server module call. +##----------------------------------------------------------------------------- +module "flexible-mysql" { + depends_on = [module.resource_group, module.vnet] + source = "../../" + name = "app" + environment = "test" + resource_group_name = "test-rg" + location = "Central India" + virtual_network_id = "/subscriptions/------------------------------" + delegated_subnet_id = "/subscriptions/------------------------------" + mysql_version = "8.0.21" + mysql_server_name = "testmysqlserver" + private_dns = true + zone = "1" + admin_username = "mysqlusername" + admin_password = "ba5yatgfgfhdsv6A3ns2lu4gqzzc" + sku_name = "GP_Standard_D8ds_v4" + db_name = "maindb" + charset = "utf8mb3" + collation = "utf8mb3_unicode_ci" + auto_grow_enabled = true + iops = 360 + size_gb = "20" + ##azurerm_mysql_flexible_server_configuration + server_configuration_names = ["interactive_timeout", "audit_log_enabled"] + values = ["600", "ON"] +} \ No newline at end of file diff --git a/_example/basic/output.tf b/_example/basic/output.tf new file mode 100644 index 0000000..68c4646 --- /dev/null +++ b/_example/basic/output.tf @@ -0,0 +1,17 @@ +output "flexible-mysql_server_id" { + value = module.flexible-mysql.mysql_flexible_server_id + description = "The ID of the MySQL Flexible Server." +} +output "azurerm_private_dns_zone_virtual_network_link_id" { + value = module.flexible-mysql.azurerm_private_dns_zone_virtual_network_link_id + description = "The ID of the Private DNS Zone Virtual Network Link." +} +output "azurerm_flexible-mysql_server_configuration_id" { + value = module.flexible-mysql.azurerm_mysql_flexible_server_configuration_id + description = "The ID of the MySQL Flexible Server Configuration." +} + +output "azurerm_private_dns_zone_id" { + value = module.flexible-mysql.azurerm_private_dns_zone_id + description = "The Private DNS Zone ID." +} diff --git a/examples/mysql-flexible-server/main.tf b/_example/complete/main.tf similarity index 60% rename from examples/mysql-flexible-server/main.tf rename to _example/complete/main.tf index 91ee30a..541259d 100644 --- a/examples/mysql-flexible-server/main.tf +++ b/_example/complete/main.tf @@ -2,35 +2,50 @@ provider "azurerm" { features {} } -module "resource_group" { - source = "clouddrove/resource-group/azure" - version = "1.0.2" - +locals { name = "app" environment = "test" label_order = ["name", "environment"] - location = "Canada Central" } +##----------------------------------------------------------------------------- +## Resource Group module call +## Resource group in which all resources will be deployed. +##----------------------------------------------------------------------------- +module "resource_group" { + source = "clouddrove/resource-group/azure" + version = "1.0.2" + name = local.name + environment = local.environment + label_order = local.label_order + location = "Central India" +} + +##----------------------------------------------------------------------------- +## Virtual Network module call. +##----------------------------------------------------------------------------- module "vnet" { source = "clouddrove/vnet/azure" version = "1.0.2" - name = "app" - environment = "test" + name = local.name + environment = local.environment resource_group_name = module.resource_group.resource_group_name location = module.resource_group.resource_group_location address_space = "10.0.0.0/16" } +##----------------------------------------------------------------------------- +## Subnet module call. +## Delegated subnet for mysql. +##----------------------------------------------------------------------------- module "subnet" { source = "clouddrove/subnet/azure" version = "1.0.2" - name = "app" - environment = "test" + name = local.name + environment = local.environment resource_group_name = module.resource_group.resource_group_name location = module.resource_group.resource_group_location virtual_network_name = join("", module.vnet.vnet_name) - #subnet subnet_names = ["default"] subnet_prefixes = ["10.0.1.0/24"] @@ -45,13 +60,14 @@ module "subnet" { } } - - +##----------------------------------------------------------------------------- +## Flexible Mysql server module call. +##----------------------------------------------------------------------------- module "flexible-mysql" { depends_on = [module.resource_group, module.vnet] - source = "clouddrove/flexible-mysql/azure" - name = "app" - environment = "test" + source = "../../" + name = local.name + environment = local.environment resource_group_name = module.resource_group.resource_group_name location = module.resource_group.resource_group_location virtual_network_id = module.vnet.vnet_id[0] @@ -69,9 +85,7 @@ module "flexible-mysql" { auto_grow_enabled = true iops = 360 size_gb = "20" - ##azurerm_mysql_flexible_server_configuration server_configuration_names = ["interactive_timeout", "audit_log_enabled"] values = ["600", "ON"] - } diff --git a/examples/mysql-flexible-server/output.tf b/_example/complete/output.tf similarity index 100% rename from examples/mysql-flexible-server/output.tf rename to _example/complete/output.tf diff --git a/examples/mysql-flexible-server-replication/main.tf b/_example/mysql-flexible-server-replication/main.tf similarity index 61% rename from examples/mysql-flexible-server-replication/main.tf rename to _example/mysql-flexible-server-replication/main.tf index 7adb14b..137d2a6 100644 --- a/examples/mysql-flexible-server-replication/main.tf +++ b/_example/mysql-flexible-server-replication/main.tf @@ -2,31 +2,47 @@ provider "azurerm" { features {} } -module "resource_group" { - source = "clouddrove/resource-group/azure" - version = "1.0.2" - - name = "app-mysqll2" +locals { + name = "app" environment = "test" label_order = ["name", "environment"] +} + +##----------------------------------------------------------------------------- +## Resource Group module call +## Resource group in which all resources will be deployed. +##----------------------------------------------------------------------------- +module "resource_group" { + source = "clouddrove/resource-group/azure" + version = "1.0.2" + name = local.name + environment = local.environment + label_order = local.label_order location = "Canada Central" } +##----------------------------------------------------------------------------- +## Virtual Network module call. +##----------------------------------------------------------------------------- module "vnet" { source = "clouddrove/vnet/azure" version = "1.0.3" - name = "app" - environment = "test" + name = local.name + environment = local.environment resource_group_name = module.resource_group.resource_group_name location = module.resource_group.resource_group_location address_space = "10.0.0.0/16" } +##----------------------------------------------------------------------------- +## Subnet module call. +## Delegated subnet for mysql. +##----------------------------------------------------------------------------- module "subnet" { source = "clouddrove/subnet/azure" version = "1.0.2" - name = "app" - environment = "test" + name = local.name + environment = local.environment resource_group_name = module.resource_group.resource_group_name location = module.resource_group.resource_group_location virtual_network_name = join("", module.vnet.vnet_name) @@ -45,22 +61,31 @@ module "subnet" { } } -#existing resource group where dns zone created +##----------------------------------------------------------------------------- +## Existing resource group where dns zone created +##----------------------------------------------------------------------------- data "azurerm_resource_group" "main" { name = "app-mysqll-test-resource-group" } +##----------------------------------------------------------------------------- +## Data block for existing private dns zone. +## Required because for replication both flexible mysql servers must be in same private dns zone. +##----------------------------------------------------------------------------- data "azurerm_private_dns_zone" "main" { depends_on = [data.azurerm_resource_group.main] name = "privatelink.mysql.database.azure.com" resource_group_name = data.azurerm_resource_group.main.name } +##----------------------------------------------------------------------------- +## Flexible Mysql server module call. +##----------------------------------------------------------------------------- module "flexible-mysql" { depends_on = [module.resource_group, module.vnet, data.azurerm_resource_group.main] source = "clouddrove/flexible-mysql/azure" - name = "app" - environment = "test" + name = local.name + environment = local.environment main_rg_name = data.azurerm_resource_group.main.name resource_group_name = module.resource_group.resource_group_name location = module.resource_group.resource_group_location diff --git a/examples/mysql-flexible-server-replication/output.tf b/_example/mysql-flexible-server-replication/output.tf similarity index 100% rename from examples/mysql-flexible-server-replication/output.tf rename to _example/mysql-flexible-server-replication/output.tf diff --git a/main.tf b/main.tf index 1587974..5e160f7 100644 --- a/main.tf +++ b/main.tf @@ -1,11 +1,19 @@ -## Vritual Network and Subnet Creation +##----------------------------------------------------------------------------- +## Vritual Network and Subnet Creation +##----------------------------------------------------------------------------- data "azurerm_client_config" "current" {} +##----------------------------------------------------------------------------- +## Locals Declaration +##----------------------------------------------------------------------------- locals { resource_group_name = var.resource_group_name location = var.location } +##----------------------------------------------------------------------------- +## Labels module callled that will be used for naming and tags. +##----------------------------------------------------------------------------- module "labels" { source = "clouddrove/labels/azure" version = "1.0.0" @@ -16,6 +24,23 @@ module "labels" { repository = var.repository } +##----------------------------------------------------------------------------- +## Random Password Resource. +## Will be passed as admin password of mysql server when admin password is not passed manually as variable. +##----------------------------------------------------------------------------- + +resource "random_password" "main" { + count = var.admin_password == null ? 1 : 0 + length = var.admin_password_length + min_upper = 4 + min_lower = 2 + min_numeric = 4 + special = false +} + +##----------------------------------------------------------------------------- +## Below resource will create flexible mysql server in Azure environment. +##----------------------------------------------------------------------------- resource "azurerm_mysql_flexible_server" "main" { count = var.enabled ? 1 : 0 @@ -23,7 +48,7 @@ resource "azurerm_mysql_flexible_server" "main" { resource_group_name = local.resource_group_name location = var.location administrator_login = var.admin_username - administrator_password = var.admin_password + administrator_password = var.admin_password == null ? random_password.main[0].result : var.admin_password backup_retention_days = var.backup_retention_days delegated_subnet_id = var.delegated_subnet_id private_dns_zone_id = var.private_dns ? join("", azurerm_private_dns_zone.main.*.id) : var.existing_private_dns_zone_id @@ -55,6 +80,10 @@ resource "azurerm_mysql_flexible_server" "main" { depends_on = [azurerm_private_dns_zone_virtual_network_link.main, azurerm_private_dns_zone_virtual_network_link.main2] } +##----------------------------------------------------------------------------- +## Below resource will create mysql flexible database. +##----------------------------------------------------------------------------- + resource "azurerm_mysql_flexible_database" "main" { count = var.enabled ? 1 : 0 name = var.db_name @@ -65,6 +94,10 @@ resource "azurerm_mysql_flexible_database" "main" { depends_on = [azurerm_mysql_flexible_server.main] } +##----------------------------------------------------------------------------- +## Below resource will create flexible mysql server configuration. +##----------------------------------------------------------------------------- + resource "azurerm_mysql_flexible_server_configuration" "main" { count = var.enabled ? length(var.server_configuration_names) : 0 name = element(var.server_configuration_names, count.index) @@ -82,6 +115,9 @@ resource "azurerm_mysql_server_key" "main" { key_vault_key_id = var.key_vault_key_id } +##----------------------------------------------------------------------------- +## Below resource will deploy private dns for flexible mysql server. +##----------------------------------------------------------------------------- resource "azurerm_private_dns_zone" "main" { count = var.enabled && var.private_dns ? 1 : 0 name = "privatelink.mysql.database.azure.com" @@ -89,6 +125,9 @@ resource "azurerm_private_dns_zone" "main" { tags = module.labels.tags } +##----------------------------------------------------------------------------- +## Below resource will create vnet link in above created mysql private dns resource. +##----------------------------------------------------------------------------- resource "azurerm_private_dns_zone_virtual_network_link" "main" { count = var.enabled && var.private_dns ? 1 : 0 name = format("mysql-endpoint-link-%s", module.labels.id) @@ -99,6 +138,9 @@ resource "azurerm_private_dns_zone_virtual_network_link" "main" { tags = module.labels.tags } +##----------------------------------------------------------------------------- +## Below resource will create vnet link in previously existing mysql private dns zone. +##----------------------------------------------------------------------------- resource "azurerm_private_dns_zone_virtual_network_link" "main2" { count = var.enabled && var.existing_private_dns_zone ? 1 : 0 name = format("mysql-endpoint-link-%s", module.labels.id) diff --git a/variables.tf b/variables.tf index 71a501b..016f978 100644 --- a/variables.tf +++ b/variables.tf @@ -76,6 +76,12 @@ variable "admin_password" { default = null } +variable "admin_password_length" { + type = number + default = 16 + description = "Length of random password generated." +} + variable "backup_retention_days" { type = number default = 7 @@ -243,4 +249,4 @@ variable "high_availability" { mode = "SameZone" standby_availability_zone = 1 } -} +} \ No newline at end of file