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

Ansible如何循环遍历文件内容为win_domain_user模块传参执行任务

方案评估

你的双文件拆分思路完全可行,还有一种更简洁的单文件实现方案,不需要额外拆分yml,也不用写大量正则提取字段,执行效率更高。

最优实现方案(无需拆分文件)

步骤1:读取文件并过滤空行

原读取任务不变,read_output的stdout_lines属性本身就是逐行拆分的列表,天然适配Ansible的loop循环,不需要额外处理行数。

- name: "Pre-task AD | Get user account info"
  win_shell: |
    Get-Content C:\AD\user_info.txt
  register: 'read_output'

步骤2:直接循环处理用户(无需单独set_fact)

利用Jinja2的字符串处理能力,直接把每行的分号分隔格式转为字典,省去正则提取和单独设置facts的步骤:

- name: "Active Directory | Add domain user account to domain controller"
  win_domain_user:
    firstname: "{{ user_info.first }}"
    surname: "{{ user_info.last }}"
    name: "{{ user_info.first }} {{ user_info.last }}"
    description: "{{ user_info.title }}"
    password: "{{ password_var_here }}"
    upn: "{{ user_info.user }}{{ domain_fqdn_var_here }}"
    email: "{{ user_info.email }}"
    state: 'present'
    path: "{{ ou_path_here }}"
    groups: "Domain Users, {{ user_info.dept_groups }}"
    attributes:
      displayName: "{{ user_info.display_name }}"
    domain_username: "{{ domainusername_var_here }}"
    domain_password: "{{ domainpassword_var_here }}"
    domain_server: "{{ dc_var_here }}"
  register: 'add_ad_user'
  loop: "{{ read_output.stdout_lines | reject('match', '^$') | list }}"
  loop_control:
    loop_var: user_line
  vars:
    user_info: "{{ dict(user_line.split(';') | map('split', '-', 1) | list) }}"

双文件拆分实现方式

如果需要按原有思路拆分文件,可参考如下示例:

主文件(main.yml)

- name: "Pre-task AD | Get user account info"
  win_shell: |
    Get-Content C:\AD\user_info.txt
  register: 'read_output'

- name: Process each user
  include_tasks: process_single_user.yml
  loop: "{{ read_output.stdout_lines | reject('match', '^$') | list }}"
  loop_control:
    loop_var: current_user_line

子文件(process_single_user.yml)

- set_fact:
    user_info: "{{ dict(current_user_line.split(';') | map('split', '-', 1) | list) }}"

- name: "Active Directory | Add domain user account to domain controller"
  win_domain_user:
    firstname: "{{ user_info.first }}"
    surname: "{{ user_info.last }}"
    name: "{{ user_info.first }} {{ user_info.last }}"
    description: "{{ user_info.title }}"
    password: "{{ password_var_here }}"
    upn: "{{ user_info.user }}{{ domain_fqdn_var_here }}"
    email: "{{ user_info.email }}"
    state: 'present'
    path: "{{ ou_path_here }}"
    groups: "Domain Users, {{ user_info.dept_groups }}"
    attributes:
      displayName: "{{ user_info.display_name }}"
    domain_username: "{{ domainusername_var_here }}"
    domain_password: "{{ domainpassword_var_here }}"
    domain_server: "{{ dc_var_here }}"
  register: 'add_ad_user'

注意事项

  • 如果用户密码不统一,可以把密码字段加入user_info.txt的每行定义,直接从user_info变量读取即可
  • split('-', 1)的作用是防止字段值中存在减号时拆分错误,仅拆分第一个出现的减号
  • 过滤器reject('match', '^$')会自动跳过文件中的空行,避免执行报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 18:27:00