あんまり需要がないかもしれないけど、コマンドに & つけてバックグラウンドでプロセスを起動したい場合 Ansible でどんな風に書くのかなって思って調べたメモ。
async を利用する
async とは
Asynchronous Actions and Polling — Ansible Documentation
async オプションを利用すると対象のホストと ssh 接続を切断した後でも task を継続することが出来るらしい。
例えば、ruby の Web サーバーを起動する場合には以下のように記述する。
1 2 3 4 5 6 | - 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 終了を待たずに次の処理を続行することが出来る。
確認
対象を確認。
1 2 3 4 | $ 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 を実行する。
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | $ 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 < /job >< /job > |
コンテナ外から確認。
1 2 3 4 | $ curl localhost:32774 963e4d709a24 $ curl localhost:32776 c546913525e6 |
ちゃんと Ruby の Web サーバーがバックグランドで起動している。
といふことで
Ansible 奥深い。