ツナワタリマイライフ

日常ネタから技術ネタ、音楽ネタまで何でも書きます。

Vagrant + AnsibleでrbenvとCapistranoとServerspecをProvision

はじめに

Ubuntuちゃんの上のVMをansibleでいじり倒す編。

take-she12.hatenablog.com

take-she12.hatenablog.com

Vagrantfile

前回の記事で書いた、hatenabot(pythonサーバ)のまんま使いまわせますね。

Vagrant.configure(2) do |config|
  config.vm.box = "CentOS72"
  config.vm.hostname = "capistrano"
  config.vm.network "private_network", ip: "192.168.100.101"
  config.vm.provision "shell", inline: <<-SHELL
    systemctl restart network.service
    SHELL
  config.vm.provision "ansible" do |ansible|
    ansible.playbook = "provisioning/site.yaml"
    ansible.inventory_path = "provisioning/hosts"
    ansible.limit = 'all'
  end
end

IPとホスト名を変えただけ。

take@lenovo:~/work/vagrant/capistrano$ cat provisioning/hosts 
[vagrants]
192.168.100.101

playbook

rbenvを入れて、ruby2.3を選択したのち、gem installでsshkit、capistrano、serverspecをいれたい。

正直いつもなんとなくrbenvいれるけど普段使っててバージョン切り替えよう!なんてシーンに出会ったことがない。。。が、いれる。

まずは手動でいれつつ、playbookを足していく。以下のサイトが参考になる。

ruby 2.3.1をCentOS7に導入する。 - Qiita

ひっかかったのはrbenv install 2.3.1の部分で、/home/vagrnt/.rbenv配下の所有者がrootになってたせいでrbenvユーザでは作れなかった。とりあえずこのディレクトリの所有者をvagrantユーザにして回避。

あとは依存パッケージが足りなかったので追加。openssl-devel、readline-devel、zlib-devel。

だいぶハマりましたが完成したのが以下。

take@lenovo:~/work/vagrant/capistrano$ cat provisioning/site.yaml 
---
- hosts: all
  become: yes
  vars:
    ruby_version: 2.3.1
  tasks:
    - name: install yum package
      yum: name={{item}}
      with_items:
        - git
        - openssl-devel
        - readline-devel
        - zlib-devel
    - name: clone rbenv
      git: >
        repo='https://github.com/sstephenson/rbenv.git'
        dest='/home/vagrant/.rbenv/'
    - name: clone ruby-build
      git: >
        repo='https://github.com/sstephenson/ruby-build.git'
        dest='/home/vagrant/.rbenv/plugins/ruby-build/'
    - name: change owner
      file: path='/home/vagrant/.rbenv' owner=vagrant state=directory recurse=yes
    - name: add path(not idempotency)
      # TODO: fragments
      become: no
      shell: echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
    - name: rbenv init
      become: no
      shell: echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
    - name: install ruby-build
      shell: /home/vagrant/.rbenv/plugins/ruby-build/install.sh
    - name: reload bash_profile
      shell: source /home/vagrant/.bash_profile
    - name: check ruby already installed
      shell: "sudo -iu vagrant rbenv versions | grep {{ ruby_version }} | awk '{print $2}'"
      register: rbenv_ruby_version
    - name: install ruby
      shell: "sudo -iu vagrant rbenv install {{ ruby_version }}"
      when: rbenv_ruby_version.stdout != '{{ ruby_version }}'
    - name: rbenv rehash
      shell: "sudo -iu vagrant rbenv rehash"
    - name: rbenv global
      shell: "sudo -iu vagrant rbenv global {{ ruby_version }}"
    - name: install gem packages
      become: no
      gem: name={{item}} user_install=no executable=~/.rbenv/shims/gem
      with_items:
        - sshkit
        - capistrano
        - serverspec

ハマりどころ

1nameにつき1モジュール

当たり前なのかもしれませんが、shellモジュールを1つのnameブロックに2つ書くと怒られたり、怒られずにスルーされたりします。

rbenvコマンドが通らない

bash_profileを読み込まないらしく、そんなコマンド知らないよと言われます。あえてcommandでsudo -iuをすることで読むようになるっぽいです。あんまりきれいじゃないけどね。。。

Ansible と Vagrant を使って Rails 開発環境(Ubuntu + rbenv + MySQL5.6 + node.js)を構築する - Qiita

gemが通らない

rbenvと通常のrubyとではgemが置かれる場所が違うようです。user_installをnoにしてrbenv配下のgemを師弟してやる必要がありました。

HomebrewのrbenvとAnsibleのgemモジュールを使う場合はuser_install=noが必要 - Qiita

rubyのインストール前チェック

やたらrubyのinstallに時間がかかったのでバージョンチェックをいれました。残課題としてはecho地獄をフラグメント化してやりたい。

ansibleを学ぶ:vol04:よくハマる部分とその解決法 - 文系プログラマによるTIPSブログ

デプロイ時間

なんでこんなに時間かかるんだろう。。。12分ですね。rubyのinstallにめちゃくちゃ時間がかかる。ネットワークの問題だろうか。

take@lenovo:~/work/vagrant/capistrano$ time vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'CentOS72'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: capistrano_default_1476208463839_57734
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
    default: Adapter 2: hostonly
==> default: Forwarding ports...
    default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: 
    default: Vagrant insecure key detected. Vagrant will automatically replace
    default: this with a newly generated keypair for better security.
    default: 
    default: Inserting generated public key within guest...
    default: Removing insecure key from the guest if it's present...
    default: Key inserted! Disconnecting and reconnecting using new SSH key...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
    default: The guest additions on this VM do not match the installed version of
    default: VirtualBox! In most cases this is fine, but in rare cases it can
    default: prevent things such as shared folders from working properly. If you see
    default: shared folder errors, please make sure the guest additions within the
    default: virtual machine match the version of VirtualBox you have installed on
    default: your host and reload your VM.
    default: 
    default: Guest Additions Version: 4.3.30
    default: VirtualBox Version: 5.1
==> default: Setting hostname...
==> default: Configuring and enabling network interfaces...
==> default: Mounting shared folders...
    default: /vagrant => /home/take/work/vagrant/capistrano
==> default: Running provisioner: shell...
    default: Running: inline script
==> default: Running provisioner: ansible...
    default: Running ansible-playbook...

PLAY ***************************************************************************

TASK [setup] *******************************************************************
ok: [192.168.100.101]

TASK [install yum package] *****************************************************
changed: [192.168.100.101] => (item=[u'git', u'openssl-devel', u'readline-devel', u'zlib-devel'])

TASK [clone rbenv] *************************************************************
changed: [192.168.100.101]

TASK [clone ruby-build] ********************************************************
changed: [192.168.100.101]

TASK [change owner] ************************************************************
changed: [192.168.100.101]

TASK [add path(not idempotency)] ***********************************************
changed: [192.168.100.101]

TASK [rbenv init] **************************************************************
changed: [192.168.100.101]

TASK [install ruby-build] ******************************************************
changed: [192.168.100.101]

TASK [reload bash_profile] *****************************************************
changed: [192.168.100.101]

TASK [check ruby already installed] ********************************************
changed: [192.168.100.101]
 [WARNING]: Consider using 'become', 'become_method', and 'become_user' rather
than running sudo


TASK [install ruby] ************************************************************
changed: [192.168.100.101]

TASK [rbenv rehash] ************************************************************
changed: [192.168.100.101]

TASK [rbenv global] ************************************************************
changed: [192.168.100.101]

TASK [install gem packages] ****************************************************
changed: [192.168.100.101] => (item=sshkit)
changed: [192.168.100.101] => (item=capistrano)
changed: [192.168.100.101] => (item=serverspec)

PLAY RECAP *********************************************************************
192.168.100.101            : ok=14   changed=13   unreachable=0    failed=0   


real    12m13.906s
user    1m31.344s
sys 0m45.828s

おわりに

今回もgithubにソースはアップしています。VM2台目ですね。

github.com

次はphpipamかなー。過去何度か記事組んでますし、アクセス数も地味に多い。何より気に入って使ってるOSSなので使い倒して貢献したいですね。