読者です 読者をやめる 読者になる 読者になる

リア充爆発日記

You don't even know what ria-ju really is.

fabricとAnsibleを試してみる

背景

  • AWS上のCentOS7でRailsが動く環境をCMツールで作りたい
  • 仮想的なAWSのCentOS7はdockerのimageで用意した

    • ria10.hatenablog.com
  • Chefはそれなりに使ったことがある。

    • が、0.9くらいのときからしばらく使ってない
    • 自分はそんなに感じなかったがChefは学習コストが高いとよく聞くので、他のfabricやansibleはどうなのか気になっている
  • この機会にかるくfabricとAnsibleを触ってみようということに
    • ちなみに両方共python
  • 想定クライアントはOSX(yosemite)で想定リモートホストはCentOS7

fabric編

インストール

  • pipのインストールとfabricのインストール
sudo easy_install pip
sudo pip install fabric

チュートリアルをやってみる

番組の途中ですが、ここでfabricについては不採用ということで決定しました。 理由としては、なんだかやっててよくわかんないし、つまらないから。

次はAnsibleで。Ansibleが刺さらなかったらChefに決定ということで。

Ansible編

気を取り直してAnsibleの評価へ。 - versionは1.5

参考

インストール

$ brew update
$ brew install ansible
  • ちなみにAnsible自体windowsはサポートしてない。

動作確認

inventoryファイルの用意

  • 接続先ホストの設定をするファイル。
  • /etc/ansible/hosts がデフォルトの配置場所だけど、今回は適当な作業ディレクトリを作ってそこに置くことにする
  • dir/to/workspace/hosts に接続先のホスト名かIPを書く。こんな感じ。

    192.168.59.103:49173 ansible_ssh_user=centos

    • IPはdockerのcontainerに割り当てられたIP
    • sshポートが22じゃない場合は:のあとにポート番号を書く
    • ユーザー指定は実行時にもできるけど、ここで指定ができる。
    • 秘密鍵の指定もansible_ssh_private_key_fileでできるけど、今回はssh-agentで設定してあるのでやってない。

Ansibleのpingを打つ

  • pingとは疎通確認のためのAnsibleのテストモジュール
$ ansible-doc ping
less 418
Copyright (C) 1984-2007 Mark Nudelman

less comes with NO WARRANTY, to the extent permitted by law.
For information about the terms of redistribution,
see the file named README in the less distribution.
Homepage: http://www.greenwoodsoftware.com/less
> PING

  A trivial test module, this module always returns `pong' on
  successful contact. It does not make sense in playbooks, but it is
  useful from `/usr/bin/ansible'

EXAMPLES:
# Test 'webservers' status
ansible webservers -m ping
  • モジュールっていうのはAnsibleのAPIの単位みたいなの
  • うまくいけばpongが返ってくる
  • さっそくやってみる。
$ ansible 192.168.59.103 -m ping -i hosts
192.168.59.103 | success >> {
    "changed": false,
    "ping": "pong"
}
  • -iでさっき書いたhostsファイルを指定する。
  • ssh-agentに秘密鍵が設定してある前提なのでしてなければ、--private-keyで指定するかhostsに書いておく
  • inventoryの書き方はけっこう柔軟

playbookを書く

ここまででけっこう好感を持ったのでplaybook(chefのrecipe的なもの)でリモートホスト(CentOS7 on docker)にgitをインストールする、というのを書いてみる。

  • 何はともあれcowsayを入れておく
    • $ brew install cowsay
  • 環境変数をセット
    • $ export ANSIBLE_COW_SELECTION=random
  • 以下の内容を適当な名前のymlファイル(ここではfoo.yml)で保存
---
- hosts: all
  tasks:
    - name: Install git
      sudo: true
      yum: name=git state=latest
$ ansible-playbook foo.yml -i hosts
 ____________
< PLAY [all] >
 ------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||


 _________________
< GATHERING FACTS >
 -----------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||


ok: [192.168.59.103]
 ___________________
< TASK: Install git >
 -------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||


changed: [192.168.59.103]
 ____________
< PLAY RECAP >
 ------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||


192.168.59.103             : ok=2    changed=1    unreachable=0    failed=0
  • ちなみにcowsayを入れなければこんなことにはならない
  • 確認してみる
$ docker exec -it 349 sudo yum list installed | grep git
git.x86_64                      1.8.3.1-4.el7           @base
  • chefと同じく冪等性が確保されているのでもう一発打っても同じ結果が返ってくる
    • 厳密には結果の最後のchangedが0になっている(すでに入っているgitのインストールはされない=変更はされないから)

まとめ

Ansible、chefより取っ付きやすい気がする。ドキュメントひと通り読んでこれやっているんだけど、chefにあるものはだいたいあるっぽい。 これもうちょっと深く行ってみようと思う。