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

AnsibleでRailsが動く環境をDigital Oceanに作る(4)Ansibleはいいね!* 作業メモ的な不完全な記事です。あとでまとめを書くかもしれません。

前回の続きです。

現時点での構成

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ドル分のクーポンがついてくる様子です。

Pocket
LINEで送る

You may also like...