La tarea de comando de Ansible se ejecuta en "Error de formato Exec"

La tarea de comando de Ansible se ejecuta en "Error de formato Exec"

Escribí esta tarea ansible para ejecutar un proceso en una caja vagabunda remota. (Bueno, en realidad el archivo ansible en sí es mucho más largo, pero este es un reproductor quesoloejecuta el script de inicio.)

---
- 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 }}"

Funciona con estas vars en el archivo vars incluido:

---
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"

La idea es usar el usuario "myappname" en el cuadro remoto (alias correctamente "myappname_server", otras jugadas con las que ejecuto funcionan bien) para ejecutar "/home/myappname/bin/run" después de cambiar el directorio a "/ inicio/nombremiaplicación/bin". Si lo hago manualmente, todo funciona bien, es decir, los directorios existen, los archivos son legibles, el script funciona, etc., todo genial. Pero si ejecuto el script, algo parece estar mal con la generación del código de ejecución ansible. ¿Somos yo y mi configuración, así lo esperamos)? ¿Es ansible?

Lo ejecuté con -vvvv para obtener mucha información:

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   

Probé cosas como:

  • jugando con barras después del directorio
  • uso con rutas relativas y absolutas en la máquina remota
  • trabajar con y sin sudo y sudo_user en mis tareas

Sé que todos los demás módulos ansible que uso con el mismo grupo de variables de algunos libros de jugadas vecinos funcionan bien. También cosas integradas, como grupo, usuario, archivo, apt, desarchivar, copiar. Tenga en cuenta que varios de estos también requieren que las cosas del grupo/usuario sean correctas, así que sé que todo eso también está bien.

/editar: También sé que la ruta al script de ejecución es correcta, porque si cambio el nombre del script de ejecución y ejecuto el libro de estrategias, aparece otro error ("msg: [Errno 2] No existe tal archivo o directorio", como se esperaba) . Entonces, en realidad está intentando ejecutar el script de ejecución existente, pero falla.

Pero nada parece funcionar. ¿Qué está pasando, qué hay de malo con la última pieza de material EXEC generado? Gracias por tu tiempo.

Respuesta1

Si lo que estás intentando ejecutar es un script de shell, verifica:

  • Que no le falte una línea shebang en la parte superior como:

    #!/usr/bin/env bash
    
  • Que el usuario ansible se ejecutará si tiene permisos de ejecución (por ejemplo, modo 0755)

Respuesta2

En general, 'error de formato ejecutivo' en ansible puede significar:

  • un programa que le diste a ansible para ejecutar no es, literalmente, un ejecutable.
  • ansible encontró un archivo marcado como ejecutable, que en realidad no es ejecutable, e intentó ejecutarlo.

En otras palabras: casi siempre significa que los permisos son incorrectos, pero puede suceder en ambas direcciones (los archivos sin privilegios o con demasiados privilegios pueden causar errores de ejecución de diferentes maneras).

Personalmente, he descubierto que aparece ese error cuando hago cosas como "chmod 777 /etc/ansible/facts/.." en ciertos directorios, etc.

Respuesta3

"Error de formato de ejecución" significa, simplemente, que ha intentado ejecutar un archivo que el kernel no reconoce como programa válido; está en un formato inadecuado. En este caso, eso parece aplicarse rmal servidor de destino.

Ssh directamente al servidor y verifique que rmfuncione; Úselo file $(which rm)para verificar su formato (compárelo con otras herramientas como mkdir). Haz lo mismo por /usr/bin/pythonsi acaso. Quizás fue copiado de un sistema de arquitectura diferente, o de un sistema operativo diferente, o simplemente lleno de basura.

Respuesta4

Compruebe que #!/usr/bin/env bash esté ubicado en 1 línea. En mi caso ansible dio error por lo que había en la línea 2

información relacionada