我正在尝试在 cloudstack 中创建一个模板,但是在创建新的 VM 实例时未设置/etc/hostname
。/etc/hosts
我正在使用这个脚本:
#!/bin/sh
# dhclient change hostname script for Ubuntu
oldhostname=$(hostname -s)
if [ $oldhostname = 'localhost' ]
then
sleep 30 # Wait for configuration to be written to disk
hostname=$(cat /var/lib/dhcp/dhclient.eth0.leases | awk ' /host-name/ { host = $3 } END { printf host } ' | sed 's/[";]//g' )
fqdn="$hostname.$(cat /var/lib/dhcp/dhclient.eth0.leases | awk ' /domain-name/ { domain = $3 } END { printf domain } ' | sed 's/[";]//g')"
ip=$(cat /var/lib/dhcp/dhclient.eth0.leases | awk ' /fixed-address/ { lease = $2 } END { printf lease } ' | sed 's/[";]//g')
echo "cloudstack-hostname: Hostname _localhost_ detected. Changing hostname and adding hosts."
printf " Hostname: $hostname\n FQDN: $fqdn\n IP: $ip"
echo "Hostname: $hostname\n FQDN: $fqdn\n IP: $ip" >> "/var/log/hostchange"
# Update /etc/hosts
echo "$ip $fqdn $hostname" > /etc/hosts.dhcp.tmp
#awk -v i="$ip" -v f="$fqdn" -v h="$hostname" "/^127/{x=1} !/^127/ && x { x=0; print i,f,h; } { print $0; }" /etc/hosts > /etc/hosts.dhcp.tmp
mv /etc/hosts /etc/hosts.dhcp.bak
mv /etc/hosts.dhcp.tmp /etc/hosts
# Rename Host
echo $hostname > /etc/hostname
hostname -b -F /etc/hostname
echo $hostname > /proc/sys/kernel/hostname
# Recreate SSH2
export DEBIAN_FRONTEND=noninteractive
dpkg-reconfigure openssh-server
fi
### End of Script ###
当我设置主机名localhost
并重新启动时,一切正常。
当我创建新实例时,它不起作用:使用前一个虚拟机的主机名(我用来创建模板的虚拟机)
rm -f /var/lib/dhcp/dhclient.*
当我在创建模板之前运行时,主机名将为空白。但租约文件中有正确的数据。
答案1
云初始化是适合您用例的更好选择。它具有 Cloudstack 提供商支持:http://docs.cloudstack.apache.org/projects/cloudstack-administration/en/4.8/virtual_machines/user-data.html
答案2
当我将主机名设置为 localhost 并重新启动时,一切正常。
当我创建新实例时,它不起作用:使用前一个虚拟机的主机名(我用来创建模板的虚拟机)
这是否表明主机名不是“localhost”
如果 [ $oldhostname = 'localhost' ]
不会起作用,因此脚本的其余部分将被跳过。
测试模板名称不是更好吗?也许让脚本在成功运行一次后删除自身 - 这样您就不需要检查主机名了。