There's any number of options -- you can rsync the filesystem, dd the underlying block device over the network with netcat, or take a snapshot of the system at the vmware level and duplicate that somewhere else.
However, all of these scenarios suffer from the same basic flaw: it's one-shot deal. Once you've made the clone, you can't automatically update it to take into account changes in production (well, in theory, the rsync method can be used, but it's finicky and very error prone). This is why you need to use configuration management, like Puppet, Chef, or cfengine. These systems allow you to define the exact state you want a system to be in, and the tools will take care of the configuration. You can then specify "build all these systems the same way", and when you change the master configuration, all the machines will be updated to match the new setup. Building new machines is then also a breeze, if you need to scale up, deploy a second infrastructure in another location, or whatever else takes your fancy.