Automated builds using CentOS 7 and Kickstart

Rapid Install

Syncing Repos

To ease administration of keeping the Kickstart repo in sync, I install the yum-utils packages (Listing 3), which includes the useful program reposync.

Listing 3

Install yum-utils

[root@kickstart ~]# yum install yum-utils
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base:
 * extras:
 * updates:
Resolving Dependencies
--> Running transaction check
---> Package yum-utils.noarch 0:1.1.31-25.el7_0 will be installed
--> Processing Dependency: python-kitchen for package: yum-utils-1.1.31-25.el7_0.noarch
-kitchen-1.1.1-5.el7.noarch                            2/3
  Installing : yum-utils-1.1.31-25.el7_0.noarch                             3/3
  Verifying  : python-chardet-2.0.1-7.el7.noarch                            1/3
  Verifying  : python-kitchen-1.1.1-5.el7.noarch                            2/3
  Verifying  : yum-utils-1.1.31-25.el7_0.noarch                             3/3
  yum-utils.noarch 0:1.1.31-25.el7_0
Dependency Installed:
  python-chardet.noarch 0:2.0.1-7.el7       python-kitchen.noarch 0:1.1.1-5.el7

Creating a Repository

I can now use reposync to create the repository in the /var/www/html directory with:

[root@kickstart ~]# cd /var/www/html/
[root@kickstart base]# reposync -r base -a x86_64 -n

Reposync will look for the base repo in /etc/yum.repos.d/ and then sync from the particular web server found. Because the system was created from a CentOS DVD, it points to the CentOS repository.

This process will churn along for quite a while, because the repository is more than 4GB in size. Once it is complete, you can then install creatrepo with yum install createrepo, as shown in Listing 4.

Listing 4

Install createrepo

[root@localhost ~]# yum install createrepo
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base:
 * extras:
 * updates:
Resolving Dependencies
--> Running transaction check
---> Package createrepo.noarch 0:0.9.9-23.el7 will be installed
~...                                1/6
  Installing : python-deltarpm-3.6-3.el7.x86_64                             2/6
  Updating   : libxml2-2.9.1-5.el7_0.1.x86_64                               3/6
  Installing : libxml2-python-2.9.1-5.el7_0.1.x86_64                        4/6
  Installing : createrepo-0.9.9-23.el7.noarch                               5/6
  Cleanup    : libxml2-2.9.1-5.el7.x86_64                                   6/6
  Verifying  : python-deltarpm-3.6-3.el7.x86_64                             1/6
  Verifying  : libxml2-python-2.9.1-5.el7_0.1.x86_64                        2/6
  Verifying  : deltarpm-3.6-3.el7.x86_64                                    3/6
  Verifying  : createrepo-0.9.9-23.el7.noarch                               4/6
  Verifying  : libxml2-2.9.1-5.el7_0.1.x86_64                               5/6
  Verifying  : libxml2-2.9.1-5.el7.x86_64                                   6/6
  createrepo.noarch 0:0.9.9-23.el7
Dependency Installed:
  deltarpm.x86_64 0:3.6-3.el7           libxml2-python.x86_64 0:2.9.1-5.el7_0.1
  python-deltarpm.x86_64 0:3.6-3.el7
Dependency Updated:
  libxml2.x86_64 0:2.9.1-5.el7_0.1

Creating the repo does not provide a context for the groups used by CentOS (Red Hat). For example, there is no concept of a minimal install, web server install, or the like. To support this, you must set up the repo to support groups:

[root@localhost ~]# cd /var/www/html/
[root@localhost ~]# mkdir repodata

Now, mount the DVD media into the DVD drive and mount it on the filesystem (Listing 5). The actual repository metadata can now be created as shown in Listing 6.

Listing 5

Mount the DVD

01 [root@localhost ~]# mount /dev/sr0 /media/
02 [root@localhost ~]# cp /media/repodata/4b9ac2454536a901fecbc1a5ad080b0efd
03 [root@localhost ~]# gunzip /var/www/html/repodata/4b9ac2454536a901
04 [root@localhost ~]# rm /var/www/html/repodata/4b9ac2454536a901fecbc1

Listing 6

createrepo Metadata

01 [root@localhost ~]# cd /var/www/htm/base/
02 [root@localhost ~]# createrepo -g repodata/4b9ac2454536a901fecbc1a5ad
   .Spawning worker 0 with 8465 pkgs
03 Workers Finished
04 Saving Primary metadata
05 Saving file lists metadata
06 Saving other metadata
07 Generating sqlite DBs
08 Sqlite DBs complete
09 [root@localhost ~]#


Although I am not going to go through DHCP and PXE boot configuration here, I can still test the Kickstart process using the DVD and Kickstart file created to build the Kickstart server:

[root@localhost html]# cd /root/
[root@localhost ~]# cp anaconda-ks.cfg /var/www/html/kickstart.ks

Because I installed from DVD, I need to change the new Kickstart file so that it will read the packages from the new Apache server. To do this, edit the /var/www/html/kickstart.ks file and change the entry that says cdrom to this entry:

url --url

Replace with the IP address of your Kickstart server. Also, you need to find the clearpart entry that looks like this

clearpart --none --initlable

and change it to:

clearpart ---drives --all initlabel

Warning: Do not kickstart a system for which you do not intend to erase the drives, because the clearpart --all parameter will create new file partitions on the drive.

Although this is a basic Kickstart setup, it makes for a great start on which to build out any customizations. To use the Kickstart and repository I set up here, boot up another system with the CentOS 7 DVD; then, when you see Install CentOS 7 , instead of selecting an option, hit the Escape key and enter the following at the boot prompt:

linux ks=

About five minutes later, on an average network, the new server will be built.

Buy this article as PDF

Express-Checkout as PDF
Price $2.95
(incl. VAT)

Buy ADMIN Magazine

Get it on Google Play

US / Canada

Get it on Google Play

UK / Australia

Related content

comments powered by Disqus
Subscribe to our ADMIN Newsletters
Subscribe to our Linux Newsletters
Find Linux and Open Source Jobs

Support Our Work

ADMIN content is made possible with support from readers like you. Please consider contributing when you've found an article to be beneficial.

Learn More”>


		<div class=