Ansible command-task ทำงานเป็น“ Exec format error”


4

ฉันได้เขียนภารกิจที่ไม่น่าเชื่อนี้เพื่อเรียกใช้กระบวนการในกล่องคนจรจัดระยะไกล (อันที่จริงแล้วไฟล์ 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"

แนวคิดคือการใช้ผู้ใช้ "myappname" ในกล่องระยะไกล (นามแฝงอย่างถูกต้องโดย "myappname_server" การเล่นอื่น ๆ ที่ฉันเรียกใช้ทำงานได้ดี) เพื่อเรียกใช้ "/ home / myappname / bin / run" หลังจากเปลี่ยนไดเรกทอรีเป็น "/ บ้าน / myappname / bin" หากฉันทำด้วยตนเองทุกอย่างทำงานได้ดีเช่น dirs มีอยู่ไฟล์สามารถอ่านได้สคริปต์ทำงานได้ดีมาก แต่ถ้าฉันรันสคริปต์สิ่งที่ดูเหมือนจะผิดกับรุ่นของรหัสการเรียกใช้ 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 อื่น ๆ ทั้งหมดที่ฉันใช้กับ vars พวงเดียวกันจาก playbooks ใกล้เคียงบางตัวก็ใช้ได้ดี สิ่งในตัวเช่นกลุ่มผู้ใช้ไฟล์ apt ไม่เก็บถาวรคัดลอก โปรดทราบว่าจำนวนของสิ่งเหล่านี้ยังต้องการสิ่งที่กลุ่ม / ผู้ใช้ที่จะต้องถูกต้องดังนั้นฉันรู้ว่าทุกอย่างดี

/ แก้ไข: ฉันรู้ว่าเส้นทางไปยังสคริปต์การทำงานนั้นถูกต้องเพราะถ้าฉันเปลี่ยนชื่อสคริปต์การเรียกใช้และเรียกใช้ playbook ฉันจะได้รับข้อผิดพลาดอื่น ("msg: [Errno 2] ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว" . ดังนั้นจริง ๆ แล้วพยายามเรียกใช้สคริปต์การเรียกใช้ที่มีอยู่ แต่ล้มเหลว

แต่ดูเหมือนว่าจะไม่มีอะไรทำงาน เกิดอะไรขึ้นเกิดอะไรขึ้นกับสิ่งที่ EXEC ชิ้นสุดท้ายสร้างขึ้น? ขอบคุณที่สละเวลา.

คำตอบ:


6

หากสิ่งที่คุณพยายามเรียกใช้คือเชลล์สคริปต์ให้ตรวจสอบ:

  • ว่ามันจะไม่หายไปเส้น Shebang ที่ด้านบนเช่น

    #!/usr/bin/env bash
    
  • ที่ผู้ใช้จะสามารถเรียกใช้งานได้ตามที่ได้รับอนุญาตให้ดำเนินการได้ (เช่นโหมด 0755 )

0

"ข้อผิดพลาดการจัดรูปแบบ Exec" หมายถึงเพียงแค่คุณพยายามเรียกใช้งานไฟล์ที่เคอร์เนลไม่รู้จักว่าเป็นโปรแกรมที่ถูกต้อง แต่อยู่ในรูปแบบที่ไม่เหมาะสม ในกรณีนี้ดูเหมือนว่าจะนำไปใช้กับ rm บนเซิร์ฟเวอร์เป้าหมาย

Ssh เข้าสู่เซิร์ฟเวอร์โดยตรงและตรวจสอบว่า rm ทำงาน; ใช้ file $(which rm) เพื่อตรวจสอบรูปแบบ (เปรียบเทียบกับเครื่องมืออื่น ๆ เช่น mkdir ) ทำเช่นเดียวกันกับ /usr/bin/python ในกรณีที่ บางทีมันอาจจะถูกคัดลอกมาจากระบบสถาปัตยกรรมอื่นหรือจากระบบปฏิบัติการอื่นหรือเต็มไปด้วยขยะ


ขอบคุณ! อย่าคิดว่า: '(rm ทำงานได้ดี (ทำงานได้ดีบนกล่องเป้าหมายเช่นเดียวกับสวิตช์ -rf) กล่องเป้าหมายคือการตั้งค่าเริ่มต้นของ Ubuntu 14.04 Vagrant การตั้งค่าออกจากกล่องฉันตรวจสอบผลลัพธ์ของ playbooks อื่น ๆ และพวกเขาสามารถ rm tempfiles ได้ดีดังนั้นมันจึงไม่เป็นเช่นนั้นสำหรับฉันข้อผิดพลาดดูเหมือนจะบ่งบอกว่ามันพบโครงสร้าง "EXEC" ที่สร้างขึ้นไม่ถูกต้องเช่น parser ลืมที่จะหลบหนี char พิเศษ หรืออะไรบางอย่างที่สองในบล็อกของสามมี "u '/ bin / sh" แปลกในบรรทัดมันดูแปลก ... สิ่งสุดท้ายก่อนที่จะลบ tempfiles มันไปที่นั่นได้อย่างไร
SadBunny

@SadBunny: ใช่ไหม โปรแกรมไม่ใช้ 'errno' สำหรับข้อผิดพลาดระดับที่สูงขึ้น; มันมักจะมาจากฟังก์ชั่น libc ระดับต่ำ ณ จุดนั้นโครงสร้างเดียวที่เหลือคืออาร์เรย์ C ธรรมดาที่กำหนดให้กับ execvp (); ข้อผิดพลาดเท่านั้นมาจากเคอร์เนล; และ ENOEXEC "ข้อผิดพลาดการจัดรูปแบบ Exec" มีความหมายค่อนข้างเฉพาะ ฉันว่ามันเป็นเรื่องบังเอิญที่ข้อความบันทึกของ Ansible ก็พูดว่า "EXEC" (ตั้งแต่นั้นมาพวกเขาพูดถึงการใช้คำสั่ง)
grawity

ตกลงนั่นคือสูงกว่าการลดระดับของฉันเล็กน้อยเพื่อที่จะพูด :) ฉันแค่พยายามทำ Sherlocking ของคนธรรมดาบางคนในแง่นี้ ... ขอบคุณสำหรับคำอธิบาย ยังคงเห็นได้ชัดว่ามันไม่ได้เป็น 'rm' ที่เสียหายเนื่องจาก playbooks อื่น ๆ ถูกเรียกใช้จาก / ไปยังระบบเดียวกันภายใต้ผู้ใช้เดียวกัน เมื่อพิจารณาข้อมูลเชิงลึกของคุณและ "หลักฐาน" อาจมีบางอย่างผิดปกติกับสคริปต์รันจริงหรือเชลล์ที่เรียกใช้งานหรือบางสิ่งบางอย่าง ... ฉันจะกลับไปทำงานในวันพรุ่งนี้ ขอบคุณที่คิดไว้!
SadBunny

โดยวิธีการไฟล์ $ (ซึ่ง rm) ให้: vagrant @ vagrant-ubuntu-trusty-64: ~ $ file $ (ซึ่ง rm) / bin / rm: ELF ปฏิบัติการ 64 บิต LSB, x86-64, รุ่น 1 ( SYSV) เชื่อมโยงแบบไดนามิก (ใช้ libs ที่ใช้ร่วมกัน), สำหรับ GNU / Linux 2.6.24, BuildID [sha1] = da0387e892c7a6dc57acf6618891cdb97f7f605c, ถูกปล้น
SadBunny

0

โดยทั่วไป 'ข้อผิดพลาดการจัดรูปแบบ exec' ใน ansible อาจหมายถึง:

  • โปรแกรมที่คุณให้การอนุญาตให้รันคือตัวอักษรไม่ใช่ตัวเรียกทำงาน
  • ansible พบไฟล์ที่ถูกทำเครื่องหมายว่าสามารถเรียกใช้งานได้ซึ่งไม่สามารถเรียกใช้งานได้จริงและพยายามเรียกใช้งาน

กล่าวอีกนัยหนึ่ง: เกือบทุกครั้งหมายความว่าสิทธิ์ไม่ถูกต้อง แต่สามารถเกิดขึ้นได้ทั้งสองทิศทาง (ไฟล์ที่ด้อยโอกาสหรือไฟล์ที่มีขนาดเล็กเกินไปอาจทำให้เกิดข้อผิดพลาดในรูปแบบที่แตกต่างกัน)

โดยส่วนตัวฉันพบว่าฉันได้รับข้อผิดพลาดดังกล่าวเมื่อฉันทำสิ่งต่าง ๆ เช่น "chmod 777 / etc / ansible / Facts / .. " ในบางไดเรกทอรี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.