Nada como um bom e velho script em shell para ajudar a gente de nez em quando, né?
Eu estava com uma demanda esses dias em que precisava alterar o range de IPs nos meus hosts VMWare em uma rede que administro, um total de 85 VMs.
Para eu não ter que alterar manualmente em cada VM, eu peguei um Host de teste e criei somente 2 VMs dentro dele, a partir daí comecei a trabalhar em um script para alterar automaticamente o range de IPs nestas VMs.
Primeiro eu setei as variáveis que precisaria para o meus Host.
# Variáveis
VMWARE_HOST="your_vmware_host"
VMWARE_USER="your_vmware_username"
VMWARE_PASS="your_vmware_password"
NEW_IP="new_ip_address"
NEW_NETMASK="new_netmask"
NEW_GATEWAY="new_gateway_address"
Depois eu obtive uma lista de todas as VMs
# Lista de todas as VMs
VM_LIST=$(sshpass -p $VMWARE_PASS ssh $VMWARE_USER@$VMWARE_HOST "vim-cmd vmsvc/getallvms | awk '{if (NR!=1) {print $1}}'")
Fiz um loop pelas VMs alterando as configurações de rede.
# Loop through VMs and update network settings
for VM_ID in $VM_LIST; do
sshpass -p $VMWARE_PASS ssh $VMWARE_USER@$VMWARE_HOST "vim-cmd vmsvc/get.guest $VM_ID | grep ipAddress | awk -F'\"' '{print \$2}'" > /tmp/ipaddress.txt
VM_IP=$(cat /tmp/ips.txt)
sshpass -p $VMWARE_PASS ssh $VMWARE_USER@$VMWARE_HOST "vim-cmd vmsvc/device.getdevices $VM_ID | grep -B 4 $VM_IP | awk -F': ' '/macAddress/ {print \$2}'" > /tmp/macaddress.txt
VM_MAC=$(cat /tmp/macs.txt)
sshpass -p $VMWARE_PASS ssh $VMWARE_USER@$VMWARE_HOST "vim-cmd vmsvc/device.set $VM_ID vmxnet3 Ethernet0 address $VM_MAC"
sshpass -p $VMWARE_PASS ssh $VMWARE_USER@$VMWARE_HOST "vim-cmd vmsvc/device.set $VM_ID vmxnet3 Ethernet0 dhcp false"
sshpass -p $VMWARE_PASS ssh $VMWARE_USER@$VMWARE_HOST "vim-cmd vmsvc/device.set $VM_ID vmxnet3 Ethernet0 ipAddress $NEW_IP"
sshpass -p $VMWARE_PASS ssh $VMWARE_USER@$VMWARE_HOST "vim-cmd vmsvc/device.set $VM_ID vmxnet3 Ethernet0 subnetMask $NEW_NETMASK"
sshpass -p $VMWARE_PASS ssh $VMWARE_USER@$VMWARE_HOST "vim-cmd vmsvc/device.set $VM_ID vmxnet3 Ethernet0 gateway $NEW_GATEWAY"
echo "Network settings updated for VM $VM_ID"
done
Depois removi os arquivos temporários dos IPs e MACs.
# Clean up temporary files
rm /tmp/ips.txt
rm /tmp/macs.txt
Depois de testar e funcionar eu repliquei nos meus hosts VMWare e mudei todos os ranges de IPs.
Abaixo o código completo.
#!/bin/bash
# Set variables
VMWARE_HOST="your_vmware_host"
VMWARE_USER="your_vmware_username"
VMWARE_PASS="your_vmware_password"
NEW_IP="new_ip_address"
NEW_NETMASK="new_netmask"
NEW_GATEWAY="new_gateway_address"
# Get list of VMs
VM_LIST=$(sshpass -p $VMWARE_PASS ssh $VMWARE_USER@$VMWARE_HOST "vim-cmd vmsvc/getallvms | awk '{if (NR!=1) {print $1}}'")
# Loop through VMs and update network settings
for VM_ID in $VM_LIST; do
sshpass -p $VMWARE_PASS ssh $VMWARE_USER@$VMWARE_HOST "vim-cmd vmsvc/get.guest $VM_ID | grep ipAddress | awk -F'\"' '{print \$2}'" > /tmp/ipaddress.txt
VM_IP=$(cat /tmp/ips.txt)
sshpass -p $VMWARE_PASS ssh $VMWARE_USER@$VMWARE_HOST "vim-cmd vmsvc/device.getdevices $VM_ID | grep -B 4 $VM_IP | awk -F': ' '/macAddress/ {print \$2}'" > /tmp/macaddress.txt
VM_MAC=$(cat /tmp/macs.txt)
sshpass -p $VMWARE_PASS ssh $VMWARE_USER@$VMWARE_HOST "vim-cmd vmsvc/device.set $VM_ID vmxnet3 Ethernet0 address $VM_MAC"
sshpass -p $VMWARE_PASS ssh $VMWARE_USER@$VMWARE_HOST "vim-cmd vmsvc/device.set $VM_ID vmxnet3 Ethernet0 dhcp false"
sshpass -p $VMWARE_PASS ssh $VMWARE_USER@$VMWARE_HOST "vim-cmd vmsvc/device.set $VM_ID vmxnet3 Ethernet0 ipAddress $NEW_IP"
sshpass -p $VMWARE_PASS ssh $VMWARE_USER@$VMWARE_HOST "vim-cmd vmsvc/device.set $VM_ID vmxnet3 Ethernet0 subnetMask $NEW_NETMASK"
sshpass -p $VMWARE_PASS ssh $VMWARE_USER@$VMWARE_HOST "vim-cmd vmsvc/device.set $VM_ID vmxnet3 Ethernet0 gateway $NEW_GATEWAY"
echo "Network settings updated for VM $VM_ID"
done
# Clean up temporary files
rm /tmp/ips.txt
rm /tmp/macs.txt