リモートの迷惑なボックスでプロセスを実行するために、この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
私は次のようなことを試しました:
いくつかの隣接するプレイブックの同じ変数の束で使用する他のすべてのansibleモジュールは問題なく機能することを知っています。また、グループ、ユーザー、ファイル、apt、アーカイブ解除、コピーなどの組み込みのもの。これらの多くはグループやユーザーの情報も正しくなければならないことに注意してください。そのため、それでも問題ありません。
/ edit:実行スクリプトの名前を変更してプレイブックを実行すると、別のエラーが発生するため、実行スクリプトへのパスが正しいこともわかっています( "msg:[Errno 2]そのようなファイルまたはディレクトリはありません"、予想どおり) 。したがって、実際には既存の実行スクリプトを実行しようとしていますが、失敗します。
しかし、何も機能していないようです。何が起こっているのですか、生成されたEXECのものの最後の部分の何が問題になっていますか?御時間ありがとうございます。
実行しようとしているものがシェルスクリプトの場合は、次の点を確認してください。
次のような上部のシバン行が欠落していないこと:
#!/usr/bin/env bash
0755
)一般に、ansibleの「execformaterror」は次のことを意味します。
言い換えると、ほとんどの場合、アクセス許可が正しくないことを意味しますが、双方向で発生する可能性があります(特権が不足しているファイルまたは特権が過剰なファイルは、さまざまな方法でexecエラーを引き起こす可能性があります)。
個人的には、特定のディレクトリなどで「chmod 777/etc/ansible/facts/..」などを実行すると、このようなエラーが発生することがわかりました。
「Exec形式エラー」とは、単に、カーネルが有効なプログラムとして認識しないファイルを実行しようとしたことを意味します。これは不適切な形式です。この場合、これはターゲットサーバーのrm
に当てはまるようです。
サーバーに直接SSH接続し、rm
が機能することを確認します。 file $(which rm)
を使用して、その形式を確認します(mkdir
などの他のツールと比較してください)。同じことを/usr/bin/python
念のため。おそらく、それは別のアーキテクチャシステムから、または別のOSからコピーされたか、あるいは完全にゴミでいっぱいでした。