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 rm
ao servidor de destino.
Ssh diretamente no servidor e verifique se rm
funciona; use file $(which rm)
para verificar seu formato (compare com outras ferramentas como mkdir
). Faça o mesmo por /usr/bin/python
precauçã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