1

我正在使用 packer.io 将单个 VM 部署到 Azure。我项目的下一步是将 VM 集群部署到 Azure。在我看来,仅 Packer 是不够的(如果我错了,请纠正我)来协调集群的部署。所以,我需要其他东西来协调部署。因为它是一个集群,所以其中的每台机器都需要知道每台其他机器的 IP 地址(我的应用程序是一个分布式数据库。)我正在查看 terraform.io,但它的文档没有任何关于 Azure 的示例. 有什么资源可以开始吗?terraform 是我需要的吗?你会推荐任何其他工具吗?另一个复杂之处是我正在尝试为我的客户自动部署演示虚拟机。我目前的工作流程是,使用打包程序,创建一个虚拟机,安装我的数据库,创建必要的用户帐户,将某些暂存目录上传到 VM。然后我拍摄快照以获取我的图像。后来,这个映像由我的客户从 VMDepot 部署(到他们的 Azure 帐户)。同样,现在,这只是一个单机集群。稍后,这将需要一组至少四台机器。是否有更好的工作流程来完成此任务?

感谢您的时间。

4

1 回答 1

0

Terraform 有一个 Azure 提供程序,尽管我认为在您提出原始问题时它尚未开发。

Terraform 允许创建同一资源的多个“副本”,这对于创建集群很有用。但是,将所有主机的 IP 地址一起传递到这些实例中可能会很棘手,因为配置步骤必须等到所有实例都完成。这种排序的常见解决方法是使用未记录null_resource的在主机上运行独立的配置步骤。例如:

resource "azure_instance" "web" {
    name = "terraform-test"
    hosted_service_name = "${azure_hosted_service.example.name}"
    image = "Ubuntu Server 14.04 LTS"
    size = "Basic_A1"
    storage_service_name = "yourstorage"
    location = "West US"
    username = "terraform"
    password = "Pass!admin123"

    # Tell Terraform to create 3 identical instances.
    count = 3

    endpoint {
        name = "SSH"
        protocol = "tcp"
        public_port = 22
        private_port = 22
    }
}

resource "null_resource" "provision" {
    count = 3

    connection {
        host = "${lookup(azura_instance.web.*.ip_address, count.index)}"
        user = "terraform"
        password = "Pass!admin123"
    }

    provisioner "remote-exec" {
        inline = [
            "/usr/local/bin/configure-cluster ${join(" ", azura_instance.web.*.ip_address)}",
        ]
    }
}

空资源的三个副本都依赖于所有三个azure_instance资源,因此在所有实例都准备好之前不会创建和配置它。一旦实例都准备就绪,每个空资源都被配置为连接到其对应的实例(按索引),然后configure-cluster在其实例上运行一个虚构的命令,将完整的集群 IP 地址集作为参数传递。

请注意,配置程序仅在资源的初始创建时运行。对资源的更新不会重新运行配置程序。由于空资源实际上并不代表真正的基础设施资源,因此可以通过“污染”它轻松地重新运行配置步骤,以便 Terraform 将在下一次重新创建它apply

terraform taint null_resource.provision
于 2015-07-19T08:29:21.617 回答