web-dev-qa-db-fra.com

Pourquoi Ansible affiche-t-il l'erreur "ERREUR! Aucune action détectée dans la tâche"?

Ansible montre une erreur:

ERREUR! 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
37
techraf

Raison n ° 1

Vous utilisez une ancienne version de Ansible qui ne contenait pas le module que vous essayez d'exécuter.

Comment le vérifier?

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

  2. Lisez l'en-tête en haut de la page - il montre 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 de Ansible ou ultérieure. Courir:

    ansible-playbook --version
    

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

    ansible-playbook 2.4.1.0


Raison n ° 2

Vous avez essayé d'écrire un rôle et de mettre un playbook dans my_role/tasks/main.yml.

Le fichier tasks/main.yml doit contenir uniquement 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, alors cela génère une erreur.

Solution: spécifiez uniquement une liste de tâches dans le fichier tasks/main.yml:

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

Raison n ° 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 puis spécifier votre propre module nommé qLQn1BHxzirz et Ansible doit respecter cela. S'agissant d'un langage interprété, il "découvre" l'erreur uniquement lors de la tentative d'exécution de la tâche.


Raison n ° 4

Vous essayez d'exécuter un module non 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 le sous-répertoire modules du livre de lecture, soit dans un chemin commun.

Ansible cherche ANSIBLE_LIBRARY ou l'argument de ligne de commande --module-path.

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

ansible-playbook --version

et vérifier la valeur de:

chemin de recherche de module configuré =

Ansible version 2.4 et ultérieure devrait fournir une liste de chemins.


Raison n ° 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
67
techraf

Je ne peux pas vraiment améliorer la réponse de @techraf https://stackoverflow.com/a/47159200/61976 . Je voulais ajouter la raison n ° 6 à mon cas particulier

Raison n ° 6

Utilisation incorrecte de 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 manière en tant que sous-tâches dans une pièce.

---
- hosts: somehosts
  tasks:

  - name: include somerole
    roles:
      - somerole

Utilisez include_role

Selon le documentation

vous pouvez maintenant utiliser des 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"

Placez les rôles au bon endroit en ligne avec les hôtes

Inclure les rôles en haut

---
- 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 static/dynamic

5
nelaaro