AnsibleでRailsが動く環境をDigital Oceanに作る(4)Ansibleはいいね!

January 12, 2015

* 作業メモ的な不完全な記事です。あとでまとめを書くかもしれません。

前回の続きです。

現時点での構成

Ansibleで環境を作った感想

と続けてきて、とりあえずRailsが動く環境を整えることは出来ました。と言っても、サーバー側ちゃんと組み立てる知識が欠けているなぁ。今まで個人でやって来たけど、体系的に自分の力にはまだなってい感じがする。ただ、今回Ansibleでベースを作れたので、これを軸に育てていけそう。

Chefの時も同じような感想を得たけど、cookbookが肥大化したり、効率的に管理しようとしすぎて失敗したりコマンド忘れたりとうまくいかなかった。Ansibleは数台のサーバーをいじるには本当にシンプルに記述できるし、理解できる範囲内のディレクトリ構成になるので気持ち的に楽。サーバーサイドはどんどん自動化されて、中身を知らなくても動くようになっていくだろうけれど、ちゃんと理解して色々やっていきたいと思って今回トライしてみました。Ansibleは気楽でドキュメントもわかりやすいし文法も簡単なのでオススメです!

現時点でのplaybookの構成と主な記述

とりあえずRailsを動かすことは出来ました。nginxのunicornとの連携部分は自分できちんと理解できていないので、ansibleのまとめからは除きました。あと、ユーザーだったり、ファイル権限だったりするところが曖昧なので、もっとちゃんとしたplaybookを作っていきたい。恥ずかしいけど、載せておきます。ツッコミ大歓迎。

このプレイブックでできることは、CentOS7.0の基本設定とrbenvでのrubyインストール、nginxの基本設定です。(1)〜(4)の参考リンク、また、その他様々サイトを参考にさせていただきました。ただ、ちょっと根本的な理解が足りないので今後、nginx周りなどはちゃんとしたドキュメント読んでいこうかなと思います。

ちなみに、site.ymlが親のファイルで、rolesの中にあるのがそれぞれまとまった単位です。rolesでまとめられなそうなものをsite.ymlに暫定的に書きだしたのですが、ある程度冪等性が保てればそれぞれ、roleの中に書いてしまっても良いかなと今思っています。

Github

morizotter/ansible-trial

tree

. ├── LICENSE ├── README.md ├── hosts ├── roles │   ├── common │   │   ├── defaults │   │   │   └── main.yml │   │   ├── files │   │   ├── handlers │   │   │   └── main.yml │   │   ├── meta │   │   │   └── main.yml │   │   ├── tasks │   │   │   └── main.yml │   │   ├── templates │   │   │   └── my_iptables.j2 │   │   └── vars │   │   └── main.yml │   ├── nginx │   │   ├── defaults │   │   │   └── main.yml │   │   ├── files │   │   ├── handlers │   │   │   └── main.yml │   │   ├── meta │   │   │   └── main.yml │   │   ├── tasks │   │   │   └── main.yml │   │   ├── templates │   │   │   └── my_nginx.conf.j2 │   │   └── vars │   │   └── main.yml │   └── ruby │   ├── defaults │   │   └── main.yml │   ├── files │   ├── handlers │   │   └── main.yml │   ├── meta │   │   └── main.yml │   ├── tasks │   │   └── main.yml │   ├── templates │   └── vars │   └── main.yml └── site.yml

site.yml

-—

  • hosts: ocean roles:

    • common
    • nginx
    • ruby tasks:
    • name: install memcached yum: name=memcached state=present
    • name: install node.js yum: name=nodejs state=present
    • name: install npm yum: name=npm state=present
    • name: install ImageMagick yum: name=ImageMagick state=present
    • name: install libxml yum: name=libxml2-devel state=present
    • name: install libxslt yum: name=libxslt-devel state=present
    • name: install sqlite-devel yum: name=sqlite-devel state=present

hosts

[ocean] xxx.xxx.xxx.xxx

[ocean:vars] ansible_ssh_user=root

roles/common/tasks/main.yml

-—

  • name: create iptables template: src=my_iptables.j2 dest=/etc/sysconfig/iptables
  • name: update all packages yum: name=* state=latest
  • name: install development tools yum: name=’@development tools’ state=present
  • name: install git yum: name=git state=present
  • name: install gcc yum: name=gcc state=present
  • name: install curl yum: name=curl state=present
  • name: install libyaml-devel yum: name=libyaml-devel state=present
  • name: install openssl yum: name={{ item }} state=present with_items:

    • openssl
    • openssl-devel
  • name: install epel yum: name=epel-release state=present
  • name: update all packages yum: name=* state=latest

roles/common/templates/my_iptables.j2

*filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :RH-Firewall-1-INPUT - [0:0]

-A INPUT -j RH-Firewall-1-INPUT -A FORWARD -j RH-Firewall-1-INPUT -A RH-Firewall-1-INPUT -i lo -j ACCEPT -A RH-Firewall-1-INPUT -p icmp —icmp-type any -j ACCEPT -A RH-Firewall-1-INPUT -p 50 -j ACCEPT -A RH-Firewall-1-INPUT -p 51 -j ACCEPT -A RH-Firewall-1-INPUT -p udp —dport 5353 -d 224.0.0.251 -j ACCEPT -A RH-Firewall-1-INPUT -p udp -m udp —dport 631 -j ACCEPT -A RH-Firewall-1-INPUT -p tcp -m tcp —dport 631 -j ACCEPT -A RH-Firewall-1-INPUT -m state —state ESTABLISHED,RELATED -j ACCEPT

-A RH-Firewall-1-INPUT -j REJECT —reject-with icmp-host-prohibited

COMMIT

roles/nginx/tasks/main.yml

-—

  • name: install nginx rpm from a remote repo yum: name={{ rpm }} state=present
  • name: install nginx yum: name=nginx state=present
  • name: rename nginx conf.default to conf.default.original command: mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.original removes=default.conf
  • name: apply-nginx.conf template: src=my_nginx.conf.j2 dest=/etc/nginx/conf.d/my_nginx.conf
  • name: nginx owner file: path=/etc/nginx owner=nginx group=nginx recurse=yes
  • name: start and enable nginx service: name=nginx state=started enabled=yes notify: restart nginx

roles/nginx/vars/main.yml

-— rpm: http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

roles/ruby/tasks/main.yml

-—

  • name: install ruby yum: name=ruby state=present
  • name: check out rbenv git: repo={{ rbenv.repo }} dest=/usr/local/rbenv accept_hostkey=yes
  • name: add /usr/local/rbenv/bin to $PATH lineinfile: dest=/etc/profile line=export\ PATH=“/usr/local/rbenv/bin:$PATH” regexp=PATH.*rbenv create=yes
  • name: add rbenv init lineinfile: dest=/etc/profile line=eval\ \”$(rbenv\ init\ -)\” regexp=eval.*rbenv create=yes
  • name: checkout ruby-build as rbenv plugin git: repo={{ rubybuild.repo }} dest=/usr/local/rbenv/plugins/ruby-build accept_hostkey=yes
  • name: install ruby-build shell: /usr/local/rbenv/plugins/ruby-build/install.sh
  • name: install libffi-devel for CentOS7.0 yum: name=libffi-devel state=present
  • name: check whether a specific version of ruby is installed or not shell: /usr/local/rbenv/bin/rbenv versions | grep {{ ruby.version }} | tr ’*’ ’ ’ | sed -e ‘s/\s\+//’ | cut -f1 -d’ ’ register: rbenv_version
  • name: install ruby with rbenv command: /usr/local/rbenv/bin/rbenv install {{ ruby.version }} when: rbenv_version.stdout != ”{{ ruby.version }}”
  • name: set ruby version global command: /usr/local/rbenv/bin/rbenv global {{ ruby.version }}
  • name: update gems command: /usr/local/rbenv/bin/rbenv exec gem update —system
  • name: install bundler gem command: /usr/local/rbenv/bin/rbenv exec gem install bundler —no-ri —no-rdoc
  • name: rbenv rehash command: /usr/local/rbenv/bin/rbenv rehash

roles/ruby/vars/main.yml

-— rbenv: repo: git://github.com/sstephenson/rbenv.git rubybuild: repo: git://github.com/sstephenson/ruby-build.git ruby: version: 2.1.5

今後やりたいこと

  • role毎の変数の管理とか、グループごとの変数の管理とかもちゃんとやっていきたい。
  • とりあえずある程度冪等性が保てるので、role毎に同じような処理を書いても良いはず。なのでもっとカスタマイズした設定を書いていきたい。
  • ユーザーやグループの作成や権限をどう管理すれば良いかも学んでいきたい
  • 希望としては、さくっとサーバーが簡単にできるように自分なりのroleをまとめたい。ただ、これに注力するとまた必要じゃないことに時間を割きすぎたりするのでこれはオプションとして。

あ、あと、ちゃんともう一回まとめよう。

Railsとの連携部分で参考にしたもの

Ansibleに関して参考にした本

入門Ansible

Digital Ocean

SSD Cloud Server, VPS Server, Simple Cloud Hosting | DigitalOcean

数十秒で作成したり、削除したりできるサーバーをレンタルできるサービスです。これで、環境を作ったり壊したりしてました。こちらのクリックでクーポン付き申し込みもできます。10ドル分のクーポンがついてくる様子です。


Profile picture

Written by morizotter who lives and works in Tokyo building useful things. You should follow them on Twitter