読者です 読者をやめる 読者になる 読者になる

のんびりSEの議事録

プログラミング系のポストからアプリに関してのポストなどをしていきます。まれにアニメ・マンガなど

【ansible】ansibleでrails + nginx + postgresqlを構築してみた

ansibleのplaybook練習用でrails(rbenvインストール) + nginx + postgresqlの環境を構築してた。 ansibleはyaml形式で書けるので、これからプロビジョニングツールを始めようという人にはオススメです。 

環境

手順

ansible外での準備作業

  1. Railsアプリの準備 + unicornの設定

以下ansible作業

  1. postgresqlのインストール
  2. postgresqlユーザ作成
  3. ruby環境依存パッケージのインストール
  4. rbenv + ruby-buildのインストール
  5. Railsアプリのチェックアウト
  6. bundle install
  7. rake db:create && rake db:migrate
  8. unicorn起動
  9. nginxインストール
  10. nginx.conf編集
  11. 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

  • rbenv + ruby-buildをシステムワイドにインストール
  • 依存パッケージ群
    • gcc
    • gcc-c++
    • openssl-devel
    • libyaml-devel
    • readline-devel
    • zlib-devel
    • libffi-devel
    • libxml2-devel
    • libxslt-devel
  • production環境のため、DB接続情報、secret_keyを環境変数にセット

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

  • box(chef/centos6.5)の関係上rpmからインストール
  • unicorn設定用confをtemplatesに格納し、conf.dに配置

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関連で詰まることが多かったので、各種設定、認証等、改めて勉強になった
以下、リポジトリを公開してます

github.com