blob: 84c2cdebf90f29bb652f401c21da3865ffbc8f8f [file] [log] [blame]
<?xml version='1.0' encoding='utf-8' ?>
<!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
<!ENTITY % BOOK_ENTITIES SYSTEM "cloudstack.ent">
%BOOK_ENTITIES;
]>
<!-- Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<section id="prepare-linux-template">
<title>System preparation for Linux</title>
<para>The following steps will prepare a basic Linux installation for templating.</para>
<orderedlist>
<listitem>
<para><emphasis role="bold">Installation</emphasis></para>
<para>It is good practice to name your VM something generic during installation, this will ensure components such as LVM do not appear unique to a machine. It is recommended that the name of "localhost" is used for installation.</para>
<warning><para>For CentOS, it is necessary to take unique identification out of the interface configuration file, for this edit /etc/sysconfig/network-scripts/ifcfg-eth0 and change the content to the following.</para>
<programlisting>
DEVICE=eth0
TYPE=Ethernet
BOOTPROTO=dhcp
ONBOOT=yes
</programlisting>
</warning>
<para>The next steps updates the packages on the Template Master.</para>
<itemizedlist>
<listitem>
<para>Ubuntu</para>
<programlisting>
sudo -i
apt-get update
apt-get upgrade -y
apt-get install -y acpid ntp
reboot
</programlisting>
</listitem>
<listitem>
<para>CentOS</para>
<programlisting>
ifup eth0
yum update -y
reboot
</programlisting>
</listitem>
</itemizedlist>
</listitem>
<listitem>
<para><emphasis role="bold">Password management</emphasis></para>
<note><para>If preferred, custom users (such as ones created during the Ubuntu installation) should be removed. First ensure the root user account is enabled by giving it a password and then login as root to continue.</para>
<programlisting>
sudo passwd root
logout
</programlisting>
<para>As root, remove any custom user accounts created during the installation process.</para>
<programlisting>
deluser myuser --remove-home
</programlisting>
</note>
<para>See <xref linkend="add-password-management-to-templates"/> for instructions to setup the password management script, this will allow &PRODUCT; to change your root password from the web interface.</para>
</listitem>
<listitem>
<para><emphasis role="bold">Hostname Management</emphasis></para>
<para>CentOS configures the hostname by default on boot. Unfortunately Ubuntu does not have this functionality, for Ubuntu installations use the following steps.</para>
<itemizedlist>
<listitem>
<para>Ubuntu</para>
<para>The hostname of a Templated VM is set by a custom script in /etc/dhcp/dhclient-exit-hooks.d, this script first checks if the current hostname is localhost, if true, it will get the host-name, domain-name and fixed-ip from the DHCP lease file and use those values to set the hostname and append the /etc/hosts file for local hostname resolution. Once this script, or a user has changed the hostname from localhost, it will no longer adjust system files regardless of it's new hostname. The script also recreates openssh-server keys, which should have been deleted before templating (shown below). Save the following script to /etc/dhcp/dhclient-exit-hooks.d/sethostname, and adjust the permissions.
</para>
<programlisting>
#!/bin/sh
# dhclient change hostname script for Ubuntu
oldhostname=$(hostname -s)
if [ $oldhostname = 'localhost' ]
then
sleep 10 # 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."
echo " Hostname: $hostname \n FQDN: $fqdn \n IP: $ip"
# Update /etc/hosts
awk -v i="$ip" -v f="$fqdn" -v h="$hostname" "/^127/{x=1} !/^127/ &amp;&amp; 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 $hostname
# Recreate SSH2
dpkg-reconfig openssh-server
fi
### End of Script ###
chmod 774 /etc/dhcp/dhclient-exit-hooks.d/sethostname
</programlisting>
</listitem>
</itemizedlist>
<warning><para>The following steps should be run when you are ready to template your Template Master. If the Template Master is rebooted during these steps you will have to run all the steps again. At the end of this process the Template Master should be shutdown and the template created in order to create and deploy the final template.</para></warning>
</listitem>
<listitem>
<para><emphasis role="bold">Remove the udev persistent device rules</emphasis></para>
<para>This step removes information unique to your Template Master such as network MAC addresses, lease files and CD block devices, the files are automatically generated on next boot.</para>
<itemizedlist>
<listitem>
<para>Ubuntu</para>
<programlisting>
rm -f /etc/udev/rules.d/70*
rm -f /var/lib/dhcp/dhclient.*
</programlisting>
</listitem>
<listitem>
<para>CentOS</para>
<programlisting>
rm -f /etc/udev/rules.d/70*
rm -f /var/lib/dhclient/*
</programlisting>
</listitem>
</itemizedlist>
</listitem>
<listitem>
<para><emphasis role="bold">Remove SSH Keys</emphasis></para>
<para>This step is to ensure all your Templated VMs do not have the same SSH keys, which would decrease the security of the machines dramatically.</para>
<programlisting>
rm -f /etc/ssh/*key*
</programlisting>
</listitem>
<listitem>
<para><emphasis role="bold">Cleaning log files</emphasis></para>
<para>It is good practice to remove old logs from the Template Master.</para>
<programlisting>
cat /dev/null > /var/log/audit/audit.log 2>/dev/null
cat /dev/null > /var/log/wtmp 2>/dev/null
logrotate -f /etc/logrotate.conf 2>/dev/null
rm -f /var/log/*-* /var/log/*.gz 2>/dev/null
</programlisting>
</listitem>
<listitem>
<para><emphasis role="bold">Setting hostname</emphasis></para>
<para>In order for the Ubuntu DHCP script to function and the CentOS dhclient to set the VM hostname they both require the Template Master's hostname to be "localhost", run the following commands to change the hostname.</para>
<programlisting>
hostname localhost
echo "localhost" > /etc/hostname
</programlisting>
</listitem>
<listitem>
<para><emphasis role="bold">Set user password to expire</emphasis></para>
<para>This step forces the user to change the password of the VM after the template has been deployed.</para>
<programlisting>
passwd --expire root
</programlisting>
</listitem>
<listitem>
<para><emphasis role="bold">Clearing User History</emphasis></para>
<para>The next step clears the bash commands you have just run.</para>
<programlisting>
history -c
unset HISTFILE
</programlisting>
</listitem>
<listitem>
<para><emphasis role="bold">Shutdown the VM</emphasis></para>
<para>Your now ready to shutdown your Template Master and create a template!</para>
<programlisting>
halt -p
</programlisting>
</listitem>
<listitem>
<para><emphasis role="bold">Create the template!</emphasis></para>
<para>You are now ready to create the template, for more information see <xref linkend="create-template-from-existing-vm"/>.</para>
</listitem>
</orderedlist>
<note><para>Templated VMs for both Ubuntu and CentOS may require a reboot after provisioning in order to pickup the hostname.</para></note>
</section>