9 votes

La tâche de commande Ansible se heurte à une "erreur de format d'exécution".

J'ai écrit cette tâche ansible pour exécuter un processus sur une boîte vagrant distante. (En fait, le fichier ansible lui-même est beaucoup plus long, mais il s'agit d'un reproducteur qui sólo exécute le script de démarrage).

---
- hosts: myappname_server
  vars_files:
    - install_myappname_vars.yaml
  gather_facts: false
  sudo: true
  sudo_user: "{{ project_name }}"

  tasks:
  - name: Restart application
    command: "{{ project_target_dir_env }}/run"
    args:
      chdir: "{{ project_target_dir_env }}"

Il fonctionne avec ces variables dans le fichier vars inclus :

---
project_name: myappname
project_source_dir_files: files/myappname
project_source_dir_env: "{{ project_source_dir_files }}/environment_files"
project_target_root: /home/myappname
project_target_dir_env: "{{ project_target_root }}/bin"

L'idée est d'utiliser l'utilisateur "myappname" sur la boîte distante (aliasé correctement par "myappname_server", les autres jeux contre lesquels je tourne fonctionnent très bien) pour exécuter "/home/myappname/bin/run" après avoir changé le répertoire en "/home/myappname/bin". Si je fais cela manuellement, tout fonctionne bien, c'est-à-dire que les répertoires existent, les fichiers sont lisibles, le script fonctionne etc , tout est génial. Mais si j'exécute le script, quelque chose semble ne pas fonctionner avec la génération du code d'exécution ansible. Est-ce moi et ma configuration (je l'espère) ? Est-ce ansible ?

Je l'ai exécuté avec -vvvv pour obtenir beaucoup d'informations :

monsterkill@monsterkill-ub-dt:~/playbooks$ ansible-playbook install_myappname_restart.yaml -vvvv

PLAY [myappname_server] ********************************************************** 

TASK: [Restart application] *************************************************** 
<vagrant1> ESTABLISH CONNECTION FOR USER: vagrant
<vagrant1> REMOTE_MODULE command chdir=/home/myappname/bin /home/myappname/bin/run
<vagrant1> EXEC ['ssh', '-C', '-tt', '-vvv', '-o', 'ControlMaster=auto', '-o', 'ControlPersist=60s', '-o', 'ControlPath=/home/monsterkill/.ansible/cp/ansible-ssh-%h-%p-%r', '-o', 'Port=22', '-o', 'IdentityFile=/home/monsterkill/insecure_private_key', '-o', 'KbdInteractiveAuthentication=no', '-o', 'PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey', '-o', 'PasswordAuthentication=no', '-o', 'User=vagrant', '-o', 'ConnectTimeout=10', 'vagrant1', "/bin/sh -c 'mkdir -p /tmp/ansible-tmp-1422343063.07-259463565013754 && chmod a+rx /tmp/ansible-tmp-1422343063.07-259463565013754 && echo /tmp/ansible-tmp-1422343063.07-259463565013754'"]
<vagrant1> PUT /tmp/tmpBduhE7 TO /tmp/ansible-tmp-1422343063.07-259463565013754/command
<vagrant1> EXEC ['ssh', '-C', '-tt', '-vvv', '-o', 'ControlMaster=auto', '-o', 'ControlPersist=60s', '-o', 'ControlPath=/home/monsterkill/.ansible/cp/ansible-ssh-%h-%p-%r', '-o', 'Port=22', '-o', 'IdentityFile=/home/monsterkill/insecure_private_key', '-o', 'KbdInteractiveAuthentication=no', '-o', 'PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey', '-o', 'PasswordAuthentication=no', '-o', 'User=vagrant', '-o', 'ConnectTimeout=10', 'vagrant1', "/bin/sh -c 'chmod a+r /tmp/ansible-tmp-1422343063.07-259463565013754/command'"]
<vagrant1> EXEC ['ssh', '-C', '-tt', '-vvv', '-o', 'ControlMaster=auto', '-o', 'ControlPersist=60s', '-o', 'ControlPath=/home/monsterkill/.ansible/cp/ansible-ssh-%h-%p-%r', '-o', 'Port=22', '-o', 'IdentityFile=/home/monsterkill/insecure_private_key', '-o', 'KbdInteractiveAuthentication=no', '-o', 'PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey', '-o', 'PasswordAuthentication=no', '-o', 'User=vagrant', '-o', 'ConnectTimeout=10', 'vagrant1', u'/bin/sh -c \'sudo -k && sudo -H -S -p "[sudo via ansible, key=ucmsbsauynfzeeyxwdmgfduwovdneeqg] password: " -u myappname /bin/sh -c \'"\'"\'echo SUDO-SUCCESS-ucmsbsauynfzeeyxwdmgfduwovdneeqg; /usr/bin/python /tmp/ansible-tmp-1422343063.07-259463565013754/command\'"\'"\'\'']
<vagrant1> EXEC ['ssh', '-C', '-tt', '-vvv', '-o', 'ControlMaster=auto', '-o', 'ControlPersist=60s', '-o', 'ControlPath=/home/monsterkill/.ansible/cp/ansible-ssh-%h-%p-%r', '-o', 'Port=22', '-o', 'IdentityFile=/home/monsterkill/insecure_private_key', '-o', 'KbdInteractiveAuthentication=no', '-o', 'PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey', '-o', 'PasswordAuthentication=no', '-o', 'User=vagrant', '-o', 'ConnectTimeout=10', 'vagrant1', "/bin/sh -c 'rm -rf /tmp/ansible-tmp-1422343063.07-259463565013754/ >/dev/null 2>&1'"]
failed: [vagrant1] => {"cmd": ["/home/myappname/bin/run"], "failed": true, "rc": 8}
msg: [Errno 8] Exec format error

FATAL: all hosts have already failed -- aborting

PLAY RECAP ******************************************************************** 
           to retry, use: --limit @/home/monsterkill/install_myappname_restart.yaml.retry

vagrant1                   : ok=0    changed=0    unreachable=0    failed=1   

J'ai essayé des choses comme :

  • jouer avec les slashs après le répertoire
  • en utilisant des chemins relatifs et absolus sur la machine distante
  • travailler avec et sans sudo et sudo_user dans mes tâches

Je sais que tous les autres modules ansible que j'utilise avec le même groupe de variables provenant de certains playbooks voisins fonctionnent très bien. Aussi des trucs intégrés, comme groupe, utilisateur, fichier, apt, unarchive, copie. Notez qu'un certain nombre d'entre eux nécessitent également que le groupe/utilisateur soit correct, donc je sais que tout est correct également.

/edit : Je sais aussi que le chemin vers l'exécution script est correct, car si je renomme l'exécution script et exécute le playbook, j'obtiens une autre erreur ("msg : [Errno 2] No such file or directory", comme prévu). Donc, il essaie en fait d'exécuter l'exécution existante script, mais échoue.

Mais rien ne semble fonctionner. Qu'est-ce qui se passe, qu'est-ce qui ne va pas avec ce dernier morceau de truc EXEC généré ? Merci pour votre temps.

16voto

Jake Points 21

Si la chose que vous essayez d'exécuter est un Shell Shell, vérifiez :

  • Qu'il ne manque pas une ligne en haut de la page :

    #!/usr/bin/env bash
  • Que l'utilisateur sous lequel ansible s'exécutera possède des autorisations d'exécution pour cette fonction (par exemple, mode 0755 )

1voto

jayunit100 Points 571

En général, 'exec format error' dans ansible peut signifier :

  • un programme que vous avez donné à ansible à exécuter est, littéralement, pas un exécutable.
  • ansible a trouvé un fichier marqué comme exécutable, qui ne l'est pas vraiment, et a essayé de l'exécuter.

En d'autres termes : Cela signifie presque toujours que les permissions sont incorrectes, mais cela peut se produire dans les deux sens (des fichiers sous-privilégiés ou sur-privilégiés peuvent provoquer des erreurs d'exécution de différentes manières).

Personnellement, j'ai constaté que j'obtiens une telle erreur lorsque je fais des choses comme "chmod 777 /etc/ansible/facts/ " sur certains répertoires et ainsi de suite.

0voto

James Mertz Points 390

"Exec format error" signifie, simplement, que vous avez essayé d'exécuter un fichier que le noyau ne reconnaît pas comme un programme valide - il a un format inadapté. Dans ce cas, cela semble s'appliquer à rm sur le serveur cible.

Connectez-vous directement au serveur et vérifiez que rm travaux ; utilisation file $(which rm) pour vérifier son format (comparer avec d'autres outils tels que mkdir ). Faites de même avec /usr/bin/python juste au cas où. Il a peut-être été copié d'un système d'architecture différent, ou d'un système d'exploitation différent, ou carrément rempli de déchets.

0voto

Ilya Matyushev Points 1

Vérifiez que #!/usr/bin/env bash se trouve dans 1 ligne. Dans mon cas, ansible a donné une erreur due à ce qui se trouvait dans la ligne 2

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X