批量修改Ansible托管主机密码需用user模块配合SHA-512加密密码,存入Ansible Vault,Playbook中设update_password: always并提权执行,配合SSH免密与权限验证确保安全、可审计、不中断服务。

批量修改 Ansible 托管主机的密码,核心是用 user 模块配合加密密码,通过 Playbook 统一推送,避免明文传输和交互式输入。关键不在“能不能改”,而在于“怎么改得安全、可审计、不中断服务”。
准备加密密码(必须做)
Linux 系统存储的是哈希后的密码,不能直接传明文。需在控制节点生成 SHA-512 加密串:
- 安装
whois工具(Debian/Ubuntu):sudo apt-get install whois;CentOS/RHEL:sudo yum install expect(mkpasswd通常随expect提供) - 执行命令生成哈希:
mkpasswd --method=SHA-512 --stdin,输入明文后回车,得到类似$6$salt$abc123...的字符串 - 把该字符串存进 Ansible Vault 加密文件(如
secrets.yml),避免泄露:ansible-vault create secrets.yml
编写安全的 Playbook
使用 user 模块设置密码,并强制更新(即使密码未变):
-
update_password: always确保每次运行都写入新密码,不依赖比对 - 指定目标用户(如
root或普通运维账号),支持循环批量设不同密码 - 示例片段:
- name: 批量更新 root 密码
ansible.builtin.user:
name: root
password: "{{ vault_encrypted_pass }}"
update_password: always
vars:
vault_encrypted_pass: "$6$somesalt$hashedvalue"确保执行权限与连接方式
Ansible 必须能以有 sudo 权限的用户登录,并切换到目标用户执行操作:
- 在 inventory 中配置:指定
ansible_ssh_user(如admin)、ansible_become_pass(该用户的 sudo 密码) - Playbook 中启用提权:
become: true,并设become_method: sudo - 推荐提前配置 SSH 免密登录(用
authorized_key模块分发公钥),避免在 Playbook 中硬编码密码
执行与验证
运行前先测试连通性和权限:
- 检查目标主机是否可达:
ansible all -m ping --ask-vault-pass - 执行密码更新:
ansible-playbook change_password.yml --ask-vault-pass - 验证是否生效:可加一个任务调用
getent passwd root或尝试用新密码 SSH 登录一台目标机


















