如何用Ansible 2.4.1.0从预定义表为各主机设置用户密码
批量为已有用户设置密码的Ansible Playbook(适配2.4.1.0)
方案一:直接读取冒号分隔的密码文件
无需提前转换文件,直接在Playbook中读取并处理原始的hostname:username:pwhash格式文件。
完整Playbook代码
- name: 批量为已有用户设置密码 hosts: all gather_facts: yes vars: password_file_path: "/path/to/your/passwords.txt" # 替换为你的密码文件实际路径 tasks: - name: 读取密码文件内容 slurp: src: "{{ password_file_path }}" register: password_file_content delegate_to: localhost run_once: yes - name: 解析密码文件并筛选当前主机的条目 set_fact: host_password_entries: > {{ (password_file_content.content | b64decode).split('\n') | select('match', '^' ~ inventory_hostname ~ ':.*') | map('split', ':') | select('length', 3) | list }} - name: 获取当前主机的所有用户列表 getent: database: passwd - name: 为已存在的用户设置密码 user: name: "{{ item[1] }}" password: "{{ item[2] }}" update_password: always loop: "{{ host_password_entries }}" when: item[1] in getent_passwd.keys()
代码说明
slurp模块读取文件内容(2.4版本原生支持),通过delegate_to: localhost和run_once: yes确保只在控制节点读取一次文件,避免重复操作- 用
b64decode解析slurp返回的base64编码内容,拆分每行后筛选出当前主机(inventory_hostname)的有效条目,再拆分冒号得到用户名和密码哈希 getent模块获取当前主机的系统用户列表,用于判断目标用户是否存在- 循环处理筛选后的条目,仅当用户存在时执行
user模块设置密码,update_password: always确保密码哈希变化时会更新密码
方案二:提前转换为YAML字典变量(更高效)
如果密码文件不频繁变动,建议提前将其转换为YAML格式的字典,减少Playbook运行时的解析开销。
转换后的YAML变量示例(存为host_passwords.yml)
host_passwords: web01: alice: "$6$rounds=100000$abc123$xyz..." bob: "$6$rounds=100000$def456$uvw..." db01: charlie: "$6$rounds=100000$ghi789$rst..."
完整Playbook代码
- name: 批量为已有用户设置密码 hosts: all gather_facts: yes vars_files: - /path/to/host_passwords.yml # 替换为你的YAML变量文件实际路径 tasks: - name: 获取当前主机的所有用户列表 getent: database: passwd - name: 为已存在的用户设置密码 user: name: "{{ item.key }}" password: "{{ item.value }}" update_password: always loop: "{{ lookup('dict', host_passwords[inventory_hostname] | default({})) }}" when: item.key in getent_passwd.keys()
代码说明
vars_files加载提前转换好的YAML变量,直接通过host_passwords[inventory_hostname]获取当前主机的用户-密码哈希映射lookup('dict', ...)将字典转换为可循环的键值对(2.4版本支持该lookup插件)- 同样通过
getent获取用户列表,仅在目标用户存在时执行密码设置操作
注意事项
- 确保密码哈希是符合系统要求的Crypt格式(比如SHA-512的
$6$前缀),避免设置无效密码 - 2.4.1.0版本的
user模块不支持password_expire_max等部分新参数,如需额外配置需参考对应版本的模块文档 - 建议先在测试主机上用
--check参数运行Playbook验证逻辑,避免影响生产环境
内容的提问来源于stack exchange,提问作者Trifo
相关产品推荐
相关产品推荐

