Terraform azurerm 计划 start_time 总是在新部署时重置 [英] Terraform azurerm schedule start_time always resets on new deploys

查看:23
本文介绍了Terraform azurerm 计划 start_time 总是在新部署时重置的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试让资源 azurerm_automation_schedule 在每月发生的特定时间 (例如:18:00) 进行部署.

I am trying to get the resource azurerm_automation_schedule to deploy at a specific time (ex: 18:00) occurring monthly.

我正在使用以下代码:

locals {
  update_time = "18:00"
  update_date = formatdate("YYYY-MM-DD", timeadd(timestamp(), "24h"))
  update_timezone = "UTC"
}

resource "azurerm_automation_schedule" "main" {
  name                    = "test"
  resource_group_name     = "myresourcegroupname"
  automation_account_name = "myautomationaccountname"
  frequency               = "Month"
  timezone                = local.update_timezone
  start_time              = "${local.update_date}T${local.update_time}:00+02:00"
  description             = "This is an example schedule"
  monthly_occurrence {
    day = "Tuesday"
    occurrence = "1"
  }
}

"${local.update_date}T${local.update_time}:00+02:00" 将当前时间增加 2 小时并将日期向前设置 1.这是必需的确保计划在未来开始.

The "${local.update_date}T${local.update_time}:00+02:00" adds 2 hours to the current time and sets the day forward 1. This is required to ensure the schedule starts in the future.

这很好用,除非我下次回来运行部署时,它会检测到由于日期更改而导致的新更改,即使没有发生真正的更改.start_time 将始终向前打勾.

This works fine, except the next time I come back to run a deploy, it detects a new change due to the date changing, even if no real changes have occurred. The start_time will always tick forward.

我似乎找不到任何可以提供帮助的 terraform 逻辑.有没有办法在变量中设置静态开始时间,并且只有在它发生变化时才更新它?(不是日期).

I can't seem to find any terraform logic that can assist. Is there a way to set a static start time in a variable, and only have it updated if it changes? (not the date).

伪代码是:

if [update_time] has not changed, do not update [azurerm_automation_schedule]
else update [azurerm_automation_schedule] with the new time, incrementing the day forward

更新

我的最终工作代码(奖励:使用 Windows 更新调度程序,这是一个痛苦的开始工作!)

My final working code (BONUS: With windows update scheduler which is a pain to get working!)

//== Provider used to store timestamp for updates ==//
provider "time" {
  version = "~> 0.4"
}

//== Store 1 day in the future, only update if [local.update_time] is altered ==//
resource "time_offset" "next_day" {
  offset_days = 1
  triggers = {
    update_time = local.update_time
  }
}

locals {
  update_time = "19:40"
  update_date = substr(time_offset.next_day.rfc3339, 0, 10)
  update_timezone = "UTC"
  update_max_hours = "4"
  update_classifications = "Critical, Security, UpdateRollup, ServicePack, Definition, Updates"
  update_reboot_settings = "IfRequired"
  update_day = "Tuesday"
  update_occurrence = "2"
}

#This type should eventually replace the manual deploy via azurerm: azurerm_automation_softwareUpdateConfigurations
#https://github.com/terraform-providers/terraform-provider-azurerm/issues/2812
resource "azurerm_template_deployment" "windows" {
  name                = "windows-update"
  resource_group_name = module.stack.azurerm_resource_group.name

  template_body = <<DEPLOY
  {
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "resources": [
      {
          "apiVersion": "2017-05-15-preview",
          "type": "Microsoft.Automation/automationAccounts/softwareUpdateConfigurations",
          "name": "${module.stack.azurerm_automation_account.name}/windows-updates",
          "properties": {
              "updateConfiguration": {
                  "operatingSystem": "Windows",
                  "duration": "PT${local.update_max_hours}H",
                  "windows": {
                      "excludedKbNumbers": [
                      ],
                      "includedUpdateClassifications": "${local.update_classifications}",
                      "rebootSetting": "${local.update_reboot_settings}"
                  },
                  "azureVirtualMachines": [
                      "${module.server_1.azurerm_virtual_machine.id}",
                      "${module.server_2.azurerm_virtual_machine.id}"
                  ],
                  "nonAzureComputerNames": [
                  ]
              },
              "scheduleInfo": {
                  "frequency": "Month",
                  "startTime": "${local.update_date}T${local.update_time}:00",
                  "timeZone":  "${local.update_timezone}",
                  "interval": 1,
                  "advancedSchedule": {
                      "monthlyOccurrences": [
                          {
                            "occurrence": "${local.update_occurrence}",
                            "day": "${local.update_day}"
                          }
                      ]
                  }
              }
          }
      }
    ]
  }
  DEPLOY

  deployment_mode = "Incremental"
}

推荐答案

它不断计划更改的原因是因为您编写的代码指的是当前时间,而不是获取明天"并以某种方式跟踪它.

The reason it keeps planning changes is because your code, as written, refers to the current time, rather than getting "tomorrow" and tracking it somehow.

>

要做到这一点,您需要一种方法来获得明天"一次,并将其保持在状态中.存在于状态中的事物是资源,因此您需要一个资源来表示具有偏移量的时间.这就是 时间 提供者进来了.

To do that, you need a way to get "tomorrow" once, and stick it in the state. Things that live in the state are resources, so you need a resource that represents a time with an offset. That's where the time provider comes in.

这是必不可少的部分:

resource "time_offset" "tomorrow" {
  offset_days = 1
}

您将获得明天",应用后它将保存在 Terraform 状态中.

That will get "tomorrow" for you and after an apply it will be saved in the Terraform state.

time_offset.tomorrow.rfc3339

将评估为:

2020-05-13T04:28:07Z

但是,我们只想要其中的 YYYY-MM-DD,所以我们使用 substr 来获取前 10 个字符:

But, we only want the YYYY-MM-DD from that, so we use substr to get the first 10 characters:

substr(time_offset.tomorrow.rfc3339, 0, 10)

综合起来,我们得到了这个(添加了 4 行,包括空格,更改了 1 行):

Putting it all together, we get this (4 lines added including whitespace, 1 line changed):

locals {
  update_time = "18:00"
  update_date = substr(time_offset.tomorrow.rfc3339, 0, 10)
  update_timezone = "UTC"
}

resource "time_offset" "tomorrow" {
  offset_days = 1
}

resource "azurerm_automation_schedule" "main" {
  name                    = "test"
  resource_group_name     = "myresourcegroupname"
  automation_account_name = "myautomationaccountname"
  frequency               = "Month"
  timezone                = local.update_timezone
  start_time              = "${local.update_date}T${local.update_time}:00+02:00"
  description             = "This is an example schedule"
  monthly_occurrence {
    day = "Tuesday"
    occurrence = "1"
  }
}

您可能需要引入 时间 提供程序才能使用它(如果没有它就无法工作,请将它与您的 AzureRM 提供程序放在一起):

You may need to bring in the time provider to use it (put this alongside your AzureRM provider if it doesn't work without it):

provider "time" {}

如果需要,您可以使用 terraform taint 'time_offset.tomorrow' 强制重新计算时间.

You can use terraform taint 'time_offset.tomorrow' to force the time to be recalculated if you need it to be.

这篇关于Terraform azurerm 计划 start_time 总是在新部署时重置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆