如何配置 VMWare 克隆映像以获取唯一的 IP 地址?

如何配置 VMWare 克隆映像以获取唯一的 IP 地址?

我正在使用配置内部构建系统团队城市使用 VMWare vSphere。配置完成后,构建服务器应该开始构建代理使用 vSphere API 的虚拟机。TeamCity 构建服务器已经启动了我所需的构建代理虚拟机,但存在一个问题。

当构建服务器检测到需要多个代理虚拟机时,它会非常快速地启动虚拟机,并且这些虚拟机在约 80% 的情况下往往会获得相同的 IP 地址。如果我手动启动构建代理并在调用之间稍作停顿,虚拟机将获得唯一的 IP 地址。

相同的 IP 地址会导致许多网络问题。以下是 2 个具有相同 IP 地址的构建代理虚拟机的屏幕截图。 VM IP4 相同

我认为 vSphere 使用的是具有 DHCP 服务的 Cisco Meraki 盒,但我无法访问它。我花了几天时间试图将这个问题缩小到上面的屏幕截图,但我不知道接下来该怎么做。我以为 DHCP 服务应该可以很好地处理这种情况,但我一定是配置错误了。

我的构建代理虚拟机是 Ubuntu 20.04 LTS,当我创建快照时,它没有预先配置 DHCP。我没有运行任何脚本来准备快照映像,它或多或少是安装了 docker 的原始 Ubuntu,我们所有的构建都是容器化的。我使用的是克隆的虚拟机,而不是模板。

有人可以给我指明正确的方向吗?

答案1

我的构建代理 VM 是 Ubuntu 20.04 LTS,当我创建快照时它没有预先配置 DHCP。

应该有。
如果在拍摄虚拟机快照时虚拟机具有静态 IP 地址,则从该快照创建的所有克隆在启动时都会尝试使用相同的网络配置。这根本行不通,即使您在部署它们时等待。
我认为发生的事情是,当虚拟机启动并发现其 IP 地址已被使用时,它会自动切换到 DHCP 以获取新的 IP 地址;但如果您同时启动其中两个,它们不会检测到任何 IP 冲突,只会尝试使用其现有配置。
您应该在克隆基础映像之前为其配置 DHCP。

答案2

不确定这是否理想,但我会描述我为解决这个问题所做的事情。这是一个黑客所以请不要使用它,除非所有其他方法都失败了

启用netplan,但禁用 IPv4 DHCP。出于某种原因,当我创建了同一克隆的多个实例时一些实例有相同的 IP

sudo nano /etc/netplan/00-installer-config.yaml
---
network:
  version: 2
  renderer: networkd
  ethernets:
    ens160:
      dhcp4: false
---

添加作业以在启动时配置 IPv4 地址

sudo crontab -e
-- 
@reboot /usr/bin/bash /boot-config.sh > /boot-config.log
--

创建启动配置文件

sudo touch /boot-config.sh
sudo chown root:root /boot-config.sh
sudo chmod +x /boot-config.sh

对于某些程序,使用完整路径很重要,因为$PATH不包含/usr/sbin,例如,在启动时cron调用脚本

sudo nano /boot-config.sh
---
#!/bin/bash

echo "*********************"
echo "Boot config script"
echo "*********************"

echo "PATH: " $PATH
echo "Running via " $SHELL
echo "Current working directory " $(pwd)

echo ""
echo "Releasing IP address for ens160"
/usr/sbin/dhclient -v -r ens160

echo "Removing DHCP lease files"
rm /var/lib/dhcp/*

echo "Generating new machine id"
echo "Old id: " $(cat /etc/machine-id)
rm /etc/machine-id
systemd-machine-id-setup
echo "New id: " $(cat /etc/machine-id)

echo "Requesting new IP"
/usr/sbin/dhclient -v  ens160

echo ""
echo "Finished"
---

# You should be able to see the result in the log file
sudo cat /boot-config.log

PS:将此标记为答案,但是https://serverfault.com/a/1034226/82856对解决问题很有帮助。

相关内容