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