さくらVPSセットアップ用のシェルスクリプトを今話題の「Ansible」で書き直してみた

「Chef! Chef!」と叫ばれる昨今、そのChefに挫折した皆様、いかがお過ごしでしょうか?

Chefに挫折中のid:k1LoWです。

Ansibleいいよ。Ansible。

Chefに挫折したからといってプロビジョニングツールへの憧れは消えるわけもなく、時間を見つけてはいろいろいじっていた時、

同僚からの「Ansibleというツールが良さげらしい」という情報をそのまま鵜呑みにし、PHP Matsuri 2013を通じて使ってみて今に至っています。

Ansibleいいよ。Ansible

AnsibleはPython製のプロビジョニングツールです。ChefやPuppetと同じ領域のツールですね。

ちなみに、呼び方は、日本語英語的に「あんしぼぉ」です。「あんじぼぉ」でも「あんそぉぼぉ」でもありません。PHP Matsuri 2013でVagrantのMitchell Hashimotoさんに直接聞けたので間違いありません(自分の耳が正しければ)。

なお、ひらがな書きなのはPHP Matsuri 2013に参加したからです。

Ansibleの特徴

Ansibleは、Chefのような「サーバ-クライアント型」ではなく、Capistranoのような「Push型(sshでがんばる型)」のツールです。多分これがもっとも大きな特徴ではないでしょうか?

あと、Ansibleの個人的に特筆すべき特徴として、以下のようなものがあります。

デプロイ環境にアプリケーションに不要なものを(ほとんど)入れる必要がない

「本番環境に不要なものを入れたらダメ」「いや、不要じゃないです!これこれこういう理由で・・・」と説明する必要がないですね。

「ほとんど」と書いている理由は、AnsibleのModuleによってはPythonのライブラリを入れる必要があったりするからです。

そもそもデプロイ環境に事前にログインする必要がない(状態にまで持っていける)

--ask-passオプションとか--ask-sudo-passオプションとか、うれしいですよねー。

Rubyがいらない(Pythonはいるけど)

そういえばCakePHPに傾倒したのも当時のRailsに挫折したからでした。

自分はRubyと相性が悪いのかもしれないです。

CentOS環境にもセットアップしやすい

yumっていいですよねー。

そして、

ちょうど先日7月19日に開催された「はじめるDevOps」でのnaoyaさんの資料をご覧ください

....Ansible..だと..!?

と、勝手に盛り上がっています。来るかもしれませんよ?(特にChef挫折組に)

Ansibleは実際どんな感じなのか?

というわけで、簡単なサンプル(というか個人的な練習)として、

2010年から細々とメンテして使ってきているさくらVPSの初期セットアップ用のシェルスクリプトを、AnsibleのPlaybookとして書き換えてみました。

k1LoW/sakuravps

shell/がもともとのシェルスクリプトansible/がAnsibleのPlaybookです。ディレクトリはフラットになっています。

ファイル名は微妙に対応関係にありません。

想定している使い方はREADME.mdに書いています。

冪等性はどこいった?

Ansible全体は冪等性を保つように作られています。が、当然それを外れることができます。

action: command yum -y updateとかはちょっとまずいコードです。まあ、もともとのコードの意義が初期セットアップだったので。。。^^

なぜcopyやtemplateを使わない?

そういうあなたはAnsibleについてよくご存知のようです。

本来、

- name: config apache
  action: |
     raw cat <<EOF  > /etc/httpd/conf.d/virtualhosts.conf
     NameVirtualHost *:80
     NameVirtualHost *:443

     <VirtualHost *:80>
        DocumentRoot /var/www/html
        <Directory "/var/www/html/">
           Options -Indexes FollowSymLinks
           AllowOverride All
           DirectoryIndex index.html index.htm index.php
        </Directory>
     </VirtualHost>
     EOF

みたいな設定は

- name: config apache
  action: file src=/local/file/to/virtualhosts.conf dest=/etc/httpd/conf.d/virtualhosts.conf

と書けます。こちらが推奨される書き方だと思います(当然といえば当然ですが、ファイルの転送やテンプレートファイルを用いた書き変えが可能です)。

ではなぜ、わざわざ1Playbookを1ファイルで書いているのか?

このツールための布石です(どこまで1ファイルでできるか実験)。

まとめ

Ansibleいいよ。Ansible。

でもChefも使いこなしたい!あと、挫折癖をなくしたい!