前回のDocker + Chef で楽々環境作りからの続きになります。
物事には順序というものが必要なので、Chef実践入門を参考にしつつ、PHP環境~Apacheと進んでからSinatraを・・といきたいと思います。書籍の方ではVagrantとVirtualboxとChefなんですが、やっぱりDockerとChefで進めます。
Capstranoとか
こういう自動化な事柄を調べて進めていると、CapistranoとFabricというものが最近目につくようになってきました。Capstranoで何ができるのかというと、こないだSinatraでイベント収集アプリを作成したのですが、本番サーバーで可動させるまでの工程が
・ローカルでアプリを作成
・Githubにアップ
・本番環境でGithubからClone
・本番サーバーでちょこちょこ書き直し
・出来上がり!
という流れだったのですが、そのデプロイまでの工程を自動化してくれるようです。
デプロイツールって書いてあるのを見てなるほどと合点がいきました。
育てる
前回作ったBaseレシピを育てていく感じですね。
まだまだ使えたもんじゃないですがリンクだけ。
https://github.com/takekentw/chef-docker_base
やっぱsshで繋がりたい
前回は「コンテナだし、/bin/bashでコンテナをrunした方がいいかな」と思ったんですが、最終的にはsshで繋ぎたいなぁと思ったのでまずはそこから修正か。
方法は2通り。ポート番号を指定するか、pipeworkを使ってIPアドレスを割り振るか。
前者、後者とも、どちらにしろ走らせた後にコンテナIDを確認するか、ポート番号を確認するという行為は必要かと思うので(全自動もあるかもしれないが、今は知らない)、前者でいいかな。
以下のところをレシピに追記して、新しく作ったものでもいいし、ベースのレシピでもいいし。
service "sshd" do supports status: true, restart: true, reload: true action [:enable, :start] end
sshdを起動するようにコンテナを起動すればOKです。
無理だったらどこか間違えていると思われ。
$ sudo docker run -d -p 22 base:latest /usr/sbin/sshd-D $ ssh -p 49153 localhost The authenticity of host '[localhost]:49153 ([::1]:49153)' can't be established. RSA key fingerprint is 9f:e8:4e:ed:28:8f:ce:22:4a:c6:00:15:10:f0:72:a8. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '[localhost]:49153' (RSA) to the list of known hosts. takeken@localhost's password: Last login: Tue Dec 9 11:13:58 2014 from 172.17.42.1
無理だった場合、一番簡単な確認方法はオーソドックスに/bin/bashでコンテナを作って、シェルでコンテナの中の状態を確認するのが遠回りでも遠回りじゃない!と思います。
プログラミングに慣れている人はプログラムの見直しになるのだろうけれどね。
ifconfigリソースでIPアドレスは指定できるのか
Dockerは独自の方法で172.17.0.0/16のIPアドレスを割り振っているようなので、レシピで振ったとしても無理だと思います。個人でコンテナに設定するか、pipeworkを使うのが良さげです。
まずはPHPな環境から
まずはPHP+Nginxな環境から。いっちばーん最初にChefを触ったときにNginxのインストールには失敗しましたが、どうやらコミュニティクックブックを使う必要があったようです。なるほどね。
後は、ここからはインターネットの情報だけではなくて、書籍の内容も入ってくるので端折っています。
詳細は技評さんのサイトも参照くだしあ。
技術評論社
書籍に載っているサンプルコードは全てネットで公開しているらしいので、そんな気にする必要はないと思うけれど、そのままってのも芸がないしね。
[takeken@ubuntu]$ knife cookbook create nginx -o site-cookbooks ** Creating cookbook nginx ** Creating README for cookbook: nginx ** Creating CHANGELOG for cookbook: nginx ** Creating metadata for cookbook: nginx [takeken@ubuntu]$ vim site-cookbooks/nginx/recipes/default.rb
berks install –path はコマンドが変更になってます。
[takeken@ubuntu]$ berks vendor cookbooks Resolving cookbook dependencies... Fetching 'nginx' from source at site-cookbooks/nginx Fetching cookbook index from https://supermarket.getchef.com... Using nginx (0.1.0) from source at site-cookbooks/nginx Using selinux (0.8.0) Using yum (3.5.1) Installing yum-epel (0.5.3) Vendoring nginx (0.1.0) to cookbooks/nginx Vendoring selinux (0.8.0) to cookbooks/selinux Vendoring yum (3.5.1) to cookbooks/yum Vendoring yum-epel (0.5.3) to cookbooks/yum-epel
chef-repo/nodes/docker.jsonを編集して動作確認します。
[takeken@ubuntu]$ cat chef-repo/nodes/docker.json { "run_list" : [ "recipe[yum]", "recipe[yum-epel]", "nginx", "recipe[selinux::disabled]", "recipe[base]", "recipe[nginx]" ] }
ビルドが完了するまで何故かめちゃくちゃ時間がかかった。
まだNginxを入れただけなので、sshで入ってnginxを起動して確認。
細かい理由はDockerの仕組みの事です。
続いてphp-fpm。
[takeken@ubuntu]$ knife cookbook create php-env -o site-cookbooks [takeken@ubuntu]$ vi site-cookbooks/php-env/recipes/default.rb [takeken@ubuntu]$ vi nodes/docker.json "recipe[php-env]" # 追加します。 [takeken@ubuntu]$ vi Berksfile cookbook 'php-env', path: "./site-cookbooks/php-env" #追加します。 コミュニティCookbookを準備。 [takeken@ubuntu]$ berks vendor cookbooks Resolving cookbook dependencies... Fetching 'nginx' from source at site-cookbooks/nginx Fetching 'php-env' from source at site-cookbooks/php-env Fetching cookbook index from https://supermarket.getchef.com... Using nginx (0.1.0) from source at site-cookbooks/nginx Using php-env (0.1.0) from source at site-cookbooks/php-env Using selinux (0.8.0) Using yum (3.5.1) Using yum-epel (0.5.3) Vendoring nginx (0.1.0) to ./cookbooks/nginx Vendoring php-env (0.1.0) to ./cookbooks/php-env Vendoring selinux (0.8.0) to ./cookbooks/selinux Vendoring yum (3.5.1) to ./cookbooks/yum Vendoring yum-epel (0.5.3) to ./cookbooks/yum-epel
んで、ビルドー。
が終わったので、確認。
[takeken@755acbdb1068 ~]$ php-fpm -v PHP 5.3.3 (fpm-fcgi) (built: Oct 30 2014 20:14:56)
まだnginxとphpとの設定ができていないので、ここでerbファイルが出てくるのですが、nginxもいつの間にか(最初からかも)includeするconfファイルになっていた。
こいつをテンプレートとして、erbを作っていくます。
-rw-r--r-- 1 root root 1290 Nov 11 16:27 /etc/nginx/conf.d/default.conf --- chef-repo/site-cookbooks/nginx/templates/default/default.conf.erb 2014-12-10 11:34:04.076380776 +0900 +++ /home/takeken/default.conf.etb 2014-12-10 11:30:18.008380926 +0900 @@ -37,15 +37,13 @@ # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # - <% if node[ 'nginx' ][ 'env' ].include?("php") %> - location ~ \.php$ { + #location ~ \.php$ { # root html; - fastcgi_pass 127.0.0.1:9000; - fastcgi_index index.php; - fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; - include fastcgi_params; - } - <% end %> + # fastcgi_pass 127.0.0.1:9000; + # fastcgi_index index.php; + # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; + # include fastcgi_params; + #} # deny access to .htaccess files, if Apache's document root # concurs with nginx's one chef-repo/site-cookbooks/nginx/recipes/default.rbにtemplateのリソースを追加。 temlate 'default.conf' do path '/etc/nginx/conf.d/default.conf' source "default.conf.erb" owner 'root' group 'root' mode '0644' notifies :reload, "service[nginx]" end
何回やっても上手くいかず、理由は上のレシピを見ると分かるのですが、リソースのtemplateがtemlateになってました。
そりゃあ読まず、読ませずな訳だ。\(^o^)/
エラーが出る訳じゃないよってのは勉強になった。
この辺でAttributeが出てきます。Sinatraでも出てきていた<% >内を読ませるアレです。
erbを用意してレシピを書き換えたら、Docker.jsonに追記して、Attributeファイルを書いて、最後にberksを叩いてビルドですかな。
[takeken@ubuntu]$ cat chef-repo/nodes/docker.json { "nginx":{ "env":["php"] }, "run_list" : [ "recipe[yum]", "recipe[yum-epel]", "nginx", "recipe[selinux::disabled]", "recipe[base]", "recipe[nginx]", "recipe[php-env]" ] } $ berks vendor cookbooks
出来たコンテナが↓これです。sshを起動してログインという手間が面倒なのでDocker runでシェルを起動して確認しました。
さっきも書いた通りtemplateリソースがtemlateになっていて何回も失敗していたのですが、confファイルへのinclude に問題があるのかと思い違いしてnginx.confに書き直したのでさっきの例とは異なっています(´・ω・`)
これが手入力の怖さだね。
bash-4.1# tail /etc/nginx/nginx.conf root /usr/share/nginx/html; } location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } }
書籍だとプロビジョニング、ここではDocker buildのことで、どっちもChef-soloが走っているので同じ事なのでログの確認はできます。
これでphpとnginxの環境作りまで終わりました。
[takeken@ubuntu]$ ssh 172.17.0.69 takeken@172.17.0.69's password: Last login: Wed Dec 10 09:01:51 2014 from 172.17.42.1 [takeken@367ed09b5de0 ~]$ php -v PHP 5.3.3 (cli) (built: Oct 30 2014 20:12:53) Copyright (c) 1997-2010 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies with Zend OPcache v7.0.3, Copyright (c) 1999-2014, by Zend Technologies [takeken@367ed09b5de0 ~]$ nginx -v nginx version: nginx/1.0.15
ここらでgitの更新でもしておきます。裏では随分と失敗しているのでgitのロールバックはけっこう使っています・・。
[takeken@ubuntu]$ git add . [takeken@ubuntu]$ git commit -m "20141210:nginx/php" [takeken@ubuntu]$ git push
参考書籍
Chef実践入門 技術評論社