今回やりたいこと
ANSIBLE使ってみたい。
理由:サーバ管理を何でやろうかと思ってた時に、ANSIBLEは、Agentレス(sshだけでOK)でシンプルぽいというのと、前行ったヌーコンで、
ヌーラボさんはANSIBLEでやってると言っていたため興味があった。あと、Chefはちょっとやったことあるが、ラーニングコスト高めと感じていたのと、いまイチ楽になってる気がしていない?。。ので、それに変わる何かを求めてた。
で、その環境はお仕事環境になるべく合わせて実験してみることにする。
お仕事用ですが、もちろん一般的なことしか書いてません。
環境
RHEL6.2(EC2上にVagrantで建てた)
事前準備
もっとシンプルに出来ますが、自分に必要なメモなので。
- ANSIBLE入手するためにEPEL登録
- EPELから依存パッケージを全部DLする
- ANSIBLEインストール
- やっとANSIBLE実験
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 の疎通確認
- カレントディレクトリ
- 環境変数の ANSIBLE_CONFIG or ~/ansible.cfg
- /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と言うらしい)書かなくてもちょっとした運用用途に色々使えそうです。
参考:読んでおいたよさそうなサイト
- 公式ドキュメント:Ansible Documentation
- 構成管理ツール Ansible を使ってみる
- Ansible の Playbook を使ってみる
- Ansible Tutorial
- Ansibleを導入したい人の為のくどきポイント
- 構成管理ツール Ansible について
- Ansibleを使ってリモートでコマンドを実行する
- Ansible導入までの道 by Kazushige TAKEUCHI
- 入門Ansible
- Ansible Advent Calendar 2013
- ansible-doc-ja
- Ansibleの基礎
- ansibleを使ってみる
- 構成管理ツール Ansibleを2週間使ってみて
- 光より速い?Ansibleを試してみる
- windowsでもansibleがしたいのでvagrant経由でdockerを使って二重仮想環境を構築する
まだまだ自分はコレからお勉強ですが。。
すごい良さそう! コレにしたい。
- Chefよりエージェント気にしないので楽だし、使い方もシンプル
- レシピなくても、コマンド拡張で色々便利なことが出来る。
- → たとえば、ANSIBLEのhostsに書いたグループ単位にファイル送るとかバージョン見るとか、ping打つとか。だけでも。
- ドキュメントがChefよりシンプル:Chefは多すぎる。
- 進化は中々早そう(ヌーラボのtypetalk用のコマンド(ANSIBLE→typetalk通知)もあってちょっと驚いた)
- さらに、homeblewコマンドもある。自分Macの環境管理用とかに使えるかもしれない。。
- 拡張は、Python で無くて良い。レシピ(Playbook)もyaml形式で分かりやすい。
- 意外と日本語の情報も出てくる。
- 5000台運用とかの実績? もあるらしいのでお仕事でも使えそう。並列実行するらしいし。
ということで、もうちょっと勉強していきます。