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

Ansible任务Vars格式报错,求正确的vars写法

Ansible任务vars写法错误及修正方案

报错信息

TASK [Create Multiple Users : Create multiple users] ***************************
fatal: [10.16.220.30]: FAILED! => {"reason": "Vars in a Task must be specified as a dictionary, or a list of dictionaries

The error appears to be in '/runner/project/Windows AD/roles/Create Multiple Users/tasks/Create_multiple_users.yml': line 14, column 9, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:

      - "{{ item.groups }}"
  vars: data_list
        ^ here
"}

原Playbook代码

---
- name: Read Users 
  hosts: localhost
  vars:
    data_list: []
  tasks:
  - read_csv:
      path: user.csv
      key: name  
      fieldnames: name,firstname,surname,displayName,groups
      delimiter: ','
    register: userdata


  - name: Extract the list
    set_fact:
      data_list: "{{ data_list + [{ 'name': item.value.name, 'firstname': item.value.firstname, 'surname': item.value.surname, 'displayName': item.value.displayName, 'groups': item.value.groups }] }}"
    loop: "{{ userdata.dict|dict2items }}"


- name: Create user accounts
  hosts: "{{ hostname }}"
  gather_facts: false
  any_errors_fatal: false
  become: yes
  become_method: runas
  become_user: admin
  roles:
    - { role: Create Multiple Users }


- name: Create users
  community.windows.win_domain_user:
    name: "{{ item.name }}"
    firstname: "{{ item.firstname }}"
    surname: "{{ item.surname }}"
    attributes:
      displayName: "{{ item.firstname + ' ' + item.surname }}"
    groups:
      - "{{ item.groups }}"
  vars: data_list 
  with_items: 
    - "{{ data_list }}"

用户疑问

将data_list存储CSV中的用户数据,希望循环执行「Create user」模块参数,但运行报错,请问任务中正确的vars写法应该是什么?


错误原因

  1. 任务vars语法错误:Ansible任务中的vars字段要求是字典或字典列表,直接写vars: data_list不符合语法规范,这是报错的直接原因。
  2. 变量跨Play传递问题:data_list是在第一个针对localhost的Play中生成的,后续针对远程主机的Play默认无法直接访问该变量,需通过hostvars引用。

正确写法

1. 修正任务vars语法(按需选择)

如果要在任务内定义变量,必须写成字典形式:

vars:
  data_list: "{{ hostvars['localhost']['data_list'] }}"

但更推荐直接在with_items中引用跨Play变量,无需单独写vars字段。

2. 正确引用跨Play变量

修改最后一个Create users任务,直接调用localhost主机上的data_list,同时优化groups参数(若CSV中groups为逗号分隔的多组,需拆分为列表):

- name: Create users
  community.windows.win_domain_user:
    name: "{{ item.name }}"
    firstname: "{{ item.firstname }}"
    surname: "{{ item.surname }}"
    attributes:
      displayName: "{{ item.firstname + ' ' + item.surname }}"
    groups: "{{ item.groups.split(',') }}"  # 拆分逗号分隔的组为列表
  with_items: "{{ hostvars['localhost']['data_list'] }}"

3. 简化CSV数据提取(额外优化)

第一个Play中的Extract the list任务可简化,直接使用read_csv返回的list字段:

- name: Extract the list
  set_fact:
    data_list: "{{ userdata.list }}"

read_csv的list字段已返回所有行的结构化列表,无需循环拼接。

完整修正后的Playbook

---
- name: Read Users 
  hosts: localhost
  vars:
    data_list: []
  tasks:
  - read_csv:
      path: user.csv
      key: name  
      fieldnames: name,firstname,surname,displayName,groups
      delimiter: ','
    register: userdata


  - name: Extract the list
    set_fact:
      data_list: "{{ userdata.list }}"


- name: Create user accounts
  hosts: "{{ hostname }}"
  gather_facts: false
  any_errors_fatal: false
  become: yes
  become_method: runas
  become_user: admin
  roles:
    - { role: Create Multiple Users }


- name: Create users
  community.windows.win_domain_user:
    name: "{{ item.name }}"
    firstname: "{{ item.firstname }}"
    surname: "{{ item.surname }}"
    attributes:
      displayName: "{{ item.firstname + ' ' + item.surname }}"
    groups: "{{ item.groups.split(',') }}"
  with_items: "{{ hostvars['localhost']['data_list'] }}"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 00:41:03