追記: ansible が grub.cfg を書き換えている箇所があったのでコメントアウトしました。
前回の問題がある場所
前回の出題者たちが作成した Ansible を使って構築してみます。
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