I just made a first run at some tools in Paste Script for installing web applications.
The idea is a two-phase installation; first you install the package distribution and ask it to write out a sample configuration. Then you edit the configuration. Then you ask the application to set itself up (maybe setting up databases, making directories, etc).
This is not unlike a fancier-seeming system where there's a web interface or GUI or whatnot; except all that interaction is encapsulated in editing a text configuration file. I think this is a good technique because (a) it much much easier to implement, (b) it is consistent with later maintenance, (c) it uses a powerful native UI that many people are comfortable with (the text editor), and (d) it requires very little work for an application to support.
So, in the trunk you can do:
$ paster prepare-app \ -f http://pythonpaste.org/package_index.html \ PasteHelloWorld helloworld.ini $ edit helloworld.ini $ paster setup-app helloworld.ini
You can also combine this all into:
$ paster prepare-app \ --edit --setup \ -f http://pythonpaste.org/package_index.html \ PasteHelloWorld helloworld.ini
Which will immediately open the configuration file in your editor, and when you are done editing it will set up the application. (And prepare-app also installs the application with easy_install, so it really can be just one step).
This is a pretty early prototype, really, so I'm still very interested in feedback on even the most minor details. Like, what should these commands be called?
Also, people lay out their systems differently. I have a vague concept of a "system configuration" which will determine some basics about what goes where. But it's very vague. Ideally I'm hoping that hosting companies could setup such a configuration so that everything Just Works for users, including system hooks to be run on installation and whatnot. Now that I think about it, that probably means entirely new system-specific command-line options as well.
I've also written a simple class for setting up applications, so that you can add this to your application's setup.py:
setup(... entry_points=""" [paste.app_install] main = paste.script.appinstall:Installer """)
This will look for a template configuration file in MyPackage.egg-info/paste_deploy_config.ini_tmpl (a Cheetah template, actually), and run mypackage.websetup.setup_config() on setup, and probably more things over time.
At some point I also plan to add such a generic setup class to SQLObject, so that a SQLObject-using application will be able to automatically set up its database on installation, as well as upgrade its database later (these classes should be reentrant, so you can run paster setup-app config_file.ini at any time to confirm and apply any new things to be setup).