Here’s a script I use to automate ssh-copy-id when I need to add a series of hosts using a incremental node number. For example…

prod-db-server001
prod-db-server002
prod-db-server003

and so on. The script uses expect to perform its work. To adjust this for your own purposes you simply need to change the SSH_USER variable, the number of hosts in the for loop and of course the hostname scheme. Once you execute the script you’ll enter your password once and ssh-copy-id will be performed for all the hosts in sequence.

#!/bin/bash

set -x;

export SSH_USER="admin"
read -s PASSWORD
export PASSWORD

for node in {1..91}; do
        if (( $node <= 9 )); then
                export HOST=hostname00${node}.domain.ch
        else
                export HOST=hostname0${node}.domain.ch
        fi;

    expect -c '
    set SSH_USER $env(SSH_USER)
    set HOST $env(HOST)
    set PASSWORD $env(PASSWORD)
    spawn ssh-copy-id $SSH_USER@$HOST
    expect {
        "continue" {
            send "yes\n";
            exp_continue
        }
        "assword:" {
            send "$PASSWORD\n";
        }
    }
    expect eof'

    echo "Done $HOST"
done;