You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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获取用户列表,仅在目标用户存在时执行密码设置操作

注意事项

  1. 确保密码哈希是符合系统要求的Crypt格式(比如SHA-512的$6$前缀),避免设置无效密码
  2. 2.4.1.0版本的user模块不支持password_expire_max等部分新参数,如需额外配置需参考对应版本的模块文档
  3. 建议先在测试主机上用--check参数运行Playbook验证逻辑,避免影响生产环境

内容的提问来源于stack exchange,提问作者Trifo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 21:42:36