はじめに
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なので使い倒して貢献したいですね。