通过 Terraform 使用 cloud-init 配置 Ubuntu 18.04 的静态网络
Static network configuration of Ubuntu 18.04 with cloud-init through Terraform
我正在使用 Terraform 在 VMware vSphere 上部署 Ubuntu 18.04 VM,我需要应用一些基本配置,所以我正在使用 cloud-init。
大部分工作正常(设置主机名、添加用户、运行 命令)但我完全无法为网络接口配置静态 IP 地址。
我正在使用 Ubuntu 的 stock cloud images 从他们的 .ova
文件部署并立即转换为模板,而无需打开它们。我可以看到我的数据在 /var/lib/cloud/instance/user-data.txt.i
中被正确地渲染到一个多部分文件,但是网络配置 没有 得到应用。
我不明白我做错了什么,我什至不知道问题出在数据位置(多部分文件名和内容类型)还是它的内容。任何帮助将不胜感激。
这是我在 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: $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 但没有任何运气。
好的,我今天遇到了同样的问题,我想在这里分享解决方案。
问题是您通过 vsphere 为 ubuntu 云图像使用的用户数据无法更改网络内容!所以你需要手动做一些事情。
这已经在这里被发现,dalo 提供了一个很好的、聪明的答案,它确实帮助了我,并且应该也能解决你的问题:
https://communities.vmware.com/message/2872244#2872244
所以基本上你可以用你自己的 cloud-init 覆盖默认网络配置,然后激活它。但请注意,虚拟机在首次启动时通过 dhcp 获取 ip。执行 netplan apply 命令后,vm 获取静态 ip,并且在重新启动后仍然存在。
我正在使用 Terraform 在 VMware vSphere 上部署 Ubuntu 18.04 VM,我需要应用一些基本配置,所以我正在使用 cloud-init。
大部分工作正常(设置主机名、添加用户、运行 命令)但我完全无法为网络接口配置静态 IP 地址。
我正在使用 Ubuntu 的 stock cloud images 从他们的 .ova
文件部署并立即转换为模板,而无需打开它们。我可以看到我的数据在 /var/lib/cloud/instance/user-data.txt.i
中被正确地渲染到一个多部分文件,但是网络配置 没有 得到应用。
我不明白我做错了什么,我什至不知道问题出在数据位置(多部分文件名和内容类型)还是它的内容。任何帮助将不胜感激。
这是我在 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: $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 但没有任何运气。
好的,我今天遇到了同样的问题,我想在这里分享解决方案。
问题是您通过 vsphere 为 ubuntu 云图像使用的用户数据无法更改网络内容!所以你需要手动做一些事情。
这已经在这里被发现,dalo 提供了一个很好的、聪明的答案,它确实帮助了我,并且应该也能解决你的问题: https://communities.vmware.com/message/2872244#2872244
所以基本上你可以用你自己的 cloud-init 覆盖默认网络配置,然后激活它。但请注意,虚拟机在首次启动时通过 dhcp 获取 ip。执行 netplan apply 命令后,vm 获取静态 ip,并且在重新启动后仍然存在。