このエントリーをはてなブックマークに追加

Ansibleを使ってリモートでコマンドを実行する

前回の記事でAnsibleが単なる構成管理ではなく、オーケストレーションというところまで踏み込んだ設計をしているという話を述べました。

オーケストレーションには多くの意味がありますが、そのうちの一つが、

  • コマンドをリモートシステムに送りつける機能

です。もちろんAnsibleでできます。とても簡単に。

Ansibleコマンド

普段使うansible-playbookコマンドではなく、ansibleコマンドを使います。

% ansible webservers -a "free -m"

Web01 | success | rc=0 >>
             total       used       free     shared    buffers   cached
Mem:          3831        444       3387          0         87   157
-/+ buffers/cache:        199       3632
Swap:            0          0          0
Web02 | success | rc=0 >>
             total       used       free     shared    buffers   cached
Mem:          3831       2656       1174          0        401   306
-/+ buffers/cache:       1949       1881
Swap:            0          0          0

こんな感じです。もちろん、-iによるinventory指定や、-fで並列実行数を指定するなどはansible-playbookと同じです。

パイプやリダイレクトを使いたい場合は-m shellを指定します。

% ansible webservers -m shell -a "free -m | grep Mem"

Web01 | success | rc=0 >>
Mem:          3831        444       3386          0         87 157

Web02 | success | rc=0 >>
Mem:          3831       2657       1174          0        401 306

これで簡単にサーバーの情報を一覧できますね。

-mではモジュールを指定します。従って、以下のような応用例があります。

応用例 1: ファイルをリモートにコピーする

% ansible webservers -m copy -a "src=/tmp/spam dest=/tmp/ham"

応用例 2: ディレクトリ作成

% ansible webservers -m file -a "dest=/path/to/c mode=644 owner=mdehaan group=mdehaan state=directory"

応用例 3: パッケージインストール

% ansible webservers -m yum -a "name=dstat state=installed"

応用例 4: gitからデプロイ

% ansible webservers -m git -a "repo=git://foo.example.org/repo.git dest=/srv/myapp version=HEAD"

応用例 5: サービス

% ansible webservers -m service -a "name=httpd state=started"

Tips: 結果をファイルに保存する

-tというオプションがあり、これを使うと結果をJSON形式で指定したディレクトリにファイルを書き出します。ファイルはホストごとに分割されています。

% ansible webservers -a "free -m" -t tmp

% ls tmp/
Web01 Web02

中身はこんな感じのjsonファイルです。

{
    "changed": true,
    "cmd": [
        "free",
        "-m"
    ],
    "delta": "0:00:00.003748",
    "end": "2014-01-21 22:32:18.565043",
    "rc": 0,
    "start": "2014-01-21 22:32:18.561295",
    "stderr": "",
    "stdout": "             total       used       free     shared
    buffers     cached\nMem:          3831        444       3386
    0         87        157\n-/+ buffers/cache:        198
    3632\nSwap:            0          0          0"

これを使うと監視に組み込んだり、長時間かかるコマンドを実行してかかった時間を記録したりなど、いろいろと応用できそうですね。