Terraform和更新

时间:2016-08-30 08:20:39

标签: azure terraform

能够在单个Terraform文件中捕获基础架构具有明显的优势。但是,我不清楚如何 - 例如,一旦创建了虚拟机 - 处理后续更新。

所以,提供一个特定的场景。假设我们使用Terraform设置了一个带有SQL Server 2014的Azure虚拟机。然后,一个月后我们决定使用刚刚发布的SQL Server 2014的最新服务包来更新该虚拟机。

我们建议您更新Terraform配置文件并重新应用它吗?

3 个答案:

答案 0 :(得分:4)

我不同意其他两个回应。 Terraform可以很好地处理基础架构更新。然而,要理解的关键是Terraform主要遵循不可变基础设施范例,这意味着要更新"更新"在资源中,您删除旧资源并创建一个新资源来替换它。这很像函数式编程,其中变量是不可变的,并且更新"实际上,你创建了一个新的变量。

使用Terraform的典型模式是使用它来部署服务器映像,例如虚拟机(VM)映像(例如Amazon Machine Image (AMI))或容器映像(例如Docker Image)。当你想"更新"您可以创建映像的新版本,将其部署到新服务器上,然后取消部署旧服务器。

以下是一个如何运作的例子:

想象一下,您正在构建Ruby on Rails应用程序。你让应用程序在开发中工作,现在是时候部署到prod了。第一步是将应用程序打包为AMI。您可以使用Packer之类的工具执行此操作。现在你有一个id为ami-1234的AMI。

以下是Terraform模板,您可以使用该模板在AWS中的服务器(EC2 Instance)上部署此AMI,并附加Elastic IP Address

resource "aws_instance" "example" {
  ami = "ami-1234"
  instance_type = "t2.micro"
}

resource "aws_eip" "example" {
  instance = "${aws_instance.example.id}"
}

当您运行terraform apply时,Terraform会部署服务器,为其附加IP地址,现在当用户访问该IP时,他们将看到您的Rails应用程序的v1。

一段时间后,您更新了Rails应用程序并希望部署新版本v2。要做到这一点,你建立一个新的AMI(即你再次运行Packer)来获得一个带ID和#34; ami-5678"的ami。您可以相应地更新Terraform模板:

resource "aws_instance" "example" {
  ami = "ami-5678"
  instance_type = "t2.micro"
}

当您运行terraform apply时,Terraform取消部署旧服务器(因为Terraform records the state of your infrastructure可以找到它),使用新的AMI部署新服务器,现在用户将看到您的代码的v2相同的IP。

当然,这里有一个问题:在Terraform取消部署v1和部署v2之间,用户会看到停机时间。要解决此问题,您可以使用Terraform的create_before_destroy生命周期设置:

resource "aws_instance" "example" {
  ami = "ami-5678"
  instance_type = "t2.micro"

  lifecycle {
    create_before_destroy = true
  }
}

create_before_destroy设置为true,Terraform将首先创建替换服务器,将IP切换到它,然后删除旧服务器。这允许您使用不可变基础架构进行零停机部署(注意:零停机时间部署可以更好地使用负载均衡器,可以执行运行状况检查,而不是简单的IP地址,尤其是如果您的服务器需要很长时间才能启动)。 p>

有关详细信息,请查看书籍 Terraform: Up & Running 。本书的代码示例包括使用服务器群集和负载均衡器进行零停机部署的示例:https://github.com/brikis98/terraform-up-and-running-code

答案 1 :(得分:1)

Terraform不适合这类任务。 Terraform是一种基础架构管理工具,而不是配置管理。

您应该使用chef,puppet和ansible等工具来处理系统的配置。

如果必须使用terraform执行此任务;您可以创建template_file资源并放置在安装SQL Server所需的配置中,以及如果显示不同的版本,如何升级。参考:here

将该代码放在provisioner资源下的null_resource内。参考:here
此触发器可以是包含SQL版本的变量。因此,当您提供不同版本的SQL时,它将在每个实例上执行该配置程序以升级版本。

答案 2 :(得分:1)

Terraform是一种基础架构配置工具,配置/部署工具将是:

  • 厨师
  • saltstack
  • ansible
  • 等,

当我与厨师合作时,基本上,我通过terraform配置服务器实例,然后terraform(terraform provisioner)处理对厨师的控制以进行系统配置和部署。

目前,terraform无法删除Chef服务器中的节点/客户端,因此在terraform destroy之后,您需要自行删除它们。