首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Terraform状态mv

Terraform状态mv
EN

Stack Overflow用户
提问于 2021-11-30 12:34:14
回答 2查看 79关注 0票数 0

我有一个terraform模块,我在azure中创建了3个服务器,在var文件中,我指定了从此模块创建的服务器的instance type,现在我想更改其中一个服务器的实例类型,有没有一种terraform方法可以实现这一点,或者我是否应该手动升级实例类型,然后仅对该特定服务器使用terraform state mv,我不确定,state mv是否也采用size参数?在这方面的任何帮助都将不胜感激,

代码语言:javascript
复制
terraform plan -target=module.serverset.azurerm_linux_virtual_machine.new_vm[2]"

在上面一行中,我只是针对特定的服务器,这是正确的做法吗?因为在vars文件中,我更改了将用于所有服务器的instance type,执行此操作后,在旧配置中包含其他2台服务器的相同模块将发生什么情况

EN

回答 2

Stack Overflow用户

发布于 2021-12-01 05:44:02

现在我想要更改3台服务器中的一台的实例类型,有没有一种平台方式可以实现这一点

使用下面的命令,您可以检查如果应用相同的命令将会发生什么情况:

代码语言:javascript
复制
terraform plan -target=module.serverset.azurerm_linux_virtual_machine.new_vm[2]"

例如,我在创建.After的单个文件中创建了2个Standard_B2s Linux虚拟机,我想要更改其中一个虚拟机的大小为Standard_DS1_v2。因此,使用命令terraform plan -target="azurerm_linux_virtual_machine.myterraformvm[1]",它显示了如下所示的更改:

然后使用terraform apply -target="azurerm_linux_virtual_machine.myterraformvm[1]" -auto-approve命令,我更改了相同的内容,它也将在状态文件中由bydefault更新。您可以参考下面的图片:

在上面一行中,我只是针对特定的服务器,这是正确的做法吗?因为在vars文件中,我更改了将用于所有服务器的实例类型,执行此操作后,在旧配置中具有其他2台服务器的相同模块将发生什么情况

如上所述,你是正确的,它可以这样做,如上面的例子所示.As你的目标是一个索引模块,它不会影响其他两个服务器,因为我已经测试了相同的并在例子中添加了输出。

关于var文件中的实例类型,并不是所有的服务器都是这样,因为您的目标是一个特定的模块索引。

票数 0
EN

Stack Overflow用户

发布于 2021-12-01 20:10:16

因为Terraform是期望状态的声明性系统而不是命令式系统,所以这里的一般方法是更改配置以描述您希望系统现在看起来是什么样子,而不是确切地描述Terraform应该做什么更改。

您似乎有一个设置了count的资源,因此有多个相同资源的实例,每个实例都有自己的索引。在该资源的resource块的其他参数中,您可以使用count.index来引用每个实例的单个索引,这意味着您可以编写一个规则来根据索引选择实例类型。例如:

代码语言:javascript
复制
resource "azurerm_linux_virtual_machine" "new_vm" {
  count = 3

  size = count.index == 2 ? "Standard_DS1_v2" : "Standard_F2"
  # ...
}

在这里,精确匹配特定索引可能不是最好的规则,但是您可以通过编写任意的Terraform表达式来描述您想要的规则,从而编写指定哪个索引应该具有哪个size参数所需的任何规则。

当您针对现有基础架构创建计划时,Azure提供者将看到size参数仅针对此资源的实例的子集进行了更改,因此它将只计划更新或替换已更改的实例。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70169435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档