Ansible无tasks声明时执行lineinfile报非Play有效属性错误
问题根因
报错'lineinfile' is not a valid attribute for a Play是Ansible解析层级识别错误导致的:
- Ansible对Play(剧本)和Task(任务)的结构有严格区分:顶层未嵌套在
tasks列表下的-开头结构,会被判定为Play对象。Play仅支持hosts、user、tasks、vars、when、tags这类全局配置属性,不允许直接写lineinfile这类模块名。 - 你当前使用的
main.yml中include: xxx.yml属于Play级包含语法,要求所有被引入的文件必须是带hosts、tasks字段的完整Play结构,和“移除子脚本顶层配置”的需求直接冲突。 - 从报错路径可以看到,你的任务文件存放在role的
tasks目录下,这类目录下的文件会被Ansible识别为纯任务列表,本身就不允许出现Play级配置。
修复步骤
按以下两点调整即可正常运行:
- 修改入口
main.yml的结构和包含语法,把全局统一的hosts、user配置只在入口文件写一次,所有子脚本通过任务级语法引入:
--- - hosts: centos1 user: root tasks: - include_tasks: script1.yml - include_tasks: script2.yml - include_tasks: myscript.yml
- 子任务文件(即你写lineinfile配置的文件)保持无顶层Play配置的结构即可,注意修正原tag的拼写错误(原tag多写了一个w,会导致后续按tag调用任务失效):
- name: Replace nsswitch.conf passwd configuration lineinfile: path: /etc/nsswitch.conf regexp: "^passwd:" # 匹配待搜索的行 line: "passwd: files sss systemd" # 替换后的目标行 state: present create: True when: ansible_os_family == 'RedHat' and ansible_distribution_major_version|int >= 8 tags: - nsswitch_change
注意:调整后的子任务文件本身不是独立可执行的Playbook,不要直接用
ansible-playbook myscript.yml单独运行。如果需要单独执行这个配置变更,在调用入口main.yml时加上tag参数即可:ansible-playbook main.yml --tags nsswitch_change。
内容的提问来源于stack exchange,提问作者rsantos
相关产品推荐
相关产品推荐

