最近 Ansible を勉強しています。
「IT技術者のための現場ノウハウ Ansible 実践ガイド」を読んでいますが現場に近いエンジニアが記述しているので参考になります。
Ansible実践ガイド (impress top gear)
通常 Ansible は「インフラ構成管理ツール」として、複数台の Linux サーバーに対して一気にアップデートしたり、設定を変更するために利用するケースが多いと思いますが、上記の本を読むと「構成管理」に対して以下の2つの定義が説かれています。
Ansible のインストールと初期設定についてはこちらを参考してください。
Ansibleのインストールと初期設定について解説
構成管理とは
そもそも「構成管理」とは「ITサービスを効率よく提供するために必要な資産や成果物を維持管理するプロセス」で以下2つの定義が考えられます。
ITサービスとしての構成管理
ITサービスのライフサイクルにおける、ハードウェアやソフトウェア、仕様書や契約書における変更記録や、成果物を管理するプロセス
オペレーション自動化としての構成管理
最終的にある機器を、意図する状態に収束させるための設定および状態を管理するプロセス
つまりインフラにとってシステムに対して「設定」をすることも重要だし「状態」を把握することも重要なのです。
だからせっかく Ansible という強力なツール(しかも無料)を手に入れたわけですから「yum update」用に使うだけなのはもったいないわけです。(それだけでも十分ですが)
シェルも実行できるし、コマンドも実行できるのでもっといろんな使い方ができます。
Ansible で情報収集をする
素人的な使い方かもしれませんが、Ansible で情報収集もできますし、しかも便利です。
「Serverspec」というツールもありますが、Serverspec はあくまでも「正しいか」「正しくないか」をチェックするためのツールなので、情報収集用のツールとしてはやや使い勝手が悪いです。
「tomcat が特定のバージョンであること」→ 「真」か「偽」かという使い方なら Serverspec は非常に使い勝手がいいです。
しかし単純な情報収集なら Ansible が優れています。
Ansible が情報収集ツールに優れている理由
なぜ Ansible は情報収集ツールとして優れているのでしょうか?
抽象化ができる
OSの違い、バージョンの違いを吸収して Playbook を書くことができます。
これはシェルスクリプトではなかなかできません。
頑張ればできますが、かなり面倒で管理が大変です。(ヒューマンエラーが多発します)
しかし Ansible は抽象化ができているので、例えば「OS」の情報が欲しければ、ディストリビューションを気にせずに様々な情報を取得することができます。
JSON 形式で情報を取得できる
この機能が一番大きいと思います。
Ansible で収集した情報を一旦 JSON ファイルとして出力すれば、後は Python でも PHP でも Ruby でもデータを加工することが簡単にできます。
JSON 形式から欲しい情報を配列に入れることもできますし、多次元配列として情報を格納することも簡単にできますし、必要な情報のみ MySQL などのデータベースに保存することもできます。
とにかく JSON 形式でファイルを出力させることができるので、素材を様々な調理方法で調理することができるようになるわけです。
「なぜ Ansible が情報収集ツールとして優れているか?」私はこの JSON 形式で情報を取得できることが一番大きいと思います。
Ansible で情報を取得して JSON 形式で出力してみる
最初に ansible の設定を確認します。
ディレクトリ:/home/test/ansible
ファイル:hostlist
hostlist には、Ansible で管理するホストのリストを設定します。
[test@cent07 ansible]$ pwd
[all:vars] |
最初に ping で疎通確認
ping で設定を確認します。
[test@cent07 ansible]$ ansible -i hostlist all -m ping |
疎通確認はOKです。
エラーが出た場合の対処
もし以下のようなエラーが出た場合の対処方法です。
[test@cent07 ansible]$ ansible -i hostlist all -m ping |
Ansible の設定ファイル「/etc/ansible/ansible.cfg」を編集します。
[test@cent07 ansible]$ vi /etc/ansible/ansible.cfg # nearly all parameters can be overridden in ansible-playbook
~ 省略 ~
# uncomment this to disable SSH key host checking host_key_checking = False ← 「host_key_checking = False」をコメントアウトします。 |
ansible の結果を JSON で取得するために ansible-playbook で実行する
ansible で取得した情報を JSON 形式で取得するためには ansible
JSON用の「ansible.cfg」を作成します。
[test@cent07 ansible]$ vi json_ansible.cfg [defaults] |
Playbook を作成します。
[test@cent07 ansible]$ vi test-check-os-playbook.yml |
まずは通常の ansible-playbook コマンドです。
これは debug を入れていないため、単純にコマンドを実行しただけになります。
そのため、一見すると意味のない ansible-playbook コマンドになっています。
[test@cent07 ansible]$ ansible-playbook -i hostlist test-check-os-playbook.yml
PLAY [all] *********************************************************************************************
TASK [Check OS] ****************************************************************************************
PLAY [all] *********************************************************************************************
TASK [Check OS] ****************************************************************************************
PLAY [all] *********************************************************************************************
TASK [Check OS] ****************************************************************************************
PLAY RECAP *********************************************************************************************
[test@cent07 ansible]$ |
次に JSON 形式で出力されるようにコンフィグを読み込んで実行してみます。
[test@cent07 ansible]$ ANSIBLE_CONFIG=/home/test/ansible/json_ansible.cfg ansible-playbook -i hostlist test-check-os-playbook.yml |
どうでしょうか。
かなり汎用性がありそうな感じで ansible-playbook が表示されました。
この JSON 形式の出力結果は、どの言語でも綺麗に処理できそうです。
コメント