はじめに
Ubuntuちゃんの上のVMをansibleでいじり倒す編。
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台目ですね。
次はphpipamかなー。過去何度か記事組んでますし、アクセス数も地味に多い。何より気に入って使ってるOSSなので使い倒して貢献したいですね。