運用時の Ansible の使い方(一例)

運用時の Ansible の使い方(一例)

こんにちは。15年度入社の新卒、大澤です。

私はインフラエンジニアとして Aiming に入社し、ほぼ毎日新しい技術やサービスに触れています( Git, Jenkins, Ansible, などなど… )。その中でも今回は、私が最近覚えた運用時に使う Ansible の一例を紹介したいと思います。

Ansible shell module を用いて、複数サーバへコマンドを実行

同じコマンドを実行したいサーバが複数台ある場合( Slave DB2台に “show slave status\G” とか、Web Server 5台のアクセスログを見るとか…)、私のような未熟者だと「一台ずつ入ってコマンドを実行しよう!」と考えがちですが、そのやり方だと非効率だと叱咤を受けます。そこで、 Ansible の shell module を使用します。

例えば、下記のような inventory file を用意して…

[web-server]
webserver01
webserver02
webserver03

[slave-server]
slave01
slave02

以下のコマンドを実行します。

ansible -i hosts web-server -m shell -s -a "tail -2 access.log" | less

(オプションの説明)
-i <inventory_file> <group>: inventory file を指定する。group 名を指定しないとエラー。
-m <module>: 実行する module を指定する。
-s: sudo で実行する。
-a <command>: 実行する command を書く。

すると、 web-server group に書かれている server(webserver01~ 03) 全てに “tail -2 access.log” が実行され、サーバごとの結果が less に渡されて表示されます。上記のコマンドだと、access.log の中身が末尾2行ずつ表示されます。結果をパイプで渡すことも出来ますし、実行するコマンド内でもパイプは使用できます。

↓ access.log を見ている様子(見えてはいけない部分は隠しています。)
https://gyazo.com/fe7b1c9cc5ce01e3a06c8b49920aec51

もちろん、for 文でも同じことができますが、inventory file の group 分けが便利だと感じます(上記の例でいうと、 web-server と slave-server )。-i hosts all とすると、inventory file に書かれている全てのサーバに実行されます(重複はしない)。もちろん1つのサーバを指定することもできます。

以上、私が最近覚えた運用時の Ansible の使い方の一例でした。
来年の新卒にきちんと教えられるよう今後も Aiming で頑張りたいと思います。