使用ansible批量修改免密ip的root密码

环境:centos7

一.安装ansible

yum install -y epel-release 
yum install -y ansible 

二.命令

while read -r line; do     ip=$(echo "$line" | awk '{print $1}');     passwd=$(echo "$line" | awk '{print $2}');     ansible $ip -m shell -a "echo $passwd| passwd --stdin root"; done < test.txt

cat test.txt
192.168.70.61  654321
192.168.70.62  1qaz@WSX
192.168.70.63  !QAZ@WSX

命令解释:

  1. while read -r line; do:循环读取 test.txt 文件中的每一行,并将其保存到 $line 变量中。

  2. ip=$(echo "$line" | awk '{print $1}'):使用 awk 命令从 $line 变量中提取出第一个字段,即远程主机的 IP 地址,并将其保存到 $ip 变量中。

  3. passwd=$(echo "$line" | awk '{print $2}'):同上,从 $line 变量中提取出第二个字段,即要设置的新密码,并将其保存到 $passwd 变量中。

  4. ansible $ip -m shell -a "echo $passwd| passwd --stdin root":使用 Ansible 工具连接远程主机 $ip,并执行 echo $passwd| passwd --stdin root 命令,将 $passwd 变量中保存的新密码设置为远程主机的 root 用户密码。

  5. done < test.txt:完成循环,结束脚本

三.可以优化的地方

 70.61可以跳转到61和63(单向的免密)

解释免密的配置文件

[root@rabbit1-61 .ssh]# ls
authorized_keys  id_rsa  id_rsa.pub  known_hosts

前提了解:所谓的免密,从单方向连接来说(从A主机ssh连接到B主机),本地主机A使用ssh-keygen生成公私钥,使用ssh-copy-id B时,也就是将A主机的公钥传递给B,当A ssh到B主机过程时,那么A就会带着自己的私钥去配对之前传递到B主机上面的A的公钥,如果公私钥配对成功,就能够ssh成功。

authorized_keys:存放的是其它远程主机的公钥(用于配对远程主机的私钥)
id_rsa:存放的是本主机的私钥
id_rsa.pub:存放的是本主机的公钥
know_hosts:文件记录了你连接过的远程主机的公钥信息。如果远程主机的公钥发生变化,SSH 客户端会给出警告。

四.脚本

#!/bin/bash
function find_valid_ips() {
    echo "Finding IPs with passwordless SSH access..."

    while read -r line; do
        ip=$(echo "$line" | awk '{print $1}')
        passwd=$(echo "$line" | awk '{print $2}')

        # Test passwordless SSH access using SSH public key authentication
        if ssh -o BatchMode=yes -o ConnectTimeout=2 $ip "echo 'Connection successful!'" &>/dev/null; then
            echo "$ip" >> valid_ip.txt
            echo "可以修改密码的ip: $ip"
        else
            echo "Invalid IP: $ip"
        fi
    done < test.txt

    echo "Valid IPs have been written to valid_ip.txt."
}

function modify_passwords() {
    echo "Do you want to modify passwords for valid IPs? (y/n)"
    read user_input

    if [[ "$user_input" =~ ^[Yy](es)?$ ]]; then
        echo "Modifying passwords for valid IPs..."
        
        while read -r ip; do
            passwd=$(grep "$ip" test.txt | awk '{print $2}')
            
            # Modify password using ansible
            ansible $ip -m shell -a "echo $passwd | passwd --stdin root"
        done < valid_ip.txt

        echo "Password modification complete."
    else
        echo "Exiting script without modifying passwords."
    fi
}

>valid_ip.txt
# 筛选出有效的ip到valid_ip.txt
find_valid_ips

# 修改密码
modify_passwords

脚本注意点:

1.test.txt中存放的是ip和密码

[root@rabbit1-61 ansible]# cat test.txt 
192.168.70.62  1qaz@WSX
192.168.70.63  !QAZ@WSX

2.脚本需要安装ansible,使用ansible时,需要在/etc/ansible,目录下的hosts文件中,添加ip。例如:

[modify]
192.168.70.62