web-dev-qa-db-ja.com

Ansibleコマンドタスクが「Exec形式エラー」に実行される

リモートの迷惑なボックスでプロセスを実行するために、このansibleタスクを作成しました。 (まあ、実際には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」を実行しますhome/myappname/bin "。これを手動で行うと、すべてが正常に機能します。つまり、dirが存在し、ファイルが読み取り可能で、スクリプトが機能するなど、すべて問題ありません。しかし、スクリプトを実行すると、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モジュールは問題なく機能することを知っています。また、グループ、ユーザー、ファイル、apt、アーカイブ解除、コピーなどの組み込みのもの。これらの多くはグループやユーザーの情報も正しくなければならないことに注意してください。そのため、それでも問題ありません。

/ edit:実行スクリプトの名前を変更してプレイブックを実行すると、別のエラーが発生するため、実行スクリプトへのパスが正しいこともわかっています( "msg:[Errno 2]そのようなファイルまたはディレクトリはありません"、予想どおり) 。したがって、実際には既存の実行スクリプトを実行しようとしていますが、失敗します。

しかし、何も機能していないようです。何が起こっているのですか、生成されたEXECのものの最後の部分の何が問題になっていますか?御時間ありがとうございます。

6
SadBunny

実行しようとしているものがシェルスクリプトの場合は、次の点を確認してください。

  • 次のような上部のシバン行が欠落していないこと:

    #!/usr/bin/env bash
    
  • ユーザーansibleが実行権限を持っているように実行されること(例:mode 0755
8
thenickdude

一般に、ansibleの「execformaterror」は次のことを意味します。

  • 実行可能に指定したプログラムは、文字通り、実行可能ファイルではありません。
  • ansibleは、実際には実行可能ではない実行可能ファイルとしてマークされたファイルを見つけ、それを実行しようとしました。

言い換えると、ほとんどの場合、アクセス許可が正しくないことを意味しますが、双方向で発生する可能性があります(特権が不足しているファイルまたは特権が過剰なファイルは、さまざまな方法でexecエラーを引き起こす可能性があります)。

個人的には、特定のディレクトリなどで「chmod 777/etc/ansible/facts/..」などを実行すると、このようなエラーが発生することがわかりました。

1
jayunit100

「Exec形式エラー」とは、単に、カーネルが有効なプログラムとして認識しないファイルを実行しようとしたことを意味します。これは不適切な形式です。この場合、これはターゲットサーバーのrmに当てはまるようです。

サーバーに直接SSH接続し、rmが機能することを確認します。 file $(which rm)を使用して、その形式を確認します(mkdirなどの他のツールと比較してください)。同じことを/usr/bin/python 念のため。おそらく、それは別のアーキテクチャシステムから、または別のOSからコピーされたか、あるいは完全にゴミでいっぱいでした。

0
user1686