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写法应该是什么?
错误原因
- 任务vars语法错误:Ansible任务中的
vars字段要求是字典或字典列表,直接写vars: data_list不符合语法规范,这是报错的直接原因。 - 变量跨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
相关产品推荐
相关产品推荐

