あんまり需要がないかもしれないけど、コマンドに &
つけてバックグラウンドでプロセスを起動したい場合 Ansible でどんな風に書くのかなって思って調べたメモ。
async を利用する
async とは
Asynchronous Actions and Polling — Ansible Documentation
async オプションを利用すると対象のホストと ssh 接続を切断した後でも task を継続することが出来るらしい。
例えば、ruby の Web サーバーを起動する場合には以下のように記述する。
- shell: hostname > /tmp/index.html ; cd /tmp/ ; /usr/local/ruby/bin/ruby -run -e httpd . -p 8000 & register: result_check async: 5 poll: 0 - debug: var=result_check
async
は実行される task(上記の例だと shell
)を待つ時間、poll
は task 終了をチェックする時間を設定出来る。尚、上記の例のように poll
を 0
に設定することで task 終了を待たずに次の処理を続行することが出来る。
確認
対象を確認。
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c546913525e6 inokappa/centos-ruby:latest "/bin/sh -c '/usr/sb 24 hours ago Up 24 hours 0.0.0.0:32775->22/tcp, 0.0.0.0:32776->8000/tcp ansible_02 963e4d709a24 inokappa/centos-ruby:latest "/bin/sh -c '/usr/sb 24 hours ago Up 24 hours 0.0.0.0:32773->22/tcp, 0.0.0.0:32774->8000/tcp ansible_01
実際に playbook を実行する。
$ ansible-playbook -i inventories/docker_inventory.rb common.yml -c paramiko PLAY [all] ******************************************************************** GATHERING FACTS *************************************************************** ok: [ansible_02] ok: [ansible_01] TASK: [app | shell hostname > /tmp/index.html ; cd /tmp/ ; /usr/local/ruby/bin/ruby -run -e httpd . -p 8000 &] *** <job 600296650706.557> finished on ansible_01 <job 600296650706.536> finished on ansible_02 TASK: [app | debug var=result_check] ****************************************** ok: [ansible_01] => { "var": { "result_check": { "ansible_job_id": "600296650706.557", "invocation": { "module_args": "hostname > /tmp/index.html ; cd /tmp/ ; /usr/local/ruby/bin/ruby -run -e httpd . -p 8000 &", "module_name": "shell" }, "results_file": "/root/.ansible_async/600296650706.557", "started": 1 } } } ok: [ansible_02] => { "var": { "result_check": { "ansible_job_id": "600296650706.536", "invocation": { "module_args": "hostname > /tmp/index.html ; cd /tmp/ ; /usr/local/ruby/bin/ruby -run -e httpd . -p 8000 &", "module_name": "shell" }, "results_file": "/root/.ansible_async/600296650706.536", "started": 1 } } } PLAY RECAP ******************************************************************** ansible_01 : ok=4 changed=0 unreachable=0 failed=0 ansible_02 : ok=4 changed=0 unreachable=0 failed=0
コンテナ外から確認。
$ curl localhost:32774 963e4d709a24 $ curl localhost:32776 c546913525e6
ちゃんと Ruby の Web サーバーがバックグランドで起動している。
といふことで
Ansible 奥深い。