This is an old revision of the document!
OS Install: Post Install
General Information
After installing an OS via kickstart or a VM Template, there is typically additional standard configuration performed depending upon the environment.
Checklist
- Distro(s): Enterprise Linux 6/7
Firstboot
Post install configuration is normally only needed to be completed the first time a system is booted in order to set it up for the type of environment it is in.
Firstboot: The script
This script is meant to run once and then disable itself. It calls other post install script(s) to do the actual work.
#!/bin/bash # Name: firstboot.sh # Description: Auto runs a post install script 1 time #### Customize These Variables #### nfs_server="10.1.2.3" nfs_server_share="${nfs_server}:/scripts" nfs_client_mountpoint="/mnt" post_install_script="${nfs_client_mountpoint}/scripts/postinstall.sh" # Write a successful run file firstboot_ran_file="/root/.firstboot-ran" # Reboot delay in minutes reboot_delay="1" #### End of Customize Variables #### #============================== # Functions; Main Starts After #============================== function check_os_type { ## Gather Distro and Major Version if [ -f /etc/system-release-cpe ];then distro=$(awk -F: '{printf "%s", $3}' /etc/system-release-cpe) major_version=$(awk -F: '{printf "%d", $5}' /etc/system-release-cpe) elif [ -f /etc/redhat-release ];then distro=$(awk '{printf "%s", $1}' /etc/redhat-release) major_version=$(awk -F. '{print $1}' /etc/redhat-release | awk '{printf "%d", $3}') fi } #==================== # Main Program #==================== echo -e "================================================" echo -e "####========== Firstboot Script ============####" echo -e "================================================" # Check to see if script has been run before if [[ -f ${firstboot_ran_file} ]]; then echo -e "\nfirstboot>> Error; First boot ran file detected at: ${firstboot_ran_file}!" echo -e "firstboot>> Will NOT execute this script. If you really want to execute, remove that file." exit 1 fi # Discover OS Type check_os_type # Start rpcbind service if [[ ${major_version} == "7" ]]; then systemctl start rpcbind else service rpcbind start fi # Try to reach the NFS server 3 times for index in 1 2 3; do ping -c 1 ${nfs_server} &> /dev/null if [[ $? -eq 0 ]]; then # Successful ping, exit loop break else # Unsuccessful; wait 10 seconds and try again echo -e "firstboot>> Could not reach ${nfs_server}. Sleeping for 10 seconds and will try again." sleep 10 fi done # Mount script location echo -e "\nfirstboot>> Mounting script location..." mount -t nfs ${nfs_server_share} ${nfs_client_mountpoint} # Execute post install script echo -e "\nfirstboot>> Executing post install script..." ${post_install_script} if [[ $? -eq 0 ]]; then echo -e "\nfirstboot>> Post install script successful." else echo -e "\nfirstboot>> Error; Post install script exited with error(s)! Quiting..." exit 1 fi #============================================== # Call other post install scripts/actions here #============================================== # Unmount nfs share echo -e "\nfirstboot>> Unmounting nfs share.." umount ${nfs_client_mountpoint} #### Safeguards to prevent firstboot.sh from running more than once #### # Create firstboot-ran file echo -e "\nfirstboot>> Creating firstboot ran file..." echo -e "firstboot>> firstboot.sh was run on $(date)." > ${firstboot_ran_file} chown -v root:root ${firstboot_ran_file} chmod -v 400 ${firstboot_ran_file} # Make script not executable echo -e "\nfirstboot>> Removing execute permissions on this script..." chown -v root:root ${0} chmod -v 400 ${0} # Disable auto execution if [[ ${major_version} == "7" ]]; then systemctl disable firstboot.service else sed -i '/firstboot.sh/d' /etc/rc.d/rc.local fi #### End of Safeguards #### # Email root notification of completion echo -e "\nfirstboot>> E-mailing root notification that the script completed..." echo -e "The firstboot script process has completed for: '$(hostname)' on $(date).\n\nThe following actions have successfully run:\n1) Post install script (System updates, General system configuration)\n2) Other scripts\n\nThe system ($(hostname)) will reboot in ${reboot_delay} minute(s)." | /bin/mail -s "Firstboot Complete: $(hostname)" root # Allow some time for the email to be sent sleep 5 # Reboot system shutdown -r +${reboot_delay} "firstboot>> Post install script(s) complete. System will be rebooted."
Firstboot: CentOS 7 Service
Firstboot will get executed on CentOS 7 via a custom systemd service unit.
The following service unit will end up in /etc/systemd/system/firstboot.service
[Unit] Description=Auto-execute post install scripts After=network.target [Service] ExecStart=/root/scripts/firstboot.sh [Install] WantedBy=multi-user.target
Firstboot: CentOS 6 Service
CentOS 6 will make use of rc.local to execute the script.
/etc/rc.d/rc.local (append)
/root/scripts/firstboot.sh
Auto Setup
Now that we have a firstboot script and method of executing (CentOS 7 service or CentOS 6 rc.local), the combination of the two can be added to VM templates or kickstarts for unattended execution.