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"

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

Comments

comments powered by Disqus