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
相关产品推荐
相关产品推荐

