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

元記事はこちら

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