Ansibleを利用してRailsが動くVagrantfileを作成する
TL;DR
Ansibleを利用したからって複雑な処理がシンプルになるわけではない
1st
対象のサーバに何か設定をする必要はないので
このように少量のコードでやりたいことが実現できる。
['-']% ['-']% cat hosts ansible.example.com ['-']% ['-']% ansible -m ping -i hosts ansible.example.com ansible.example.com | success >> { "changed": false, "ping": "pong" } ['-']% ['-']% cat playbook.yml - hosts: all tasks: - name: Install dstat yum: name=dstat ['-']% ['-']% ['-']% ansible-playbook -i hosts playbook.yml PLAY [all] ******************************************************************** GATHERING FACTS *************************************************************** ok: [ansible.example.com] TASK: [Install dstat] ********************************************************* ok: [ansible.example.com] PLAY RECAP ******************************************************************** ansible.example.com : ok=2 changed=0 unreachable=0 failed=0 ['-']%
Inventoryファイル(上記でいうとhostsファイル)の動的更新
各社独自で工夫してるんだろうな...
Role
1.2から使える機能とのこと、詳しくは
Playbook Roles and Include Statementsを読んでもらいたい.
Chefを利用している人は馴染みがあるというか
そういう構成なのか、とすんなりと理解できると思う.
Chefでいうcookbookの構成に近いというか
Chefを意識したつくりになっている気がする.
ある程度の規模になったらRoleを利用しないとつらいと思う.
Railsの環境をAsibleで用意してみる
https://github.com/kenjiskywalker/ansible
['-']% tree . . ├── dev.yml └── roles ├── mysql │ └── tasks │ └── main.yml ├── rails │ └── tasks │ └── main.yml └── ruby ├── files ├── handlers ├── tasks │ ├── main.yml │ ├── rbenv.yml │ ├── ruby-build.yml │ └── ruby-install.yml └── templates └── rbenv.sh.j2 10 directories, 8 files
軽く書いてみて気がついたこと
command
がコマンドだけでshell
がパイプも使えるとか気が付かなくてハマったohai
がいないのでapt
やyum
など、ディストリビューションのパッケージ管理ツールをpackage
みたいにラッピングしてくれないregister
の概念が面白かった
- name: check Rails installed shell: rails -v | cut -f 2 -d ' ' register: rails_installed ignore_errors: yes tags: - ruby - ruby:install - install - name: gem install rails -v {{ rails_version }} command: gem install rails -v {{ rails_version }} when: rails_installed.stdout != rails_version tags: - rails - install
のように書くと、rails -v | cut -f 2 -d ' '
のコマンドの実行結果を
rails_installed
という変数に格納し、その変数を利用して
条件分岐などを行うことができる.
Vagrantfile
VAGRANTFILE_API_VERSION = "2" Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| config.vm.box = "centos65" config.vm.box_url = "https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box" config.vm.define :"dev" do |dev| dev.vm.network :private_network, ip: '192.168.77.11' end config.vm.provision "ansible" do |ansible| ansible.playbook = "./ansible/dev.yml" end end
このようにVagrantのprovisonerにansibleを利用することが可能です。
READMEに書いてあるように、vagrant up
を発行するとdev.ymlを利用した
ansibleが実行されます.
$ vagrant provision
とコマンドを発行することで、実行中のVagrantのインスタンスに対して
プロビジョニングすることが可能です。
Chefの闇はAnsibleで光を得るのか
- 構成や管理方法が複雑であれば何を使ってもあまり変わらない
- 新しく覚える時間が許されるなら両方試してみれば良いのでは
- 上から下に実行されるだけ(ruby_blockとか使わなくていい)のは良い
個人的感想
- Ansible縛りでなければItamae試したかった
- まだちょっとしかさわってないので知見があればシェアさせて頂きます