2013/10/22

NODE-Setagaya#5 やってきたんでまとめ&Ansible(Playbook)補足


先週末にNODE-Setagaya第5回目やって来ました!
今回は私の持ち込み企画だったのでまとめ&ちょっと説明しきれなかったところを補足しておきます。



当日の内容


ディスカッションを意識するNODE-Setagayaですが、今回はみんなでハンズオン形式。

最近は私がPythonをひたすら勉強していることと、
Provisioning, Orchestrationで最近結構話題があがるAnsibleで何かやりたいなーと思い、
今回のテーマにしました。



自動構築というものを参加者みんなで「体感」したいなーというのが目的だったので
タイトルにはOrchestrationを前に出しましたがこれで合っているんでしょうかね。。
興味だけで突っ走ったのでこのへんノリで進めてしまった感が否めないです。
(Ansible触り始めてまだ10日ちょっと)

正直この手のものはAWSだったり、
どこかのクラウド環境を使わせてもらえるとスムーズにいけたかもしれませんが
さすがにそこまでできず、VirtualBoxのテンプレートを配布する形で何とか実現できました。

環境構築も、やはりみんながスムーズにいけるというわけでもなく、
スライドに説明を載せてはいたものの、
環境が整った状態のUbuntuテンプレート用意は用意しておいて本当に良かったです。

本編で扱いきれなかった内容


スライドを見ても、本当に基本的なさわりの部分の扱いのみとなっておりますが、
Playbookに関して説明が足りてないのでちょっとこちらで補足したいと思います。

スライド最後に「では実際にPlaybookを書いてみよう!」とありますが、
実際に扱ったお題として

「CentOS6.4にDokuwikiをデプロイしてみる」

をやって見ました。
Dokuwikiを選んだ理由としては、調度良い難易度のPHPアプリを考えて真っ先に思いついた感じです。
最初はWordPressなんかも思いつきましたが思いの外手順を落としこむのがめんどくさそうだったので断念。。

そんなわけで、実際にお題通りに作成したPlaybookをもとに、
軽くPlaybookの書き方の基本をおさらいしてみます。

Playbookの基本的な書き方


まずは実際に出来上がったものを

---
- hosts: node-setagaya5
  user : root
  handlers : 
    - name    : Start Apache
      service : name=httpd state=started 

    - name    : change dokuwiki permission
      command : chmod -R 777 /var/www/html/dokuwiki

  tasks :
    - name : Stop iptables
      service  : name=iptables state=stopped 
    - command  : /sbin/chkconfig iptables off

    - name : Apache & PHP Install
      yum  : name=$item state=installed
      with_items:
              - httpd
              - php
      notify: Start Apache

    - name : Put Dokuwiki
      shell : curl -Ls http://download.dokuwiki.org/out/dokuwiki-7db05240ae771b06f73ccb1a74961947.tgz | tar zxf - -C /var/www/html
      notify : change dokuwiki permission

またhostsファイルの内容は以下のような感じで作ってあるとします。

[localnet]
node-setagaya5 ansible_ssh_host=192.0.2.10

このPlaybookの内容の説明を

  • hosts, user

    ここはそれぞれSSHログイン先のホスト名とユーザー名です。hostsの方は特にhostsファイルで定義してある必要があります。
    また、今回はrootで直接入れちゃう練習用環境なのでいいのですが、実際管理者権限が必要な場合はsudo可能なユーザーで
     
      sudo : yes
       
      
    とすることがほとんどかと。

  • tasks
    handlersがありますが先にこちらの説明を。
    こちらは実際に行う処理を定義しておく場所です。(YAMLの言い回しがよくわからない。。)

    YAMLの仕様的にハッシュの配列という扱いのようですが、
    ざっくりと解釈すると、

     
      - name : hogehoge1
       {{ module_name }} : {{ String }}
    
      - name : hogehoge2
       {{ module_name }} : {{ String }}
        
      

    といった具合に、ansibleのモジュールを指定して、
    処理内容を定義していけばいいようです。
    具体的なモジュールについては公式ドキュメントがあります → Ansible Modules | AnsibleWorks
    ぱっと見でもかなり種類が豊富で、個人的にvirtがあったことには驚きました。

    今回のPlaybookで使っているのは以下のモジュール

    • service

      文字通りサービスの制御を行います。
      実際、serviceコマンドを使う感覚で指定できます。
      上記の例だと、iptablesを止めたりApacheの起動なんかをやってますね。


    • command

      こちらも文字通りですが、純粋にシェルコマンドを実行するモジュールです。
      文字列でコマンドを指定すれば実際に実行されます。
      chdir変数で実行ディレクトリの指定ができたりもします。
      ただし、">", "<", "|", "&" を使うことはできません。


    • yum

      RHEL系のOSを管理したことがある人なら名前で大体予想がつくかと思いますが、
      yumコマンドによるパッケージの管理を行うことができます。
      nameでパッケージ名、enablerepoで有効にするリポジトリの指定、
      stateで新規インストールやアップデート、削除などが行えます。
      大体コマンドのオプションのイメージまんまですね。
      nameで複数のパッケージを指定することができないので、(知らないだけかも、、)
      "with_items" を組み合わせてやるといい感じです。

      ちなみに今回は出て来ませんが、aptモジュールもあるようです。


    • shell

      こちらもcommand同様に、純粋にシェルコマンドを実行するモジュールです。
      commandとの細かい使い分けはまだ良くわかっていなかったりするのですが、
      こちらでは ">", "<", "|", "&" を使うことができます。
      また、オプションがcommandよりも少ないようです。



    また、途中でwith_itemsなるものが出てきていますが、ネストしたリストを繰り返し変数"item"に渡せれて実行されます。
    軽くググってみると配列を渡したりすることもできるようですね。 → Michael DeHaan : Use 'with_items' with complex arguments to simplify handler logic

  • handlers

    tasksと同様に処理内容を定義していきますが、
    こちらはtaskの実行によってなんらかの変化が発生した場合のみ実行したい処理なんかを定義します。

    handlersで定義したタスクは
    tasks側にあるnotifyでnameを指定することによって呼び出せます。
    notifyに記載されたhandlerはtask実行によって、状態に変更された場合のみに実行されます。

    今回の場合は

    • Apache,PHPインストール完了後にApacheの起動
    • Dokuwikiのダウンロードが成功した場合にPermissionの変更を行う。
    といった感じの使い方をしています。


Playbookの書き方としては以上です。
他にもincludeができたりroleがあったりするようで、全く網羅できてませんが
これだけでも簡単な作業は結構自動化できそうな感じはあります。

実際にPlaybookの処理を実行する


先ほどのPlaybookを dokuwiki-install.yml, hostsファイルを deplay_hosts とすると、
作業対象のホストにSSHログイン可能なAnsible環境が整っているところから
以下のような感じで実行できます。

 
ansible-playbook dokuwiki-install.yml -i deplay_hosts -k
 

あとがき的な


洗練されたノウハウの学習と言うよりは本当にさわりの内容ではありましたが
私自身、実際に Ansible を触る機会を作ることができて良かったです。

参加のメンバーは今回私を含め3名とちょっと少人数でしたが
なにか持ち帰っていただけたら何よりです。

今回ハンズオンのセッティングを初めて行いましたが
用意していたCentOS6.4のイメージの初期設定をサボってブラウザでDokuwikiの画面にアクセスできずに
その場でドハマリしてしまったり,, (iptablesが悪さしてた。。)
これまで参加させていただいていたハンズオンはホントにありがたいなと身をもって思い知らされました。
事前周知の仕方とか結構改善点はありそうな感じがしました。


次回はまた企画・提案寄りなディスカッションメインとなりそうですが、
まだまだ地道にNODE-Setagaya進めて行きますよー




参考記事

内容がわかりやすく非常に参考になりました。
ありがとうございます。