あんまり需要がないかもしれないけど、コマンドに & つけてバックグラウンドでプロセスを起動したい場合 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 終了をチェックする時間を設定出来る。尚、上記の例のように poll0 に設定することで 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 奥深い。

元記事はこちら

Ansible でバックグラウンドプロセスを起動する