Ansible任务添加include_vars报错:conflicting action statements
解决Ansible任务中
conflicting action statements报错 你遇到的这个报错核心原因很明确:Ansible的单个任务只能绑定一个核心动作模块,你现在把template(负责拷贝模板文件)和include_vars(负责加载变量)两个模块塞到了同一个任务里,这直接违反了Ansible的任务语法规则,所以才会触发冲突报错。
快速修复方案:拆分任务
最直接的解决方式就是把加载变量的操作单独拆成一个独立任务,放在你需要使用这些变量的任务之前(如果变量要在copy任务里用到的话),或者之后(如果只是提前加载变量供后续任务使用)。修改后的代码如下:
- name: Load interface variables from file include_vars: file: interfaces.yml name: interfaces - name: copy Check Files for Env from templates template: src: "{{ item }}" dest: "/home/nrpe/{{ item }}" owner: nrpe group: nrpe mode: u+x backup: yes with_fileglob: - "/etc/ansible/roles/nrpe_config/nrpe_scripts/templates/env/*"
顺带提一句:我把变量引用改成了"{{ item }}"的形式,这是Ansible官方推荐的语法,能避免很多潜在的字符串解析问题,建议平时都这么写。
更优雅的方式:利用角色的vars自动加载
既然你的interfaces.yml已经放在了角色的vars目录下,其实可以让Ansible自动加载这些变量,不用在任务里手动写include_vars。你只需要在vars/main.yml里添加一行:
include_vars: interfaces.yml
这样整个角色下的所有任务都能直接使用interfaces变量(如果在加载时指定了name参数),完全不需要在任务里单独处理变量加载的逻辑,代码会更整洁。
为什么原来的代码会报错?
再给你理清楚底层逻辑:Ansible的任务结构要求,每个- name: ...条目下,只能定义一个核心动作模块(比如template、copy、include_vars这些都是模块)。如果同时写多个模块,Ansible会认为你在同一个任务里指定了多个冲突的动作,自然就会抛出conflicting action statements的错误。
内容的提问来源于stack exchange,提问作者Georg Gutsche
相关产品推荐
相关产品推荐

