72 votes

Pourquoi Ansible affiche-t-il l'erreur "ERROR ! no action detected in task" ?

Ansible affiche une erreur :

ERROR ! Aucune action détectée dans la tâche. Cela indique souvent un nom de module mal orthographié ou un chemin de module incorrect.

Qu'est-ce qui ne va pas ?


La transcription exacte est :

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

133voto

techraf Points 30698

Raison n°1

Vous utilisez une ancienne version d'Ansible qui ne disposait pas du module que vous essayez d'exécuter.

Comment le vérifier ?

  1. Ouvrir la liste des modules documentation des modules et trouvez la page de documentation de votre module.

  2. Lisez l'en-tête en haut de la page - il indique généralement la version d'Ansible dans laquelle le module a été introduit. Par exemple :

    Nouveau dans la version 2.2.

  3. Assurez-vous que vous exécutez la version spécifiée d'Ansible ou une version ultérieure. Exécuter :

    ansible-playbook --version

    Et vérifiez la sortie. Il devrait y avoir quelque chose comme :

    ansible-playbook 2.4.1.0


Raison #2

Vous avez essayé d'écrire un rôle et de mettre en place un livre de jeu. my_role/tasks/main.yml .

En tasks/main.yml ne doit contenir qu'une liste de tâches. Si vous avez spécifié :

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

Ansible essaie de trouver un module d'action nommé hosts et un module d'action nommé tasks . Ce n'est pas le cas, ce qui entraîne une erreur.

Solution : ne spécifier qu'une liste de tâches dans le champ tasks/main.yml fichier :

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

Raison #3

Le nom du module d'action est mal orthographié.

C'est assez évident, mais négligé. Si vous utilisez un nom de module incorrect, par exemple users au lieu de user Ansible signalera "aucune action détectée dans la tâche".

Ansible a été conçu comme un système hautement extensible. Il ne dispose pas d'un ensemble limité de modules que vous pouvez exécuter et il ne peut pas vérifier "à l'avance" l'orthographe de chaque module d'action.

En fait, vous pouvez écrire et ensuite spécifier votre propre module nommé qLQn1BHxzirz et Ansible doit respecter cela. Comme il s'agit d'un langage interprété, il ne "découvre" l'erreur que lorsqu'il essaie d'exécuter la tâche.


Raison #4

Vous essayez d'exécuter un module qui n'est pas distribué avec Ansible.

Le nom du module d'action est correct, mais ce n'est pas un module standard distribué avec Ansible.

Si vous utilisez un module fourni par un tiers - un fournisseur de logiciel/matériel ou un autre module partagé publiquement, vous devez d'abord télécharger le module et le placer dans le répertoire approprié.

Vous pouvez le placer soit dans modules dans le sous-répertoire du playbook ou dans un chemin commun.

Ansible regarde ANSIBLE_LIBRARY ou le --module-path argument de ligne de commande.

Pour vérifier quels chemins sont valides, exécutez :

ansible-playbook --version

et vérifier la valeur de :

chemin de recherche du module configuré =

Ansible version 2.4 et plus devrait fournir une liste de chemins.


Raison #5

Vous n'avez vraiment aucune action à l'intérieur de la tâche.

Un module d'action doit être défini pour la tâche. L'exemple suivant n'est pas valide :

- name: My task
  become: true

2 votes

Je me demande pourquoi avoir une tâche sans action est un problème pour ansible. Je pourrais vouloir créer une tâche qui échoue lorsque les variables ont des valeurs spécifiques.

0 votes

Il échoue parce qu'ansible est un déchet, le meilleur parmi les autres déchets pour le déploiement, mais ce type de comportement magique est tout simplement insensé du point de vue du développement durable.

0 votes

Réponse la plus sophistiquée !

7voto

nelaar Points 593

Je ne peux pas vraiment améliorer la réponse de @techraf. https://stackoverflow.com/a/47159200/619760 . Je voulais ajouter la raison #6 mon cas spécial

Raison #6

Utilisation incorrecte roles: pour importer/inclure des rôles en tant que sous-tâche.

Cela ne fonctionne pas, vous ne pouvez pas inclure des rôles de cette façon comme des sous-tâches dans une pièce.

---
- hosts: somehosts
  tasks:

  - name: include somerole
    roles:
      - somerole

Utiliser include_role

Selon le documentation

vous pouvez maintenant utiliser les rôles en ligne avec toute autre tâche en utilisant import_role ou 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"

Placer les rôles au bon endroit en fonction des hôtes

Inclure les rôles en haut de la page

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

Vous devez comprendre la différence entre import/include statique/dynamique

7voto

zayquan Points 2933

J'ai obtenu cette erreur lorsque j'ai référencé le debug tâche en tant que ansible.builtin.debug

Provoque un échec de syntaxe dans CI (mais fonctionne localement) :

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

Travaille localement et en CI :

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

Je crois - mais je n'ai pas confirmé - que les différences entre local et CI étaient des versions ansible.

  • Local : 2.10
  • CI : 2,7

4voto

Di V Points 65

Explication de l'erreur :

Aucune tâche à exécuter signifie qu'il ne peut pas effectuer l'action décrite dans votre livre de jeu.

Cause profonde :

  • la version installée d'Ansible ne le supporte pas

Comment vérifier :

  • ansible --version

Solution :

  • mettez à niveau Ansible vers une version qui prend en charge la fonctionnalité que vous essayez d'utiliser.

Comment mettre à jour Ansible :

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

Instruction rapide pour 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. : J'ai suivi ce chemin et j'ai mis à niveau la version 2.0.2 vers la 2.9. Après la mise à jour, le même playbook a fonctionné à merveille.

2voto

Lukasz Dynowski Points 1441

Pour moi, le problème est survenu avec le module "systemd". Il s'est avéré que mon ansible --version était 2.0.0.2 et le module a été introduit pour la première fois dans la version 2.2 . La mise à jour de mon ansible à la dernière version a réglé le problème.

playbook.yaml

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

Erreur

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X