humangas's blog

自分用のメモなので雑です。

RHEL6.2にANSIBLEを導入する

今回やりたいこと

ANSIBLE使ってみたい。
理由:サーバ管理を何でやろうかと思ってた時に、ANSIBLEは、Agentレス(sshだけでOK)でシンプルぽいというのと、前行ったヌーコンで、 ヌーラボさんはANSIBLEでやってると言っていたため興味があった。あと、Chefはちょっとやったことあるが、ラーニングコスト高めと感じていたのと、いまイチ楽になってる気がしていない?。。ので、それに変わる何かを求めてた。

で、その環境はお仕事環境になるべく合わせて実験してみることにする。
お仕事用ですが、もちろん一般的なことしか書いてません。

環境

RHEL6.2(EC2上にVagrantで建てた

事前準備

もっとシンプルに出来ますが、自分に必要なメモなので。

ANSIBLEインストール

前述リンクの事前準備で持ってきた依存関係含むRPMパッケージ群を同じディレクトリに配置しておいて、丸ごとインスコするだけですね。

# rpm -ivh /tmp/ansible/*

ついでなので、そのDLしたパッケージをSCPするコマンドも書いておきます。

$ scp -r ~/Downloads/ansible root@test-server:/tmp/ansible/

r オプションを使うのがポイントですね。r つけるとディレクトリ毎送れます。 scp は、scp [送り元] [送り先] と書きます。そらで書けるようにしとくと何かと便利です。

忘れてましたが、インストールにはPython2.6以上が必要です。ですが、今回試したRHEL6.2にはデフォで入っていたので省略しています。
以下で確認できます。

# python --version
Python 2.6.6

簡単な検証をしてみる

今回は、EC2上に建てた2台のサーバ間でPING・cat /etc/redhat-release を打つ実験です。

秘密鍵の設定

その前にEC2上のサーバなので、デフォルトだと鍵認証です。
関係ある構成だけ言うと、どちらのサーバも同じキーペアを使ってる。命令出す側のサーバだけANSIBLE導入済み。当然、2台はSSH通信が許可されてる。こんなもんです。
なので、ローカルPC(Mac)にあった秘密鍵を命令を出す側のサーバに置いてあげます。

$ scp ~/keys/test-keys.pem root@test-server:/root/.ssh/id_rsa
$ cd ~/vagrant/test-server
$ vagrant ssh
[root@ip-XXX-XXX-XXX-XXX ~]# chmod 600 /root/.ssh/id_rsa

ANSIBLE動作検証

ANSIBLEの動作検証自体は、以下を参考にさせて頂きました。今回はセットアップメインなので、基本動作のみです。

事前準備:hosts

ANSIBLEは、hostsで設定されてるホストにのみアクションするようです。
で、先にそれを定義しておきます。定義するのは自分と操作テストするサーバの2台。

# echo "127.0.0.1" > /root/ansible/hosts
# echo "XXX.XXX.XXX.XXX" > /root/ansible/hosts

このhostsというファイルは、ANSIBLEのコマンド実行時に指定します。 ただし、ansible.cfgというファイルにhostsファイルへのパスを定義しておけば省略できるようです。

ということで、定義しますが、まずはインストール時に用意されているそのファイルをコピーして編集することにします。

# cp -p /etc/ansible/ansible.cfg .
# vi ansible.cfg

・・・ヘッダ省略・・・

[defaults]

# some basic default values...

#hostfile       = /etc/ansible/hosts
hostfile       = /root/ansible/hosts
library        = /usr/share/ansible
remote_tmp     = $HOME/.ansible/tmp

・・・以下略・・・

ANSIBLEは、以下の順序で環境設定ファイルであるansible.cfgをロードするようです。なので、上記手順だとコピーしたところをansibleコマンドの発行元(カレントディレクトリ)にしようとしています。
参考情報元:3. Ansible の疎通確認

  1. カレントディレクトリ
  2. 環境変数の ANSIBLE_CONFIG or ~/ansible.cfg
  3. /etc/ansible/ansible.cfg

pingを打ってみる

おぉ。。分かりやすい。もちろん、hostsファイルを指定してもOKです。ansible all -i hosts -m ping

# ansible all -m ping
127.0.0.1 | success >> {
    "changed": false,
    "ping": "pong"
}

XXX.XXX.XXX.XXX | success >> {
    "changed": false,
    "ping": "pong"
}
  • all でhostsの全体がターゲット
  • -i でhostsファイルパスを指定
  • -m でANSIBLEの内蔵コマンドを指定

という感じです。-m で使えるコマンド群に何があるかは、Webマニュアルか以下で参照することが出来ます。

# ansible-doc -l
acl                  Sets and retrieves file ACL information.
add_host             add a host (and alternatively a group) to the ansible-playbo
airbrake_deployment  Notify airbrake about app deployments
alternatives         Manages alternative programs for common commands
apache2_module       enables/disables a module of the Apache2 webserver
apt                  Manages apt-packages
apt_key              Add or remove an apt key
apt_repository       Add and remove APT repositores

・・・略・・・

また、個別のコマンドについて調べたい時は以下です(ansibleのyumコマンドを調べているところ)。

# ansible-doc yum
> YUM

  Installs, upgrade, removes, and lists packages and groups with the
  `yum' package manager.

Options (= is mandatory):

- conf_file
        The remote yum configuration file to use for the transaction.

- disable_gpg_check
        Whether to disable the GPG checking of signatures of packages
        being installed. Has an effect only if state is `present' or
        `latest'. (Choices: yes, no)

・・・略・・・

OSコマンドを実行してみる

出た出た。最終的には、何でも出来るということか。。。それにしてもシンプル。

# ansible testserver -a "cat /etc/redhat-release"
XXX.XXX.XXX.XXX | success | rc=0 >>
Red Hat Enterprise Linux Server release 6.2 (Santiago)
  • -a でOSコマンドを打つことができます。
  • testserver: 実はhostsファイルをグルーピングし、グループだけコマンド実行なんていうことができます。以下のようにhostsを書きます。
[local]
127.0.0.1
[testserver]
XXX.XXX.XXX.XXX

今回は、ココまで。
シンプルで、レシピ(ANSIBLEでは、Playbookと言うらしい)書かなくてもちょっとした運用用途に色々使えそうです。

参考:読んでおいたよさそうなサイト

まだまだ自分はコレからお勉強ですが。。

すごい良さそう! コレにしたい。

  • Chefよりエージェント気にしないので楽だし、使い方もシンプル
  • レシピなくても、コマンド拡張で色々便利なことが出来る。
  • → たとえば、ANSIBLEのhostsに書いたグループ単位にファイル送るとかバージョン見るとか、ping打つとか。だけでも。
  • ドキュメントがChefよりシンプル:Chefは多すぎる。
  • 進化は中々早そう(ヌーラボのtypetalk用のコマンド(ANSIBLE→typetalk通知)もあってちょっと驚いた)
  • さらに、homeblewコマンドもある。自分Macの環境管理用とかに使えるかもしれない。。
  • 拡張は、Python で無くて良い。レシピ(Playbook)もyaml形式で分かりやすい。
  • 意外と日本語の情報も出てくる。
  • 5000台運用とかの実績? もあるらしいのでお仕事でも使えそう。並列実行するらしいし。

ということで、もうちょっと勉強していきます。