I can tell you what doesn't work: having a manually-edited document, spreadsheet, webpage or wiki.
I've yet to see an organization strict enough to manually keep their technical documentation 100% accurate and up-to-date. Inaccurate documentation is not just annoying; it's plain dangerous. What happens if someone forgets to note that
service a is running on
server x? If you trusted the documentation, you'd end up with unexpected downtime of
The first part of the solution is to automate the process using a monitoring platform such as Xymon, Nagios or Zabbix (there are plenty of others). It's possible to extend these platforms with custom scripts to answer most questions about your software and hardware. The monitoring platform will ensure that this automatic documentation is kept up-to-date.
The second part of the solution is to have a mechanism which warns you when your coverage is incomplete. For example, I use a custom script which lists all the processes running on a system, filters out the processes that are monitored or ignorable, and alerts me of any that are unexpected -- this tells me that it's time to add those new processes to the monitoring platform. Another example is to cross-reference your Cisco port status with CDP information to make sure you've covered all of your servers.
The great benefit of this approach is that you're doing documentation and you get alerting and trending for free.