Rocky 9.5 kickstart prompting only for hostname

All I am pulling my hair out trying to get an interactive portion only for the hostname in kickstart. I do not want to hardcode it via a directive and am trying %pre and %post things and they are not working… latest try is

# Pre-installation script to prompt for network settings
%pre --interpreter=/bin/bash
LOGFILE=/tmp/ks-pre.log
exec < /dev/tty6 > /dev/tty6 2> /dev/tty6
chvt 6
echo
echo "###################################"
echo "# Running Pre Setup Configuration #"
echo "###################################"
echo
(
# Predefined DNS servers (replace with actual values)
NAMESERVER="8.8.8.8,1.1.1.1"

# Simple validation function for IP addresses
validate_ip() {
  local ip=$1
  if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
    return 0
  else
    return 1
  fi
}

CONFIRM="no"
while [ "$CONFIRM" != "y" ] && [ "$CONFIRM" != "Y" ]; do
  echo -n "Hostname (or leave blank for DHCP): "
  read HOSTNAME
  if [ -z "$HOSTNAME" ]; then
    HOSTLINE="network --device=eth0 --bootproto=dhcp"
    echo -e -n "\\e[00;31mConfigure OS to use DHCP? (y/n): \\e[00m"
    read CONFIRM
  else
    # Prompt for static IP details
    while true; do
      echo -n "IP Address: "
      read IPADDRESS
      if validate_ip "$IPADDRESS"; then
        break
      else
        echo "Invalid IP address. Please try again."
      fi
    done

    while true; do
      echo -n "Netmask: "
      read NETMASK
      if validate_ip "$NETMASK"; then
        break
      else
        echo "Invalid netmask. Please try again."
      fi
    done

    while true; do
      echo -n "Gateway: "
      read GATEWAY
      if validate_ip "$GATEWAY"; then
        break
      else
        echo "Invalid gateway. Please try again."
      fi
    done

    echo -e "Hostname: \\e[01;36m$HOSTNAME\\e[00m"
    echo -e "IP Address: \\e[01;36m$IPADDRESS\\e[00m"
    echo -e "Netmask: \\e[01;36m$NETMASK\\e[00m"
    echo -e "Gateway: \\e[01;36m$GATEWAY\\e[00m"
    HOSTLINE="network --device=eth0 --bootproto=static --ip=$IPADDRESS --netmask=$NETMASK --gateway=$GATEWAY --nameserver=$NAMESERVER --hostname=$HOSTNAME"
    echo -n "Is the above configuration correct? (y/n): "
    read CONFIRM
  fi
done

# Save the network configuration
echo "$HOSTLINE" > /tmp/network.ks
hostname "$HOSTNAME" 2>/dev/null || true

# Inform user and resume
echo "Network configuration saved. Resuming automated installation..."
sleep 2
) 2>&1 | /usr/bin/tee $LOGFILE

# Switch back to the main installer terminal
chvt 1
exec < /dev/tty1 > /dev/tty1 2> /dev/tty1
%end

# Include the dynamically generated network configuration
%include /tmp/network.ks

# Post-installation script to persist network settings
%post --interpreter=/bin/bash
# Read the HOSTLINE to determine if DHCP or static
HOSTLINE=$(cat /tmp/network.ks)

# Persist hostname
if [[ "$HOSTLINE" =~ --hostname=([^ ]+) ]]; then
  HOSTNAME=${BASH_REMATCH[1]}
  cat > /etc/sysconfig/network <<EOF
NETWORKING=yes
HOSTNAME=$HOSTNAME
EOF
fi

# Persist interface settings
if [[ "$HOSTLINE" =~ --bootproto=dhcp ]]; then
  cat > /etc/sysconfig/network-scripts/ifcfg-eth0 <<EOF
DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes
EOF
else
  # Extract static IP details from HOSTLINE
  if [[ "$HOSTLINE" =~ --ip=([^ ]+) ]]; then IPADDRESS=${BASH_REMATCH[1]}; fi
  if [[ "$HOSTLINE" =~ --netmask=([^ ]+) ]]; then NETMASK=${BASH_REMATCH[1]}; fi
  if [[ "$HOSTLINE" =~ --gateway=([^ ]+) ]]; then GATEWAY=${BASH_REMATCH[1]}; fi
  if [[ "$HOSTLINE" =~ --nameserver=([^ ]+) ]]; then NAMESERVER=${BASH_REMATCH[1]}; fi

  cat > /etc/sysconfig/network-scripts/ifcfg-eth0 <<EOF
DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes
IPADDR=$IPADDRESS
NETMASK=$NETMASK
GATEWAY=$GATEWAY
DNS1=${NAMESERVER%%,*}  # Use the first DNS server
EOF
fi
%end

What I am finding is that when you press the first key to input any hostname, it continues the automated install with kickstart…

I am looking for any way to get the user experience of just prompting for a hostname only, so if what I have is overkill to get an interactive prompt in an automated install…I am open to suggestions :slight_smile:

According to man systemd-hostnamed.service:

The static hostname is stored in /etc/hostname, see hostname(5) for more information.

In principle, you could ask for the string in %post and write to that file?


My hosts do get their (transient) name from DHCP. I practically need static name only on multi-homed hosts.

Thank you for the response. Actually, what I posted actually does work with some tweaking. :slight_smile: It works pretty neat, pause automation, allow the interaction and then resumes the unattended build.

This topic was automatically closed 60 days after the last reply. New replies are no longer allowed.