雑文発散

«前の日記(2016-01-01) 最新 次の日記(2016-01-03)» 編集
過去の日記

2016-01-02 [長年日記]

[Vagrant][Ansible] そろそろ Ansible も知らないとダメなのかと思って、Vagrant と組み合わせて Crowi の開発環境を作ってみた

年末に Crowi への pull request を出したんだけど、それを実装する前には手元に Crowi の開発環境が無かった。年末に新規購入した MacBook Pro には Crowi の環境を作っていなかったのだ。

以前にそうしていたように、Mac 上に MongoDB やら Node.js やらをインストールして環境構築しても良かったんだけど、どうせなら「捨てられる開発環境」であり、「再構築できる開発環境」を用意したいなと思って、少しいじったことがある Vagrant と全くいじったことがない Ansible を組み合わせて環境構築をしてみた。

少しずつ試してみて、なんとなく出来上がったのは、Vagrantfile ひとつと playbook.yml がひとつのシンプルな内容。というか、このくらいしかできなかった。これで、VM を用意して、nvm をインストールして、指定バージョンの node をインストールして、Crowi をインストールして、npm install まで実行する。

Vagrantfile はこんな感じ。

Vagrant.configure(2) do |config|
  config.ssh.forward_agent = true

  config.vm.box = "ubuntu/trusty64"
  config.vm.network 'forwarded_port', guest: 3000, host: 8080
  Config.vm.provision "ansible" do |ansible|
    ansible.playbook = "playbook.yml"
    ansible.verbose = "vv"
    ansible.raw_ssh_args = ['-o ForwardAgent=yes', '-o ControlMaster=auto', '-o ControlPersist=1800s']
  end
end

config.vm.network 'forwarded_port', guest: 3000, host: 8080 を設定しておくと、Mac 上のブラウザで http://localhost:8080/ を参照すると Crowi の画面が見られる。

ansible.raw_ssh_args でいろいろ設定しているのは、Crowi の初回の npm install でコケてしまっていたので ControlPersist の時間をデフォルトよりも伸ばしてみている。

playbook.yml はこっち。

# Crowi installer for Vagrant
- hosts: all
  remote_user: vagrant
  vars:
    nvm_version: v0.29.0
    node_version: v0.10.41
    repo_dir: /vagrant/crowi
    branch: master
  tasks:
    - name: apt-get update
      sudo: yes
      apt: update_cache=yes
    - name: install packages
      sudo: yes
      apt: name={{ item }} install_recommends=no
      with_items:
        - curl
        - g++
        - git
        - mongodb
    - name: setup nvm using 'raw' module. this is dangerous !!
      raw: /usr/bin/curl -o- https://raw.githubusercontent.com/creationix/nvm/{{ nvm_version }}/install.sh | bash
    - name: install nodejs
      raw: . ~/.nvm/nvm.sh && nvm install {{ node_version }} && nvm alias default {{ node_version }}
    - git: repo=ssh://git@github.com/crowi/crowi.git
           dest={{ repo_dir }}
           version={{ branch }}
           accept_hostkey=yes
    - raw: . ~/.nvm/nvm.sh && cd {{ repo_dir }} && export CI=true && npm install

nvm をインストールしているところでは、curl で直接 URL を叩いていて、ちょっとイマイチ感。もっとうまく書く方法がありそうだったけど、今回はこれでお茶を濁した。

あと、npm install の前に CI=true を付けるのがミソなようだ。これを入れておかないと、bower の初回インストール(npm install の中で bower のインストールも行っている)の時に「利用情報をリモートに送信しますか?」みたいな質問が出てきて、それに手動で yes / no を入力して答える必要がある。

最初は yes コマンドを利用して回避しようと思ったけど、うまく行かずに悩んでいたら、この方法を見つけてこちらで回避した。この動作の詳細は、bower のドキュメント「Running on a continuous integration server」に書かれている。

これで vagrant up をすると、/vagrant/crowi に Crowi が起動可能な状態でインストールされているはず。もし途中でコケたら vagrant provision を実行するとうまく行くかもしれない。

インストールがうまくいったら vagrant ssh でログインして、Crowi を起動する。

$ cd /vagrant/ssh
$ node app.js

この状態で、Mac のブラウザで http://localhost:8080/ へアクセスすれば、Crowi の初期画面が表示されるはず。

Crowi

上記の Vagrantfile などは GitHub へ上げている。

あー、でも、node のバージョンとか変えなきゃだな。最新版の Crowi は 0.10.x から 4.2.x へアップグレードしているので。