Ansible 명령 작업이 "Exec 형식 오류"로 실행됩니다.

Ansible 명령 작업이 "Exec 형식 오류"로 실행됩니다.

나는 원격 방랑 상자에서 프로세스를 실행하기 위해 이 가능한 작업을 작성했습니다. (글쎄, 실제로 ansible 파일 자체는 훨씬 길지만, 이것은오직시작 스크립트를 실행합니다.)

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

포함된 vars 파일에 있는 다음 vars와 함께 작동합니다.

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

아이디어는 디렉토리를 "/ home/myappname/bin". 수동으로 수행하면 모든 것이 잘 작동합니다. 즉, 디렉토리가 존재하고, 파일을 읽을 수 있고, 스크립트가 작동하는 등 모두 훌륭합니다. 그런데 스크립트를 실행해 보면 Ansible 실행 코드 생성에 뭔가 문제가 있는 것 같습니다. 나와 내 구성이 그렇게 되기를 바라는가?) 앤서블인가요?

많은 정보를 얻기 위해 -vvvv를 사용하여 실행했습니다.

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   

나는 다음과 같은 것을 시도했다:

  • 디렉토리 뒤에 슬래시를 가지고 놀아요
  • 원격 시스템에서 상대 및 절대 경로와 함께 사용
  • 내 작업에서 sudo 및 sudo_user를 사용하거나 사용하지 않고 작업

나는 일부 이웃 플레이북의 동일한 변수 묶음과 함께 사용하는 다른 모든 Ansible 모듈이 잘 작동한다는 것을 알고 있습니다. 또한 그룹, 사용자, 파일, 적절한, 보관 취소, 복사와 같은 기본 제공 항목도 있습니다. 이들 중 다수는 그룹/사용자 항목이 정확해야 하므로 그것도 괜찮다는 것을 알고 있습니다.

/edit: 실행 스크립트의 이름을 바꾸고 플레이북을 실행하면 또 다른 오류가 발생하기 때문에 실행 스크립트의 경로가 올바른 것도 알고 있습니다(예상대로 "msg: [Errno 2] 해당 파일이나 디렉터리가 없습니다"). . 따라서 실제로 기존 실행 스크립트를 실행하려고 시도했지만 실패했습니다.

하지만 아무것도 작동하지 않는 것 같습니다. 무슨 일이 일어나고 있나요? 생성된 EXEC 파일의 마지막 부분에 무슨 문제가 있나요? 시간 내 줘서 고마워.

답변1

실행하려는 것이 쉘 스크립트인 경우 다음을 확인하십시오.

  • 다음과 같이 상단에 shebang 줄이 누락되지 않았습니다.

    #!/usr/bin/env bash
    
  • 사용자 ansible이 실행 권한을 가지고 실행될 것입니다(예: mode 0755)

답변2

일반적으로 ansible에서 'exec 형식 오류'는 다음을 의미할 수 있습니다.

  • 실행 가능하게 제공한 프로그램은 말 그대로 실행 파일이 아닙니다.
  • ansible은 실제로 실행 가능하지 않은 실행 파일로 표시된 파일을 발견하고 실행을 시도했습니다.

즉, 거의 항상 권한이 올바르지 않음을 의미하지만 양방향으로 발생할 수 있습니다(권한이 없거나 과도한 파일은 다양한 방식으로 실행 오류를 일으킬 수 있음).

개인적으로 저는 특정 디렉토리 등에서 "chmod 777 /etc/ansible/facts/.."와 같은 작업을 수행할 때 이러한 오류가 발생한다는 것을 발견했습니다.

답변3

"Exec 형식 오류"는 간단히 말해 커널이 유효한 프로그램으로 인식하지 못하는 파일을 실행하려고 시도했다는 의미입니다. 해당 파일의 형식은 적합하지 않습니다. 이 경우 rm대상 서버에 적용되는 것 같습니다.

SSH를 통해 서버에 직접 접속하여 제대로 rm작동하는지 확인하세요. file $(which rm)형식을 확인하는 데 사용합니다 ( 같은 다른 도구와 비교 mkdir). /usr/bin/python만일의 경우 에도 똑같이하십시오 . 아마도 다른 아키텍처 시스템이나 다른 OS에서 복사되었거나 완전히 쓰레기로 가득 차 있었을 것입니다.

답변4

가 한 줄에 있는지 확인하세요 #!/usr/bin/env bash . 내 경우에는 라인 2의 내용으로 인해 ansible에서 오류가 발생했습니다.

관련 정보