为什么Ansible显示“ERROR!在任务中未检测到任何操作”错误?

时间:2017-11-07 13:27:47

标签: ansible

Ansible显示错误:

  

ERROR!任务中未检测到任何操作。这通常表示拼写错误的模块名称或模块路径不正确。

有什么问题?

确切的成绩单是:

ERROR! no action detected in task. This often indicates a misspelled module name, or incorrect module path.

The error appears to have been in 'playbook.yml': line 10, column 3, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:

---
- name: My task name
  ^ here

6 个答案:

答案 0 :(得分:60)

原因#1

您使用的是较旧版本的Ansible,它没有您尝试运行的模块。

如何检查?

  1. 打开模块列表module documentation,找到模块的文档页面。

  2. 阅读页面顶部的标题 - 它通常显示引入模块的Ansible版本。例如:

      

    2.2版中的新功能。

  3. 确保您运行的是指定版本的Ansible或更高版本。运行:

    ansible-playbook --version
    

    检查输出。它应该显示如下:

      

    ansible-playbook 2.4.1.0

  4. 原因#2

    你试图写一个角色并在my_role/tasks/main.yml中放一个剧本。

    tasks/main.yml文件应仅包含任务列表。如果您指定:

    ---
    - name: Configure servers
      hosts: my_hosts
      tasks:
        - name: My first task
          my_module:
            parameter1: value1
    

    Ansible尝试查找名为hosts的操作模块和名为tasks的操作模块。它没有,所以它会抛出一个错误。

    解决方案:仅指定tasks/main.yml文件中的任务列表:

    ---
    - name: My first task
      my_module:
        parameter1: value1
    

    原因#3

    操作模块名称拼写错误。

    这很明显,但被忽视了。如果您使用的模块名称不正确,例如users而不是user,则Ansible将报告"在任务"中未检测到任何操作。

    Ansible被设计为高度可扩展的系统。它没有一组有限的模块可以运行,也无法提前检查"每个动作模块的拼写。

    实际上你可以编写然后指定你自己的名为qLQn1BHxzirz的模块,而Ansible必须尊重它。因为它是一种解释性语言,它发现了#34;只有在尝试执行任务时才会出错。

    原因#4

    您正在尝试执行未随Ansible分发的模块。

    操作模块名称正确,但它不是与Ansible一起分发的标准模块。

    如果您使用的是由第三方提供的模块 - 软件/硬件供应商或公开共享的其他模块,您必须先下载该模块并将其放在适当的目录中。

    您可以将其放在剧本的modules子目录中或公共路径中。

    Ansible查找ANSIBLE_LIBRARY--module-path命令行参数。

    要检查哪些路径有效,请运行:

    ansible-playbook --version
    

    并检查以下值:

      

    配置模块搜索路径=

    Ansible 2.4及更高版本应提供路径列表。

    原因#5

    你真的没有在任务中采取任何行动。

    任务必须定义一些操作模块。以下示例无效:

    - name: My task
      become: true
    

答案 1 :(得分:5)

我无法真正改善@techraf的答案https://stackoverflow.com/a/47159200/619760。 我想添加原因#6我的特殊情况

原因#6

错误地使用roles:来导入/包括角色作为子任务。

这不起作用,您不能以这种方式将角色作为子任务包含在剧本中。

---
- hosts: somehosts
  tasks:

  - name: include somerole
    roles:
      - somerole

使用include_role

根据documentation

  

您现在可以使用import_role或include_role将角色与其他任何任务一起使用:

- hosts: webservers
  tasks:
  - debug:
      msg: "before we run our role"
  - import_role:
      name: example
  - include_role:
      name: example
  - debug:
      msg: "after we ran our role"

将角色放在与主机串联的正确位置

在顶部添加角色

---
- hosts: somehosts
  roles:
    - somerole
  tasks:   
    - name: some static task
      import_role:
        name: somerole
      hosts: some host
    - include_role:
        name: example

您需要了解import/include static/dynamic

之间的区别

答案 2 :(得分:2)

错误的说明:

没有要执行的任务意味着它无法执行您的剧本中描述的操作

根本原因:

  • 已安装的Ansible版本不支持

如何检查:

  • ansible --version

解决方案:

  • 将Ansible升级到支持您尝试使用的功能的版本

如何升级Ansible:

https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html#selecting-an-ansible-version-to-install

Ubuntu快速说明:

sudo apt update
sudo apt install software-properties-common
sudo apt-add-repository --yes --update ppa:ansible/ansible
sudo apt install ansible

P.S:遵循此路径,并从版本2.0.2升级到2.9 升级后,同一本剧本就像魅惑一样

答案 3 :(得分:1)

对我来说,“ systemd”模块出现了问题。原来我的ansible --version 2.0.0.2 ,并且该模块最初是在版本 2.2 中引入的。将我的ansible更新到最新版本已解决了该问题。

playbook.yaml

- name: "Enable and start docker service and ensure it's not masked"
  systemd:
    name: docker
    state: started
    enabled: yes
    masked: no

错误

ERROR! no action detected in task
etc..   
etc..
etc..

- name: "Enable and start docker service and ensure it's not masked"
  ^ here

答案 4 :(得分:1)

当我将 debug 任务引用为 ansible.builtin.debug

时出现此错误

导致 CI​​ 中的语法错误(但在本地工作):

- name: "Echo the jenkins job template"
  ansible.builtin.debug:
    var: template_xml
    verbosity: 1

在本地和 CI 中工作:

- name: "Echo the jenkins job template"
  debug:
    var: template_xml
    verbosity: 1

我相信 - 但尚未证实 - 本地与 CI 的差异是可靠的版本。

  • 本地:2.10
  • CI:2.7

答案 5 :(得分:0)

就我而言,这是修复:

ansible-galaxy collection install ansible.posix