[OpenAFS] deploying software via afs
Rodney M Dyer
rmdyer@uncc.edu
Thu, 02 Feb 2006 22:41:36 -0500
At 12:00 PM 2/2/2006, David Bear wrote:
>I am wondering if anyone has written on ways to use afs to deploy
>application software. I'm looking at deploying things like cygwin, python,
>and even microsoft office apps via afs.
Boy are you asking for the world. This thread should be entitled
"Deploying Windows Applications (1001 things Microsoft never told
you)". Software installation and change management of enterprise
applications can read like a "War and Peace" novel to those uninitiated.
All of our software is distributed to the local client via AFS. We have
over 125 Windows applications on each client. We have over 600 XP
clients. The method(s) used to deliver applications to the client machines
isn't exactly simple, but it's no mind-bender either. It's just a lot of
elbow grease (this is why you work in IT right?). You can buy some tools
to help for this, or you can roll your own method. Some people use
Microsoft's Systems Management Server, others use Novell's Zenworks, still
others use Macromedia's AdminStudio. But these are only tools, and these
are somewhat limited to the setup styles they can perform. Even with these
tools it is likely that you will need to augment them with some install
scripting. It really depends on how far you need to take it, and whether
you run your machines with users in L.U.A. mode or not. Some people use
Active Directory's built in ability to use Group Policy to "publish"
applications to install. Even here, you usually end up writing an install
script, and it is really hard to do change management with this method.
What did we do? We rolled our own of course (I always make things
complicated for myself). Let me see if I can nutshell this one for you...
1. In AFS you create a distribution point for each software title or
suite. For example, for Office 2003 we create a folder called
mso2003. The "mso2003" is our "application reference code". Every
application suite should have it's own alphanumeric reference code. Ours
are generally 16 characters or less consisting of numbers and letters
without spaces.
2. In each distribution folder you create a system setup script. This
script can be written in any scripting language you prefer, but should be
written with some method to return error variables to the caller such as
"out of disk space", or "install error", "success", etc. You should create
a standard interface for the caller so that all your distribution point
install scripts generally use the same method.
3. The distribution folder contains sub-folders containing whatever files
are necessary to install the application such as files to be copied to the
PC, registry changes, MSI installer scripts, setup exe's, etc. The
distribution point may also be the location that the application is run
from in the case where you are installing the app to run "off the
net". There are sticky issues here because some apps require the ability
to write into their own application directory (BAD APP! BAD!!!). Because
we use replicated AFS volumes for our distribution points, applications
that write into their own program locations are always installed
locally. Sometimes however you can do registry or configure file
modifications so that the application will use other locations for
writing. Application installation tweaking is an art form unto itself and
can be quite costly in terms of the IT time involved. Over the years we've
used many "hacks" to make our applications run correctly on our locked down
user machines. It's a big P.I.T.A.
4. The algorithm your system setup script uses should generally follow the
process...
a. Check to see if the application is already installed.
Our software setup scripts create a flag file on the
local box when they complete successfully such
as "c:\admin\software\mso2003.txt". Your setup script
an check for this flag file.
b. Check to see if the amount of disk free space is
enough for the application.
c. Other checks where necessary, including software
dependency checks. Check for other software flag files.
d. Run your application setup. This is highly dependent on
how you are installing the application and is the most
variable (complicated).
Some applications are silently installed by running the
setup with special options. Others are installed with MSI
files. Some may use keyboard scripts. Some may use
xcopy.exe to copy files out of AFS to the local disk. Still
others might need only to copy the DLLs. If you've "diffed"
your application installed then you will need to install registry
settings as well. This involves the highly complicated method
of "application re-wrapping" where you copy down the
changes that you saw the application's setup make to a
test system earlier.
All of these setup methods run into complications. You need
to wait for the setup method to complete. Some setup scripts
don't wait, they simply "background" themselves so you will
have to come up with a method to "block" your system setup
script until the setup exe, MSI, or copy completes.
Our shop has developed several tools for helping to install
our applications. Here's an example of one we use...
http://www.coe.uncc.edu/~rmdyer/software/waitfortext/
...and here's some example software setup scripts...
http://www.coe.uncc.edu/~rmdyer/software/example_scripts/app_install_scripts
Some installs scripts are quite complex like this one...
http://www.coe.uncc.edu/~rmdyer/software/example_scripts/app_install_scripts/ongard2005/syssetup.cmd.txt
You will notice that all of these scripts generally use the same
install
method. This is no coincidence. Our application diff'ing tool
creates
these scripts for us. The stucture of the scripts is somewhat
out of
date, but we've never needed to modify it. We intend to for
Windows
Vista.
Some of our software is installed using "application
re-wrapping", or
"diff'ing". In our system setup scripts for these applications
we end up
copying the files and registry changes that were found from the
diff
out of AFS, to the local machine. This is complicated by the
fact that
you really need to check the DLLs first, then perform renames
if the
existing DLLs are in-use, and even further possibly perform MAR, or
move-after-reboot operations (pending file rename operations).
You should NEVER copy a DLL out of AFS to the local machine without
first guaranteeing that the one you are copying has "increased" in
version number. Even still, sometimes on "rare" occasions this may
not be the "right" thing to do.
e. If your setup completed successfully then you write some flag
file showing the application is installed, then you return "success"
to the caller (the parent script). If your application fails to
install,
then you return a failure notice.
5. You need some method to call all of your system setup scripts for every
application to be installed. This is generally done with a parent "update"
script. It is the responsibility of the parent "update" script to get the
list of system setup scripts to run, execute them in the order that you
specify, then finish. In the parent script, you can perform pre-setup, and
post-setup script operations. You may need to reboot. Some of our
application system setup scripts need to tell the parent caller to "reboot
the machine" before installing any other application setup scripts. So in
our case the parent gets a special code from the system setup script that
says "reboot for phase2". After reboot, the child script may have re
configured the machine to auto-logon as admin and run some further special
scripting (or not). In either case, after reboot, the parent script starts
again and continues where it left off in the list of application setup
scripts to install. Here's a log of the entire process of software
application on my current workstation as an example...
http://www.coe.uncc.edu/~rmdyer/software/example_scripts/update.log
This log file was created by the parent script. The log file shows
multiple reboots because sometimes updates require that. The parent script
manages the entire state of the machine update process (including reboots
if necessary) throughout the update. The parent script is coded with a
update reference code in the format "yyyymmddtttt" format. We use this
reference code to determine whether the machine has the current "set" of
applications and changes.
Since we install over 120 applications the entire update process from build
to finish can take some time. Some of our slower machines can take
hours. Some of our application installs from AFS are merely file copies
and we don't use compression, so this can extend the time for the install.
The process of installing and maintaining change-management of application
software and system settings on an enterprise network of machines isn't for
the feeble at heart. You can take shortcuts but you will pay dearly. Of
course all of these methods highly depend on whether your users are Admins
on their own machines, or whether you are controlling a locked down
environment. Most organizations don't have the experience necessary to
manage applications on locked down user machines. The tools necessary to
do so have evolved over the years. Many of our tools are home grown, some
are off the shelf, and some tools come with XP or the resource kit.
In the University environment of which I am a part, all this complexity is
magnified because of the sheer number of applications we need to manage
every semester. Most lab machines need all the apps. Sometimes you can
"zone" certain applications to certain machines and not others. Our parent
update scripts gets the list of applications to install on a machine from
our Oracle database at the time the script is run. So our Oracle database
determines which apps should go where.
There are many companies, Microsoft included, who would like to make these
management processes simplified. But take every companies product with a
grain of salt. Many times these products are just snake oil, or they only
get you half way to where you need to be. Like I said before, many of them
are "just tools". You will still end up scripting many of your application
installs. We took the approach of setting up an entire structured
application update process that we can control completely. We micro-manage
every application install using our update procedure.
AFS really has little to do with the setup of applications, except in that
you use AFS for the distribution files. In our case, some of our
applications run on the local machine, while others run out of AFS when the
user clicks on them. In this case you might need to manage AFS ACLs to
prevent access to applications that some users shouldn't get to. But this
is the case even if you used CIFS, NFS, or Novell NCP.
Depending on your own IT environment the above process may be over
complicated. There's obviously a ton of information I haven't written
about here. All I can say is good luck to you.
Rodney
Rodney M. Dyer
Windows Systems Programmer
Mosaic Computing Group
William States Lee College of Engineering
University of North Carolina at Charlotte
Email: rmdyer@uncc.edu
Web: http://www.coe.uncc.edu/~rmdyer
Phone: (704)687-3518
Help Desk Line: (704)687-3150
FAX: (704)687-2352
Office: Cameron Applied Research Center, Room 232