ansible 第一次批量导入ssh-key

发布时间 2023-04-28 10:00:07作者: mingtian是吧

适用环境:

  1. 所有主机具有相同的用户名和密码

实现方式:

  1. 通过ansible hosts 文件读取主机列表
  2. 通过expect 自动应答

脚本出处:
github kubeasz\tools

#!/bin/bash

# 此脚本为批量部署服务器ssh key使用

#set -x

# check args count
if test $# -ne 3; then
    echo -e "\nUsage: $0 < hosts file > < username > < password >\n"
    exit 1
fi

# check hosts file
hosts_file=$1
if ! test -e $hosts_file; then
    echo "[ERROR]: Can't find hosts file"
    exit 1
fi

username=$2
password=$3

# check sshkey file 
sshkey_file=~/.ssh/id_rsa.pub
if ! test -e $sshkey_file; then
    expect -c "
    spawn ssh-keygen -t rsa
    expect \"Enter*\" { send \"\n\"; exp_continue; }
    "
fi

# get hosts list
hosts=$(ansible -i $hosts_file all --list-hosts | awk 'NR>1')
echo "======================================================================="
echo "hosts: "
echo "$hosts"
echo "======================================================================="

ssh_key_copy()
{
    # delete history
    sed "/$1/d" -i ~/.ssh/known_hosts

    # start copy 
    expect -c "
    set timeout 100
    spawn ssh-copy-id $username@$1
    expect {
    \"yes/no\"   { send \"yes\n\"; exp_continue; }
    \"*assword\" { send \"$password\n\"; }
    \"already exist on the remote system\" { exit 1; }
    }
    expect eof
    "
}

# auto sshkey pair
for host in $hosts; do
    echo "======================================================================="

    # check network
    ping -i 0.2 -c 3 -W 1 $host >& /dev/null
    if test $? -ne 0; then
        echo "[ERROR]: Can't connect $host"
        exit 1
    fi
    # /etc/hosts中存在 该ip信息时
    cat /etc/hosts | grep -v '^#' | grep $host >& /dev/null
    if test $? -eq 0; then
        hostaddr=$(cat /etc/hosts | grep -v '^#' | grep $host | awk '{print $1}')
        hostname=$(cat /etc/hosts | grep -v '^#' | grep $host | awk '{print $2}')
        
        ssh_key_copy $hostaddr
        ssh_key_copy $hostname
    else
        ssh_key_copy $host
    fi

    echo ""
done