『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]" ] }
このへんが実行されます。
※問題なければ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
外部公開用リバースプロキシの設定
登録したドメインへのアクセスを、構築したサーバに転送するように設定します。
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作成部分の補足解説
#!/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 ~]$
まとめ
みんなライブオペレーションやろうよ!