나는 원격 방랑 상자에서 프로세스를 실행하기 위해 이 가능한 작업을 작성했습니다. (글쎄, 실제로 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에서 오류가 발생했습니다.