使用Ansible为多用户安装oh-my-zsh报item未定义错误如何解决
报错原因
item is undefined错误是因为loop的使用位置不对:
loop是Ansible任务(task)级别的参数,直接写在顶层roles块的角色配置下时,Ansible不会识别这里的循环逻辑,只会把loop当成传给角色的普通自定义变量,根本不会遍历userlist生成item变量。- 你写的
{{ item.username }}没有对应的循环上下文,解析模板时自然会报变量不存在的错误。
另外补充:gantsign.oh-my-zsh角色本身的users入参就支持直接传入多个用户的配置列表,不需要循环调用角色,直接按角色要求的格式传参即可。
修复方案
二选一即可,优先推荐方案1,执行效率更高,更贴合角色本身的设计逻辑。
方案1(推荐):提前组装角色需要的用户列表
直接在变量层把userlist转换成角色要求的users结构,不需要写循环,直接传给角色:
- name: setup ohmyzsh for users hosts: all vars: userlist: - username: "viktor" password: "viktor123" # 遍历用户列表,合并统一的zsh配置,生成角色需要的参数格式 users: >- {{ userlist | map('combine', { 'oh_my_zsh': { 'theme': 'gnzh', 'plugins': ['git', 'zsh-syntax-highlighting', 'zsh-autosuggestions', 'docker'] } }) | list }} become: yes roles: - role: gantsign.oh-my-zsh tasks:
如果你用的是Ansible 2.9及更早版本,需要在
ansible.cfg中添加jinja2_native = True配置,避免Jinja2渲染后的数据类型不符合角色要求。
方案2:在任务中循环调用角色
如果需要更灵活的循环控制,可以把角色调用移到tasks块中,用include_role执行循环,适配Ansible 2.4及以上所有版本:
- name: setup ohmyzsh for users hosts: all vars: userlist: - username: "viktor" password: "viktor123" zsh_shared_config: theme: gnzh plugins: - git - zsh-syntax-highlighting - zsh-autosuggestions - docker become: yes tasks: - name: 批量为用户配置oh-my-zsh include_role: name: gantsign.oh-my-zsh vars: users: - username: "{{ item.username }}" oh_my_zsh: "{{ zsh_shared_config }}" loop: "{{ userlist }}"
内容的提问来源于stack exchange,提问作者viktor
相关产品推荐
相关产品推荐

