We can use YUM to detect the distribution and the architecture. In this way we can maintain a unique release/architecture independent file instead of many different versions. This simplifies also the fabric management part. For example if you use Cfengine you don't have to maintain special classes to handle different yum.conf files.
Modify yum.conf (see example) to include in the main section
See tips to know what the value of your distro-release should be. This will enable to use $releasever yum variable in the yum.conf urls together with $basearch.
The naming scheme of the directories on the software server has to conform to what yum wants to see. For example a directory /path/external can have subdirs
sl3/i386 sl4/i386 sl4/x86_64
and then for each specific release version that we use we just add a link to the correct sl directory. So for example we can have something similar
/path/external/3.0.3 -> sl3 /path/external/3.0.7 -> sl3 /path/external/4.4 -> sl4
the same can be created for the OS
/path/SL/3.0.7 -> /anotherpath/SL3/Mirror/307 /path/SL/3.0.8 -> /anotherpath/SL3/Mirror/308 /path/SL/4.4 -> /anotherpathSL4/Mirror/44 /path/SL/4.5 -> /anotherpath/SL4/Mirror/45
and for other software like the glite software below:
/path/glite/3.0.7 -> /athirdpath/glite3.0 /path/glite/4.4 -> /athirdpath/Glite-3.1/generic/sl4 /path/glite/4.5 -> /athirdpath/Glite-3.1/generic/sl4
Now we just have to maintain the links which is rather easier than maintaining a file for each release and architecture.
This is an example of yum.conf corresponding to the above structure:
[main] cachedir=/var/cache/yum debuglevel=2 logfile=/var/log/yum.log pkgpolicy=newest tolerant=1 exactarch=1 distroverpkg=sl-release [slserver] name=SL $releasever base baseurl=http://<your-server>/path/SL/$releasever/$basearch/SL/RPMS/ [slerrata] name=SL $releasever errata baseurl=http://<your-server>/path/SL/$releasever/$basearch/errata/SL/RPMS/ [local-external] name=Local Ext baseurl=http://<your-server>/path/external/$releasever/$basearch/ [glite] name=Glite Mirror baseurl=http://<your-server>/path/glite/$releasever/$basearch/ [lcg-CAs] name=LCG CAs baseurl=http://<your-server>/path/lcg-CA
distroverpkg has to match the package name to which the file /etc/redhat-release belongs not the name of the file itself. If the name doesn't match the variable $releasever will be assigned a Null value and yum will complain of not finding the directory. To know what is the name of the package use:
rpm -qf /etc/redhat-release
in the examples above the package name was sl-release. See yum and yum.conf man pages for more information.