【ansible】ansibleでrails + nginx + postgresqlを構築してみた
ansibleのplaybook練習用でrails(rbenvインストール) + nginx + postgresqlの環境を構築してた。 ansibleはyaml形式で書けるので、これからプロビジョニングツールを始めようという人にはオススメです。
環境
- ruby 2.2.1
- nginx
- postgresql
手順
ansible外での準備作業
以下ansible作業
- postgresqlのインストール
- postgresqlユーザ作成
- ruby環境依存パッケージのインストール
- rbenv + ruby-buildのインストール
- Railsアプリのチェックアウト
- bundle install
- rake db:create && rake db:migrate
- unicorn起動
- nginxインストール
- nginx.conf編集
- nginx起動
ポイント
Postgresql
- ansibleのpostgresqlモジュールを使用するため、'python-psycopg2'をインストールする
- db:migrateを行なうため、postgresql認証設定を変更する(trust認証)
- postgresユーザを使用し、DBユーザを作成するため、sudoresでpostgresユーザをsudo可能にする
role
--- - name: install postgresql yum: name={{ item }} state=latest with_items: - postgresql-server - postgresql-devel - postgresql-contrib - python-psycopg2 - libselinux-python - name: postgresql initdb shell: service postgresql initdb - name: backup pg_hba.conf shell: mv /var/lib/pgsql/data/pg_hba.conf /var/lib/pgsql/data/pg_hba.conf.default - name: pg_hba.conf setting copy: src=pg_hba.conf dest=/var/lib/pgsql/data/pg_hba.conf owner=postgres group=postgres mode=0600 - name: start postgresql service: name=postgresql state=started enabled=yes - name: postgres user sudores lineinfile: dest: /etc/sudoers.d/postgres owner: root group: root mode: 0440 line: "%vagrant ALL=(postgres) NOPASSWD: ALL" state: present create: yes validate: "visudo -cf %s" - name: create user user: name={{ dbuser }} password={{ dbpass }} - name: create postgres user postgresql_user: name: "{{ dbuser }}" password: "{{ dbpass }}" state: present login_user: postgres role_attr_flags: CREATEDB,LOGIN sudo_user: postgres sudo: yes
Ruby
role
--- - name: install git yum: name=git state=installed - name: install rbenv git: repo=https://github.com/sstephenson/rbenv.git dest={{ repos_dir }} version={{ branch }} accept_hostkey=yes # sudo: no # - name: setup rbenv # copy: src=.bashrc dest=~/.bashrc owner=vagrant group=vagrant mode=0644 # sudo: no - name: setup rbenv copy: src=rbenv.sh dest=/etc/profile.d - name: install ruby-build git: repo=https://github.com/sstephenson/ruby-build.git dest={{ repos_dir }}/plugins/ruby-build version={{ branch }} accept_hostkey=yes # sudo: no - name: install ruby dependencies yum: name={{ item }} state=latest with_items: - gcc - gcc-c++ - openssl-devel - libyaml-devel - readline-devel - zlib-devel - libffi-devel - libxml2-devel - libxslt-devel - name: install ruby shell: /bin/bash -lc "rbenv install {{ ruby_version }} && rbenv rehash && rbenv global {{ ruby_version }}" # sudo: no - name: checkout rails project git: repo=https://github.com/tatsu07/sample-rails-app.git dest={{ rails_root }} version={{ branch }} accept_hostkey=yes - name: gem bundler install shell: /bin/bash -lc "gem install bundler" - name: bundle install shell: /bin/bash -lc "bundle config build.nokogiri --use-system-libraries && bundle install --without test development" args: chdir: "{{ rails_root }}" - name: rake db:migrate shell: /bin/bash -lc " export SAMPLE_RAILS_APP_DATABASE_USERNAME={{ dbuser }} && export SAMPLE_RAILS_APP_DATABASE_PASSWORD={{ dbpass }} && bundle exec rake db:create RAILS_ENV=production && bundle exec rake db:migrate RAILS_ENV=production && bundle exec rake assets:precompile" args: chdir: "{{ rails_root }}" - name: unicorn start shell: /bin/bash -lc " export SAMPLE_RAILS_APP_DATABASE_USERNAME={{ dbuser }} && export SAMPLE_RAILS_APP_DATABASE_PASSWORD={{ dbpass }} && export SECRET_KEY_BASE=`{{ repos_dir }}/shims/bundle exec rake secret` && bundle exec unicorn_rails -c config/unicorn.conf -E production -D" args: chdir: "{{ rails_root }}"
nginx
role
--- - name: nginx rpm package attach yum: name=http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm state=present - name: install nginx yum: name=nginx state=latest - name: default nginx conf backup shell: mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bak - name: setting unicorn conf template: src=unicorn-app.nginx.j2 dest=/etc/nginx/conf.d/unicorn-app.conf owner=root group=root mode=0644 - name: start nginx service: name=nginx state=started enabled=yes
template
j2拡張子で保存
upstream unicorn { server unix:{{ unicorn_sock }}; } server { listen 80; server_name localhost; access_log /var/log/nginx/rails_access.log; error_log /var/log/nginx/rails_error.log; root {{ rails_root }}; error_page 404 /404.html; error_page 500 502 503 504 /50x.html; try_files $uri/index.html $uri @unicorn; location ~ ^/assets/(.*) { alias {{ rails_root }}/public/assets/$1; } location @unicorn { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_pass http://unicorn; } }
課題
- rubyのインストールとbundle installが遅い...
- postgresqlでtrust認証はセキュリティ的にないかと...
まとめ
一通りのアプリ構築のため、パッケージインストールからを行うことで、だいたい書き方を覚えられるので、こういったプロビジョニングツールでもただコピペするんじゃなくて一から作成することで力になるなと
結構postgresql関連で詰まることが多かったので、各種設定、認証等、改めて勉強になった
以下、リポジトリを公開してます