あいつの日誌β

働きながら旅しています。

isucon5 予選の復習を Azure 上でやってみる(1)

追記: ansible が grub.cfg を書き換えている箇所があったのでコメントアウトしました。

前回の問題がある場所

前回の出題者たちが作成した Ansible を使って構築してみます。

github.com

Ansible 実行サーバーは手元の MacOSX で、操作対象サーバーは Azure の Virtual Machines です。

Just Do it

手元の MacOSX に Ansible を用意します。

% brew install ansible
% ansible --version
ansible 2.1.0.0
  config file = 
  configured module search path = Default w/o overrides

Azure の Virutal Machines を作成

isucon5 の予選で使われた ansible を使って環境構築をしたいと思います。 isucon5 の ubuntu では一般ユーザーが isucon だったのでそれにならって一般ユーザーを ubuntu ではなくて isucon として新しく Virtual Machines を作りましょう

isucon5 の予選では gcp の n1-highcpu-4 が使用されていましたのでそれに似たプランにしたいのですがとりあえずここでは A2 Basic を使ってみます(CPU: 2, Memory: 3.5G)

ansible-playbook

https://github.com/isucon/isucon5-qualify を手元に clone します。 この ansible は root で操作する前提なのですが、一般ユーザーである isucon で操作したいので一部修正して使います。

isucon5-qualify/gcp/image/ansible/ 以下のファイルを修正します。

00_devel.yml

 ---
 - hosts: all
+  become: true
   gather_facts: no
   tasks:
     - apt: name=python-selinux state=present update_cache=true
@@ -37,5 +38,5 @@
     - apt: name=curl state=present
     # for php --with-openssl
     - apt: name=pkg-config
-    # make Ubuntu 15.04 image root fs to rw 
-    - copy: src=../files/grub.cfg dest=/boot/grub/grub.cfg owner=root mode=444
+    # make Ubuntu 15.04 image root fs to rw
+    # - copy: src=../files/grub.cfg dest=/boot/grub/grub.cfg owner=root mode=444

01_isucon_base.yml

 ---
 - hosts: all
+  become: true
   gather_facts: no
   tasks:
     - name: change timezone to JST

02_xbuild.yml

 ---
 - hosts: all
-  sudo: yes
-  sudo_user: isucon
+  # sudo: yes
+  # sudo_user: isucon
   gather_facts: no
   tasks:
     - git:
@@ -40,6 +40,7 @@
     - file: src=/home/isucon/.local/scala-2.11.7 dest=/home/isucon/.local/scala state=link
 
 - hosts: all
+  become: true
   gather_facts: no
   tasks:
     # java

03_middleware.yml に関しては mysql-5.6 の apt パッケージが存在しなくなっていたので 5.7 に変更しました。

 ---
 - hosts: all
+  become: true
   gather_facts: no
   tasks:
     - apt: name=nginx state=present
@@ -8,7 +9,7 @@
       notify:
         - reload nginx
     - copy: src=../files/nginx.php.conf dest=/etc/nginx/nginx.php.conf owner=root mode=644
-    - apt: name=mysql-server-5.6 state=present
+    - apt: name=mysql-server-5.7 state=present
     - file: path=/var/run/mysqld state=directory owner=mysql mode=775
     - name: copy my.cnf
       copy: src=../files/my.cnf dest=/etc/my.cnf owner=root mode=644

04_deploy_application.yml では Perl の module 依存が1年前とは違うらしいのでコメントアウトしました。まあここであえて Perl を選択するような古豪は自力でなんとかするから別にいいよね。

 ---
 - hosts: all
   gather_facts: no
-  sudo: yes
-  sudo_user: isucon
   tasks:
     - git:
         repo=https://github.com/isucon/isucon5-qualify.git
@@ -16,10 +16,10 @@
       shell: PATH=/home/isucon/.local/ruby/bin:$PATH bundle install
       args:
         chdir: /home/isucon/webapp/ruby
-    - name: perl
-      shell: PATH=/home/isucon/.local/perl/bin:$PATH carton install
-      args:
-        chdir: /home/isucon/webapp/perl
+      # - name: perl
+      # - shell: PATH=/home/isucon/.local/perl/bin:$PATH carton install
+      # - args:
+      # -   chdir: /home/isucon/webapp/perl
     - name: php
       shell: PATH=/home/isucon/.local/php/bin:$PATH php composer.phar install
       args:
@@ -67,6 +67,7 @@
     # - command: sudo su - isucon /home/isucon/init.sh
 
 - hosts: all
+  become: true
   gather_facts: no
   tasks:
     - copy: src=../files/env.sh dest=/home/isucon/env.sh owner=isucon mode=644

それから /usr/local/etc/ansible/hosts を修正しておきます。インスタンスを停止するたびに IP アドレスが変わるので都度払い出された IP を追加する必要があります。

それらの作業が終わったら以下のコマンドを実行します。完了するまで時間がかかるのでお茶でも飲んだりしてお待ちください。

% cd isucon5-qualify/gcp/image/ansible
% YOUR_IP=13.XXX.XXX.XXX # 適宜変更してください
% YOUR_KEY=~/.ssh/id_rsa # 適宜変更してください
% ansible-playbook --private-key="${YOUR_KEY}" -u isucon *.yml

あとは 80 port が公開されていないはずなので Azure の GUI で xxx-nsg (nsg は Network security group)を操作してください。

終わったら IP を直接叩いて画面が表示されるか確認しましょう。

たぶんこの時点で ISUxi login の画面が表示されると思います。 ですが、provision する時に MySQL が iscon5q を作成していないようです。

/var/log/syslog に以下のエラーが表示されます

Aug 30 09:00:17 web bundle[37644]: 2016-08-30 18:00:17 - Mysql2::Error - Unknown database 'isucon5q'

ということで手動でDBを作成しましょう。 ただ残念ながら mysqldump で取得した結果が存在しないので過去の image から取得します。1.5GBぐらいでした。

% du -m dump.sql                                                                          1566    dump.sql

それからユーザーも作成しておきます。

sudo mysql -uroot -e 'create database isucon5q'
sudo mysql -uroot isucon5q < ~/dump.sql 
CREATE USER isucon IDENTIFIED BY 'isucon';

以下を環境変数に追加します

echo 'ISUCON5_DB_USER=isucon' >> ~/env.sh 
echo 'ISUCON5_DB_PASSWORD=isucon' >> ~/env.sh 
exec -l $SHELL

アプリを再起動します。

sudo service isuxi.ruby restart

ログインできたら成功。

ID: edwardo3657@isucon.net
PW: edwardo3657