『qpstudy3周年記念LT大会』でLTしてきた!

『qpstudy3周年記念LT大会 〜新人さん、業界にようこそ!〜 with ビール』に参加&LTしてきました!


14時から始まって簡単なメインセッションの後、20人くらいのLTが19時近く?まで!
いやー、さすがに飲み疲れましたw


自分のLT資料です


今回のやりたかったのはこのへんでした

  • なにか新人さんが参考になる話をする
  • ライブオペレーション

ライブオペレーションについては、開発系の勉強会の『ライブコーディング』と同じ感じで、

  • みんなでだれかのオペレーションを見て
  • それについていろいろ議論する

と楽しいかなーと。
初挑戦だったので、テキパキ行かずに何やってるかうまく伝えられなかったですが、なかなか楽しかったのでまたやりたいと思います!


あとはライブオペレーションでやったことについて、ザッと解説しておきます!

ライブオペレーションの手順書

お題は趣味構築中のサーバ管理Railsアプリです。
サーバ、ミドルウェア、アプリの構築、外部公開まで一通りのオペレーションをやりました。


さっき通しでやってみたら全部で10分くらいでした。
※発表の時は、時間のかかるとこは先に完了済みサーバを準備しておいて切り替える、QP3分クッキング方式を使いました。

VM作成

シェルスクリプト叩くだけです(細かい仕組みは後で補足解説します)

ssh vm-host02
sudo su -
sh vm_create.sh qpstudy01 192.168.1.151

インストーラが起動してOSがインストールされます

ローカルDNSの登録、OSの初期設定、chef実行準備もついでに完了しちゃいます

OS設定、ミドルウェアのセットアップ

サーバが起動したらchef-soloを実行してミドルウェアをセットアップします

ssh qpstudy01
sudo su - sysadmin
vim ~/chef/nodes/qpstudy01.json
sudo /home/sysadmin/.rbenv/shims/chef-solo -c ~/chef/solo/solo.rb -j ~/chef/nodes/qpstudy01.json

今回のnode定義JSONはこんな感じ

{
  "run_list": [
    "role[default]",
    "recipe[rbenv::mikeda]",
    "recipe[mysql::server]"
  ]
}

このへんが実行されます。

  • 共通設定(OSの初期設定、管理/監視ツールのインストールなど)
  • ruby(rbenv)のセットアップ
  • MySQLのセットアップと起動

※問題なければjsonファイルをgithubにpushしちゃいますが、そのへんの運用はknife-solo的な中央管理に見直し検討中です。


自宅環境で使っているcookbookはgithubで公開してるので、細かいところはそっちを見て下さい。
https://github.com/mikeda/chef

アプリの構築と起動

githubからアプリをcloneしてセットアップします。

ssh qpstudy01
git clone https://github.com/mikeda/sabakan
cd sabakan

# 依存gemのインストール
bundle install

# DBのセットアップ
bundle exec rake db:create
bundle exec rake db:migrate

# サーバ起動
# 今回はwebrickで起動します。(ちゃんと外部公開する時はunicornとかpassengerを使いましょう)
bundle exec rails server
外部DNSドメイン登録

Route53使ってるので、AWSのManagementConsoleから登録します

外部公開用リバースプロキシの設定

登録したドメインへのアクセスを、構築したサーバに転送するように設定します。

ssh proxy01
sudo su -
vim /etc/nginx/conf.d/qpstudy.conf
/etc/init.d/nginx configtest
/etc/init.d/nginx reload

今回のコンフィグはこんな感じです

server {
    server_name  qpstudy.mikeda.jp;
    access_log  /var/log/nginx/qpstudy.mikeda.jp_access.log  main;

    location / {
        proxy_pass   http://192.168.1.151:3000;

        proxy_set_header        Host                $host;
        proxy_set_header        X-Real-IP           $remote_addr;
        proxy_set_header        X-Forwarded-Host    $host;
        proxy_set_header        X-Forwarded-Server  $host;
        proxy_set_header        X-Forwarded-For     $proxy_add_x_forwarded_for;
    }
}


これで完了!外部のブラウザからアクセスできるようになります。

簡単ですねー
(本番ではプロキシ設定ミスって502エラーでしたw)

VM作成部分の補足解説

VM作成スクリプトの中身はこんな感じです

#!/bin/bash

HOSTNAME=$1
IP=$2
LOCATION="http://192.168.1.110/mrepo/centos6-x86_64/disc1/"
TYPE=centos6_kvm
VCPUS=1
RAM=1024
DISK=5

IMG=/data/vm/${HOSTNAME}.img

if [ -f "$IMG" ];then
  echo already exists
  exit 1
fi

### PowerDNSにレコード登録
mysql -umikeda -pmikedapass -hdns01 pdns -e "INSERT INTO records (domain_id, name, content, type, ttl, prio) VALUES (1, '${HOSTNAME}.mikeda.jp', '${IP}', 'A', 60, NULL);"

### VMイメージファイル作成
dd if=/dev/zero of=$IMG bs=1MiB count=`expr $DISK \* 1024`

### VMインストール
virt-install  --connect qemu:///system \
  --name $HOSTNAME \
  --ram $RAM \
  --vcpus=$VCPUS \
  --disk path=$IMG \
  --os-type=linux \
  --os-variant=virtio26 \
  --accelerate \
  --nographics \
  --location="${LOCATION}" \
  --extra-args="ks=http://192.168.1.110/ks/gen/ks.php?cfg=${TYPE}.cfg+${HOSTNAME}+${IP} console=tty0 console=ttyS0,115200n8"

内部DNSサーバ(MySQLバックエンドのPowerDNS)にホストを登録するのも合わせてやっています。


virt-installで指定するkickstartファイルは動的に生成しています。
このPHPの中身はこうなってます。

<?php
list($cfg, $hostname, $ip) = explode(" ", $_GET["cfg"]);

$ks_config = file_get_contents($cfg);
echo preg_replace(
  "/^network.*/m",
  "network --device eth0 --bootproto static "
    . "--ip $ip --netmask 255.255.255.0 --gateway 192.168.1.1 "
    . "--nameserver 192.168.1.103 "
    . "--hostname $hostname",
  $ks_config
);

ベースのkickstartファイルのnetwork行を書き換えてるだけですね。
URLを叩くと、

curl 'http://192.168.1.110/ks/gen/ks.php?cfg=centos6_kvm.cfg+qpstudy01+192.168.1.151'

こういうkickstartファイルが帰ってきます

install
text
url --url=http://192.168.1.110/mrepo/centos6-x86_64/disc1/
lang ja_JP.UTF-8
keyboard jp106
network --device eth0 --bootproto static --ip 192.168.1.151 --netmask 255.255.255.0 --gateway 192.168.1.1 --nameserver 192.168.1.103 --hostname qpstudy01
rootpw  --iscrypted XXXXXXXXXXXXXXXXXX
firewall --service=ssh
authconfig --enableshadow --passalgo=sha512
selinux --disabled
timezone Asia/Tokyo
reboot

zerombr
bootloader --location=mbr --driveorder=vda --append="console=ttyS0,115200n8"
clearpart --all --initlabel --drives=vda
part /boot --fstype ext4 --size=100 --ondisk=vda
part swap --size=1024
part / --fstype ext4 --size=1 --grow

%packages
@base
@core
@debugging
@development
@japanese-support
@performance
@server-policy
sgpio
systemtap-client
telnet
openssl-devel
readline-devel
zlib-devel
nc

%pre
#/bin/sh
/usr/bin/wget http://192.168.1.110/setup/os_setup_centos6.sh -O /tmp/os_setup_centos6.sh

%post
%include /tmp/os_setup_centos6.sh


kickstartの%postで%includeしているスクリプトで、最低限のOS設定とchefのセットアップを実施しています。

#!/bin/sh

### ユーザ追加
useradd -u 999 sysadmin
useradd -u 1000 mikeda
sed -i 's|^mikeda:.*$|mikeda:$6$BovFTzjb$Eoa5XXXXXXXwK5e1:15627:0:99999:7:::|' /etc/shadow

mkdir /home/mikeda/.ssh
cat > /home/mikeda/.ssh/authorized_keys <<END
ssh-rsa AAAAB3NzaCXXXXXXXXXXX78rrAJbw== mikeda
END
chown -R mikeda. /home/mikeda/.ssh
chmod 700 /home/mikeda/.ssh
chmod 600 /home/mikeda/.ssh/*

### sudo設定
sed -i '/^Defaults *requiretty/s/^/#/' /etc/sudoers
echo 'mikeda ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
echo 'sysadmin ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers

### リゾルバ設定
cat <<END >/etc/resolv.conf
nameserver 192.168.1.103
nameserver 192.168.1.1
search mikeda.jp
END

### sshd設定
sed -i 's/#PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
echo "sshd:192.168.1.0/255.255.255.0,127.,LOCAL" >> /etc/hosts.allow
echo "sshd:ALL" >> /etc/hosts.deny

### iptablesの停止
chkconfig ip6tables off
chkconfig iptables off

### 不必要なservice停止
chkconfig atd off
chkconfig auditd off
chkconfig autofs off
chkconfig cups off
chkconfig smartd off

### IPV6無効化。Railsがエラーになるのでいったん完全無効化してない
#cat <<END >> /etc/modprobe.d/ipv6.conf
#options ipv6 disable=1
#END
echo 'NETWORKING_IPV6=no' >> /etc/sysconfig/network

### SELinuxをdisる
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

### 時刻合わせ。意味ないかも。
/usr/sbin/ntpdate 210.173.160.27

### YUMレポジトリの追加
# EPEL
rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

# mrepoで作成したローカルレポジトリの追加
cat > /etc/yum.repos.d/local.repo <<'END'
[freeze]
name=CentOS-$releasever - Freeze
baseurl=http://192.168.1.110/mrepo/centos6-x86_64/RPMS.freeze/
gpgcheck=0
enabled=1

[test]
name=CentOS-$releasever - Freeze
baseurl=http://192.168.1.110/mrepo/centos6-x86_64/RPMS.test/
gpgcheck=0
enabled=0
END

### 必須パッケージのインストール
yum -y install git

### chef-clientのセットアップ。RPM版に変えるかも
cat  > /tmp/install_chef-client.sh <<'END'
wget http://192.168.1.110/files/ruby/rbenv_chef_centos6.tgz -P /tmp/
tar xzf /tmp/rbenv_chef_centos6.tgz
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
git clone git://github.com/mikeda/chef.git
END
chmod 755 /tmp/install_chef-client.sh
su - sysadmin -c /tmp/install_chef-client.sh

完了すると自動でサーバが再起動されて、sshでログインできるようになってます。

[mikeda@admin02 ~]$ ssh qpstudy01
Warning: Permanently added 'qpstudy01,192.168.1.151' (RSA) to the list of known hosts.
[mikeda@qpstudy01 ~]$ 

まとめ

みんなライブオペレーションやろうよ!