A tarefa de comando Ansible é executada em “Erro de formato Exec”

A tarefa de comando Ansible é executada em “Erro de formato Exec”

Eu escrevi esta tarefa ansible para executar um processo em uma caixa remota do Vagrant. (Bem, na verdade o arquivo ansible em si é muito mais longo, mas este é um reprodutor queapenasexecuta o script inicial.)

---
- 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 com estes vars no arquivo vars incluído:

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

A idéia é usar o usuário "myappname" na caixa remota (alias correta por "myappname_server", outras jogadas que executo funcionam perfeitamente) para executar "/home/myappname/bin/run" depois de alterar o diretório para "/ home/meunomedoaplicativo/bin". Se eu fizer isso manualmente, tudo funciona bem, ou seja, os diretórios existem, os arquivos são legíveis, o script funciona etc., tudo ótimo. Mas se eu executar o script, algo parece estar errado com a geração do código de execução ansible. Sou eu e minha configuração, espero que sim)? É ansible?

Executei com -vvvv para obter muitas informações:

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   

Eu tentei coisas como:

  • brincando com barras após o diretório
  • usando com caminhos relativos e absolutos na máquina remota
  • trabalhar com e sem sudo e sudo_user em minhas tarefas

Eu sei que todos os outros módulos ansible que uso com o mesmo grupo de vars de alguns manuais vizinhos funcionam perfeitamente. Também coisas integradas, como grupo, usuário, arquivo, apt, desarquivar, copiar. Observe que vários deles também exigem que as informações do grupo/usuário estejam corretas, então sei que está tudo bem também.

/edit: Também sei que o caminho para o script de execução está correto, porque se eu renomear o script de execução e executar o manual, recebo outro erro ("msg: [Errno 2] Nenhum arquivo ou diretório", conforme esperado) . Na verdade, ele está tentando executar o script de execução existente, mas falhando.

Mas nada parece funcionar. O que está acontecendo, o que há de errado com a última parte do material EXEC gerado? Obrigado pelo seu tempo.

Responder1

Se o que você está tentando executar for um script de shell, verifique:

  • Que não está faltando uma linha shebang no topo como:

    #!/usr/bin/env bash
    
  • Que o usuário ansible será executado como possui permissões de execução para ele (por exemplo, mode 0755)

Responder2

Em geral, 'erro de formato exec' em ansible pode significar:

  • um programa que você deu permissão para executar não é, literalmente, um executável.
  • ansible encontrou um arquivo marcado como executável, que não é realmente executável, e tentou executá-lo.

Em outras palavras: quase sempre significa que as permissões estão incorretas, mas pode acontecer em ambas as direções (arquivos desprivilegiados ou superprivilegiados podem causar erros de execução de diferentes maneiras).

Pessoalmente, descobri que recebo esse erro quando faço coisas como "chmod 777 /etc/ansible/facts/.." em determinados diretórios e assim por diante.

Responder3

“Erro de formato Exec” significa, simplesmente, que você tentou executar um arquivo que o kernel não reconhece como um programa válido – está em um formato inadequado. Neste caso, isso parece se aplicar rmao servidor de destino.

Ssh diretamente no servidor e verifique se rmfunciona; use file $(which rm)para verificar seu formato (compare com outras ferramentas como mkdir). Faça o mesmo por /usr/bin/pythonprecaução. Talvez tenha sido copiado de um sistema de arquitetura diferente, ou de um sistema operacional diferente, ou completamente cheio de lixo.

Responder4

Verifique se #!/usr/bin/env bash está localizado em 1 linha. No meu caso, o ansible deu um erro devido ao que estava na linha 2

informação relacionada