ansible 一键修改服务器密码脚本

脚本安装

执行安装脚本setup.sh 安装ansible和yq命令

#!/bin/bash

# 安装ansible
yum install ansible-2.9.27-1.el7.noarch.rpm -y

# 安装yq
cp -a yq /usr/local/bin/

注： yq是解析yaml工具

配置inithost,第一次连接服务器的用户名和密码
例：

hosts:
 #192.168.40.36:
 # ansible_user: root
 # ansible_password: 123456
 #192.168.40.37:
 # ansible_user: root
 # ansible_password: 123456

配置ansible hosts文件
例：

#[test]
#192.168.40.36
#
#[test1]
#192.168.40.37

4.生成初始连接凭据
bash ./inithost.sh

注：初始文件生成后，可以删除inithost以保证安全
常见操作

修改单个服务器密码

ansible-playbook -i hosts --vault-password-file=.vault_pass -e "target_hosts=192.168.40.36 user=root password=123456" changepasswd.yaml

修改ansible组密码

ansible-playbook -i hosts --vault-password-file=.vault_pass -e "target_hosts=test user=root password=123456" changepasswd.yaml

修改hosts文件里所有服务器的密码

ansible-playbook -i hosts --vault-password-file=.vault_pass -e "target_hosts=all user=root password=123456" changepasswd.yaml

修改其他用户密码

ansible-playbook -i hosts --vault-password-file=.vault_pass -e "target_hosts=192.168.40.36 user=test password=123456" changepasswd.yaml

提示: 在执行上述操作前，需要确保服务器上已存在对应的用户。

常见的问题
如果遇到以下错误信息："Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add this host's fingerprint to your known_hosts file to manage this host."
解决方法：先使用ssh连接目标主机，获取主机的key。
附录1： inithost.sh脚本
#!/bin/bash

# 获取从命令行传入的第一个参数作为vault_password
vault_password="3d$R7#X9"

# 创建connect目录，如果它还不存在
mkdir -p connect

# 读取主机名列表
hosts=$(yq e '.hosts | keys' inithost.yaml | sed 's/- //')

# 遍历每个主机名
for host in $hosts; do
 # 检查主机名是否为空
 if [ -z "$host" ]; then
 continue
 fi

 # 删除引号，以便获取干净的主机名
 host=${host//\"/}
 # 从yaml文件中读取ansible_user和ansible_password
 user=$(yq e .hosts.\"$host\".ansible_user inithost.yaml)
 password=$(yq e .hosts.\"$host\".ansible_password inithost.yaml)

 # 检查用户名和密码是否为空
 if [ -z "$user" ] || [ -z "$password" ]; then
 continue
 fi

 # 删除引号，以便获取干净的用户名和密码
 user=${user//\"/}
 password=${password//\"/}

 # 创建新的yaml文件，文件名为IP地址，并写入ansible_user和ansible_password
 # 新文件将在connect目录下创建
 echo "ansible_user: $user" > connect/$host.yaml
 echo "ansible_password: $password" >> connect/$host.yaml

 # 创建秘密文件
 echo "$vault_password" > .vault_pass
 # 使用ansible vault对文件进行加密，使用传入的vault_password作为密码
 echo $vault_password | ansible-vault encrypt connect/$host.yaml --vault-password-file=.vault_pass
 # rm -fr .vault_pass
done

附录2：changepasswd.yaml的playbook
- hosts: "{{ target_hosts }}"
 vars_files:
 - "connect/{{ inventory_hostname }}.yaml"
 tasks:
 - name: debug
 debug:
 msg: "connect/{{ inventory_hostname }}.yaml"

 - name: 修改服务器密码
 user:
 name: "{{ user }}"
 password: "{{ password | password_hash('sha512') }}"
 become: yes
 become_user: "{{ ansible_user }}"

 - name: 修改ansible连接root密码文件
 local_action:
 module: script
 args: ansible_rootpasswd_change.sh connect/{{ inventory_hostname }}.yaml {{ password }}
 when: user == 'root'

附录3 修改root密码的脚本
#!/bin/bash

# 定义你的 vault 密码
#vault_password=$1
# 定义 inventory_hostname
vault_file=$1
# 定义新的 ansible_password
new_ansible_password=$2

# 定义 vault 文件路径
#vault_file="${vault_file_path}"

# 创建一个临时文件
temp_file=$(mktemp)

# 使用 ansible-vault 解密 vault 文件并将内容写入临时文件
#echo $vault_password | ansible-vault decrypt $vault_file --output $temp_file
ansible-vault decrypt $vault_file --output $temp_file --vault-password-file=.vault_pass

# 修改 ansible_password
yq eval ".ansible_password = \"$new_ansible_password\"" $temp_file

# 使用 ansible-vault 重新加密临时文件并覆盖原来的 vault 文件
#echo $vault_password | ansible-vault encrypt $temp_file --output $vault_file
ansible-vault encrypt $temp_file --output $vault_file --vault-password-file=.vault_pass

# 删除临时文件
rm $temp_file

