demo_solution/modules/repo_terraform.azurerm.automation_account/main.tf (145 lines of code) (raw):
# Get resource group data for automation account
data "azurerm_resource_group" "rg" {
name = var.resource_group_name
}
# Get subscription data
data "azurerm_subscription" "current" {}
# Get role definition data
data "azurerm_role_definition" "contributor" {
name = "Contributor"
}
# Create automation account
resource "azurerm_automation_account" "account" {
name = var.automation_account_name
location = var.location != null ? var.location : data.azurerm_resource_group.rg.location
resource_group_name = data.azurerm_resource_group.rg.name
sku_name = var.sku
tags = var.tags
identity {
type = var.identity_type
identity_ids = var.identity_ids
}
}
# Create role assignment for the managed identity
resource "azurerm_role_assignment" "id_role" {
name = azurerm_automation_account.account.identity[0].principal_id
scope = data.azurerm_subscription.current.id
role_definition_id = "${data.azurerm_subscription.current.id}${data.azurerm_role_definition.contributor.id}"
principal_id = azurerm_automation_account.account.identity[0].principal_id
}
# Create automation runbook
resource "azurerm_automation_runbook" "runbook" {
for_each = { for runbook in var.runbook : runbook.runbook_name => runbook }
name = each.value.runbook_name
location = var.location != null ? var.location : data.azurerm_resource_group.rg.location
resource_group_name = data.azurerm_resource_group.rg.name
automation_account_name = azurerm_automation_account.account.name
log_verbose = lookup(each.value, "log_verbose", true)
log_progress = lookup(each.value, "log_progress", true)
description = lookup(each.value, "description", null)
runbook_type = each.value.runbook_type
content = try(file(each.value.script_file_name), null)
tags = var.tags
dynamic "publish_content_link" {
for_each = try(var.runbook.uri, null) != null ? [1] : []
content {
uri = lookup(var.runbook, "uri", null)
}
}
}
# Create automation schedule
resource "azurerm_automation_schedule" "schedule" {
for_each = { for schedule in var.schedule : schedule.schedule_name => schedule }
name = each.value.schedule_name
resource_group_name = data.azurerm_resource_group.rg.name
automation_account_name = azurerm_automation_account.account.name
frequency = each.value.frequency
interval = lookup(each.value, "interval", null)
description = lookup(each.value, "description", null)
start_time = lookup(each.value, "start_time", null)
timezone = lookup(each.value, "timezone", null)
week_days = lookup(each.value, "week_days", null)
month_days = lookup(each.value, "month_days", null)
dynamic "monthly_occurrence" {
for_each = lookup(each.value, "monthly_occurrence", null) != null ? [lookup(each.value, "monthly_occurrence")] : []
content {
day = monthly_occurrence.value.day
occurrence = monthly_occurrence.value.occurrence
}
}
}
# Bind schedule and runbook
resource "azurerm_automation_job_schedule" "job_schedule" {
for_each = { for job_schedule in var.job_schedule : "${job_schedule.schedule_name}-${job_schedule.runbook_name}" => job_schedule }
resource_group_name = data.azurerm_resource_group.rg.name
automation_account_name = azurerm_automation_account.account.name
schedule_name = azurerm_automation_schedule.schedule[each.value.schedule_name].name
runbook_name = azurerm_automation_runbook.runbook[each.value.runbook_name].name
parameters = lookup(each.value, "parameters", {})
}
# Create automation module
resource "azurerm_automation_module" "module" {
for_each = { for module in var.module : module.module_name => module }
name = each.value.module_name
resource_group_name = data.azurerm_resource_group.rg.name
automation_account_name = azurerm_automation_account.account.name
module_link {
uri = each.value.uri
}
}
# Create automation runbook's webhook
resource "azurerm_automation_webhook" "webhook" {
for_each = { for webhook in var.webhook : webhook.webhook_name => webhook }
name = each.value.webhook_name
resource_group_name = data.azurerm_resource_group.rg.name
automation_account_name = azurerm_automation_account.account.name
expiry_time = each.value.expiry_time
enabled = lookup(each.value, "enabled", true)
runbook_name = azurerm_automation_runbook.runbook[each.value.runbook_name].name
run_on_worker_group = lookup(each.value, "run_on_worker_group", null)
parameters = lookup(each.value, "parameters", [])
uri = lookup(each.value, "uri", null)
}
#########################################################################################
# Create Azure Automation Account update management
#########################################################################################
# Getting log analytics data for Update Management
data "azurerm_log_analytics_workspace" "upd_mgmt_la_ws" {
count = var.update_management != null ? 1 : 0
name = var.update_management.workspace_name
resource_group_name = var.update_management.workspace_rg_name
}
# Link Log Analytics Workspace to Automation Account
resource "azurerm_log_analytics_linked_service" "autoacc_linked_log_workspace" {
count = var.update_management != null ? 1 : 0
resource_group_name = data.azurerm_log_analytics_workspace.upd_mgmt_la_ws[0].resource_group_name
workspace_id = data.azurerm_log_analytics_workspace.upd_mgmt_la_ws[0].id
read_access_id = azurerm_automation_account.account.id
}
# Create a Log Analytics (formally Operational Insights) Solution
resource "azurerm_log_analytics_solution" "update_solution" {
count = var.update_management != null ? 1 : 0
depends_on = [
azurerm_log_analytics_linked_service.autoacc_linked_log_workspace
]
solution_name = "Updates"
location = data.azurerm_log_analytics_workspace.upd_mgmt_la_ws[0].location
resource_group_name = data.azurerm_log_analytics_workspace.upd_mgmt_la_ws[0].resource_group_name
workspace_resource_id = data.azurerm_log_analytics_workspace.upd_mgmt_la_ws[0].id
workspace_name = data.azurerm_log_analytics_workspace.upd_mgmt_la_ws[0].name
plan {
publisher = "Microsoft"
product = "OMSGallery/Updates"
}
}
#########################################################################################
# Create the Azure Automation Account Diagnostic settings
#########################################################################################
resource "azurerm_monitor_diagnostic_setting" "this" {
count = var.diagnostic_setting == null ? 0 : 1
name = var.diagnostic_setting.name
log_analytics_workspace_id = var.diagnostic_setting.log_analytics_workspace_id
target_resource_id = azurerm_automation_account.account.id
storage_account_id = var.diagnostic_setting.storage_account_id
eventhub_name = var.diagnostic_setting.eventhub_name
eventhub_authorization_rule_id = var.diagnostic_setting.eventhub_authorization_rule_id
dynamic "enabled_log" {
for_each = var.diagnostic_setting.log_category != null ? toset(var.diagnostic_setting.log_category) : []
content {
category = enabled_log.key
}
}
dynamic "enabled_log" {
for_each = var.diagnostic_setting.log_category_group != null ? toset(var.diagnostic_setting.log_category_group) : []
content {
category_group = enabled_log.key
}
}
dynamic "metric" {
for_each = var.diagnostic_setting.metric != null ? toset(var.diagnostic_setting.metric) : []
content {
category = metric.key
}
}
}