Ansibleでwin_shellコマンド実行後、プロセスが終了されない、処理が止まる場合に参考になる情報です。
私はAnsibleを学んでいるのですが、どこにも適切な参考資料が見当たらない問題に遭遇しました。
ターゲット マシンに .ps1 があり、これを Ansible 経由で実行し、変数も渡したいと考えています。そのためのプレイブックは非常にシンプルです。
---
- name: run stuff
hosts: all
gather_facts: no
vars:
force_all_hosts: false
tasks:- name: run mounter script
win_shell: C:\folder\file.ps1 -password (ConvertTo-SecureString "{{vault_pw}}" -AsPlainText -Force)
.ps1 のコンテンツは、Windows マシンのローカルで手動で実行すると機能するため、実際のコマンドが機能することはわかっています。プレイブックを実行すると、Powershell スクリプトが正常に実行され、変更が加えられるため、同様に機能しますが、実際のタスクは完了しないため、プレイブックを終了できません。戻りコードが 0 ではなく RC が 1 であるというメッセージを強制的に表示するために、win_shell 行の末尾に「< NUL」を追加しましたが、その後 Ansible を 2.8 に更新したところ、「<」文字が予約されたため、戻りコードの失敗を再現できなくなりました。
戻りコードを強制し、それが <= 2 などの場合にフィルターする方法はありますか? あるいは、もっと良い方法として、プレイが失敗したと報告する async/poll を使用する以外に、ジョブが終了することを確認する別の方法はありますか?
参考になる回答です。
Ansible の async オプションを試していただけますか?
https://docs.ansible.com/ansible/latest/user_guide/playbooks_async.html
動作上は、処理自体は完了しているなら、非同期モードで回避できます。
デフォルトでは、Ansible はタスクを同期的に実行し、アクションが完了するまでリモート ノードへの接続を開いたままにします。つまり、プレイブック内では、各タスクがデフォルトで次のタスクをブロックし、現在のタスクが完了するまで後続のタスクは実行されません。この動作によって問題が発生する可能性があります。たとえば、タスクの完了に SSH セッションで許可されている時間よりも長い時間がかかり、タイムアウトが発生する場合があります。または、他のタスクを同時に実行しながら、長時間実行されるプロセスをバックグラウンドで実行したい場合もあります。非同期モードでは、長時間実行されるタスクの実行方法を制御できます。
引用元
powershell - win_shell completing command but not ending process - Stack Overflow
![]() |
|
エレコム マウス ワイヤレス Mサイズ 5ボタン(戻る・進むボタン搭載) BlueLED 握りの極み ガンメタリック M-XGM10DBBK/EC |
![]()
