2015-05-08 35 views
1

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

谢谢你的时间。

回答

0

Terraform有an Azure provider,虽然我认为它还没有在你问你原来​​的问题的时候开发。

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