通过Terraform进行cloud-init的Ubuntu 18.04的静态网络配置

时间:2019-04-26 14:03:14

标签: ubuntu vmware terraform ubuntu-18.04 cloud-init

我正在使用Terraform在VMware vSphere上部署Ubuntu 18.04 VM,我需要应用一些基本配置,因此我正在使用cloud-init。

大多数事情都可以正常工作(设置主机名,添加用户,运行命令),但是我完全无法为网络接口配置静态IP地址。

我正在使用从.ova文件中部署的Ubuntu stock cloud images,并立即将其转换为模板,而无需打开它们的电源。我可以看到我的数据已正确呈现到/var/lib/cloud/instance/user-data.txt.i中的多部分文件中,但是然后应用了网络配置 not

我不明白我在做什么错,我什至不知道问题出在数据位置(多部分文件名和内容类型)还是其内容。任何帮助将不胜感激。

这是我在Terraform中与cloud-init相关的代码:

data "template_file" "cloud-config" {
  template = <<YAML
#cloud-config
hostname: ${var.vm_hostname}
# Adds a user called 'example' with the password hash of 'passwort', sudo rights and the default ubuntu groups
users:
  - name: example
    passwd: $6$rounds=4096$P0uvlB9.8nsiY67$uuOxYSk6n/74Ds3JtV1mT6xYjOguwTWgNmOeHvcHiQa9zan57l8dvfHE/zlu19fDmJGySNzLmh6K0R2I1AU9o0
    lock_passwd: false 
    sudo: ALL=(ALL) ALL
    groups: [adm, audio, cdrom, dialout, floppy, video, plugdev, dip, netdev]
runcmd:
  - echo 'This instance was provisioned by Terraform.' >> /etc/motd
  - sed -i s/^PasswordAuthentication\ no\$/PasswordAuthentication\ yes/ /etc/ssh/sshd_config
power_state:
  mode: 'reboot'
  message: 'reboot triggered by cloud-init'
YAML
}

# network-config
data "template_file" "network-config-v2" {
  template = <<YAML
version: 2
ethernets:
  ens192:
    addresses: [${var.vm_ip4address}/${var.vm_ip4subnet}]
    gateway4: ${var.vm_ip4gateway}
YAML
}

data template_cloudinit_config "config" {
  gzip          = true
  base64_encode = true
  part {
    filename     = "init.cfg"
    content_type = "text/cloud-config"
    content      = "${data.template_file.cloud-config.rendered}"
  }
  part {
    filename     = "network-config"
    # also tried text/plain here
    content_type = "text/cloud-config"
    content      = "${data.template_file.network-config-v2.rendered}"
  }
}

resource "vsphere_virtual_machine" "vm" {
  # some details omitted for brevity
  network_interface {
    network_id = "${data.vsphere_network.network.id}"
    adapter_type = "${data.vsphere_virtual_machine.template.network_interface_types[0]}"
  }
  wait_for_guest_net_routable = false
  vapp {
    properties {
      user-data = "${data.template_cloudinit_config.config.rendered}"
    }
  }
}

这些是我能找到的唯一相关的cloud-init.log行,这只是说它已退回到默认的dhcp配置:

2019-04-26 13:04:14,373 - __init__.py[DEBUG]: no work necessary for renaming of [['00:50:56:86:ca:38', 'ens192', 'vmxnet3', '0x07b0']]
2019-04-26 13:04:14,375 - stages.py[INFO]: Applying network configuration from fallback bringup=False: {'config': [{'type': 'physical', 'name': 'ens192', 'mac_address': '00:50:56:86:ca:38', 'subnets': [{'type': 'dhcp'}]}], 'version': 1}
2019-04-26 13:04:14,397 - __init__.py[DEBUG]: Selected renderer 'netplan' from priority list: None
2019-04-26 13:04:14,405 - util.py[DEBUG]: Writing to /etc/netplan/50-cloud-init.yaml - wb: [644] 477 bytes

对于它的价值,我也尝试使用network config format 1,但没有任何运气。

1 个答案:

答案 0 :(得分:0)

好的,所以我今天遇到了同样的问题,我想在这里分享解决方案。

问题在于,您通过vsphere用于ubuntu云映像的用户数据无法更改网络内容!因此,您需要手动执行操作。

这已经在这里发现了, dalo 给出了一个很好的,聪明的答案,它确实帮助了我,也应该解决您的问题: https://communities.vmware.com/message/2872244#2872244

因此,基本上,您可以使用自己的cloud-init覆盖默认网络配置,然后再激活它。但是请注意,虚拟机在首次启动时会通过dhcp获取IP。执行netplan apply命令后,虚拟机将获取静态ip,并且在重新启动后仍然存在。