pssh and shmux have some customization issues, like inflexible IPs/hostnames specification, simultaneously spawning threads for all hosts (pssh), which is a problem with many hosts, or having to download/upload files with a separate command. cssh.py was written to resolve such problems. It has a fixed (configurable) length queue of active SSH threads, the ability to specify IPs/hostnames in 3 ways, configurable username, password, and SSH port per host, simultaneous download and upload of files/directories (using a built-in SCP implementation), again with configurable queue length, the ability to upload and execute a script with one switch, and many other useful options, like additional saving cmd outputs in a separate file for each machine (-d output_dir), or suppressing printing out hosts for which a given command produced no output (-b).
wsh allows you to execute commands on multiple machines in parallel. It is secure and fast, and even outperforms ansible. It works by having an agent live on the machine. When you run wshc, it sshes and execs wshd and sends commands over the encrypted channel. wshd executes the commands and sends the results back.