首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向terraform提供程序/资源vSphere vsphere_virtual_machine添加多个静态IP

向terraform提供程序/资源vSphere vsphere_virtual_machine添加多个静态IP
EN

Stack Overflow用户
提问于 2020-04-08 14:56:07
回答 1查看 1.1K关注 0票数 0

我有Terraform代码,可以旋转超过50个Ubuntu,在两个数据中心之间平均分割。每个VM都有自己的静态IP作为主(通过cidrhost设置),而DHCP不是选项。Terraform代码工作得很好。

现在,我必须为每个VM分配一个由40个静态it组成的特定块,最好是分配给相同的NIC,我不知道如何实现它。第一个区块从10.32.128.64开始。

代码语言:javascript
复制
provider "vsphere" {
        version                 = "~> 1.17"
        alias                   = "jdcProvider"
}

### Acceptable values: 1-25.
variable "Counter" {
        default         = 1
        description     = "How many load-testing VMs should we create PER DATACENTER?"
}

### 1st datacenter IP range: 10.32.128.12 - .37
### 2nd datacenter IP range: 10.32.128.38 - .63
variable "jdcLastOctet" {
        default         = 12
        description     = "10.32.128.x  where x is the number above"
}

这是第一个数据中心的资源。第二个数据中心的代码非常相似。

代码语言:javascript
复制
resource "vsphere_virtual_machine" "jdcResource" {
        provider                = vsphere.jdcProvider
        count                   = var.Counter
        name                    = "loadtst-J-${count.index}"

        clone {
                customize {
                        dns_server_list         = ["1.1.1.1", "2.2.2.2"]
                        dns_suffix_list         = ["example.com", "example.org"]
                        ipv4_gateway            = "10.32.128.1"
                        linux_options {
                                host_name       = "loadtst-J-${count.index}"
                                domain          = "example.com"
                        }
                        network_interface {
                                ipv4_address    = cidrhost("10.32.128.0/24", var.jdcLastOctet+count.index )
                                ipv4_netmask    = 21
                        }
                }
                linked_clone    = false
                template_uuid   = data.vsphere_virtual_machine.JDC.id
        }
        network_interface {
                network_id      = data.vsphere_network.JDC.id
                adapter_type    = data.vsphere_virtual_machine.JDC.network_interface_types[0]
        }
        wait_for_guest_net_timeout = 1
}
EN

回答 1

Stack Overflow用户

发布于 2020-04-09 17:22:12

我找到的一个解决办法是编写一个脚本,将I块作为外部文件生成,然后使用Terraform provisioner file将适当的文件发送到相应的服务器。

Psudeo码

代码语言:javascript
复制
# split 2000 IPs into blocks of 40, into J & W files.  ex: J-0, W-0, J-1, W-1, ...
# J files go to one datacenter; W files to the other datacenter.
# starting IP is 10.32.128.64
$jCount=0
$wCount=0
$Octet3=128
$Octet4=64
$IPCount=0
$Filename=""
$BlocksOf=40
$TotalIPCount=2000

while (1) {
  for ($Octet4; $Octet4 <= 255; $Octet4++) {
    exit if ($IPCount equals $TotalIPCount)
    if ($IPCount notEqualTo 0 -and (0 equals $IPCount%(2*$BlocksOf)) ) {
       $jCount++
       $wCount++
    }
    if ( ($IPCount/$BlocksOf)%2 ) {
      $Filename="W-" + $wCount
    }
    else {
      $Filename="J-" + $jCount
    }
    open("IP_block_ranges/$Filename", append)
    write(filehandle "ip addr add 10.32.$Octet3.$Octet4/21 dev ens192\n" )
    close(filehandle)
    $IPCount++
  }
  $Octet3++
  $Octet4=0
}

更新地形代码

代码语言:javascript
复制
resource "vsphere_virtual_machine" "jdcResource" {
        provider                = vsphere.jdcProvider
        count                   = var.Counter
        name                    = "loadtst-J-${count.index}"

        clone {
                customize {
                        dns_server_list         = ["1.1.1.1", "2.2.2.2"]
                        dns_suffix_list         = ["example.com", "example.org"]
                        ipv4_gateway            = "10.32.128.1"
                        linux_options {
                                host_name       = "loadtst-J-${count.index}"
                                domain          = "example.com"
                        }
                        network_interface {
                                ipv4_address    = cidrhost("10.32.128.0/24", var.jdcLastOctet+count.index )
                                ipv4_netmask    = 21
                        }
                }
                linked_clone    = false
                template_uuid   = data.vsphere_virtual_machine.JDC.id
        }
        network_interface {
                network_id      = data.vsphere_network.JDC.id
                adapter_type    = data.vsphere_virtual_machine.JDC.network_interface_types[0]
        }
        wait_for_guest_net_timeout = 1

        provisioner "file" {
                source      = "IP_block_ranges/J-${count.index}"
                destination = "/tmp/extra_IPs"
        }
        provisioner "remote-exec" {
                inline = [
                        "sudo sh /tmp/extra_IPs",
                        "sudo rm /tmp/extra_IPs"
                ]
        }
}

不像我所希望的那样充满活力,但那就完成了任务。

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

https://stackoverflow.com/questions/61103703

复制
相关文章

相似问题

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