ラベル Chef の投稿を表示しています。 すべての投稿を表示
ラベル Chef の投稿を表示しています。 すべての投稿を表示

2015年4月1日水曜日

ConoHaのVPSにchefを使ってRails環境を構築する。~knife solo 準備編~


最近ConoHaのVPSで遊んでます。
安いしコンソール見やすいしいい感じ。

最終的にはRails環境を作りたいんだけどせっかくなのでChefを使ってやってみる。
ただLinuxもあまり分からないから調べることだらけ。
なんとかchef soloが通るとこまで行ったので一旦メモしておきます。

まだまだ頭の中整理できてないので変なこと書いてたら指摘お願いします。

やりたいこと

・標準テンプレートOSをインストールしたConoHaVPSに対して、
・できるだけ少ない手順で knife solo cook が通るようにする。
まずはここまで。

環境

MacBookAir 2013 Mid
OS X Yosemite 10.10.2
Chef Solo 12.1.1(どうやって入れたか覚えてない)

手順

VPSの作成

OSはテンプレートイメージの CentOS 6.5 を選択。

残りは全部安いやつ。
1〜2分待てば起動する。

ローカル側でSSH接続準備

ConoHaコントロールパネルからSSH Private Keyをダウンロードする。
1234567-1.keyみたいな名前。とりあえずホームディレクトリ(~/)に置く。
ここからローカル側Macのターミナル.appで操作

ローカル側(MacBookAir)
$ cd ~
// ~/.sshフォルダが存在しない場合はフォルダ作成
$ mkdir .ssh
$ chmod 700 .ssh/
$ mv 1234567-1.key .ssh/conoha_private_key
$ cd .ssh/
$ chmod 600 conoha_private_key 
$ vi config 
//configファイルは下記のようにして保存。すでにある場合は追記する。
Host conoha
  HostName [VPSのIP]
  IdentityFile ~/.ssh/conoha_private_key
  User root

//うまく設定できていれば下記コマンドでssh接続ができるはず。
$ ssh conoha
[root@v[xxx-xxx-xxx-xxx]] ~]# logout
Connection to xxx.xxx.xxx.xxx closed.
//成功

どうもConoHaの標準テンプレートを使うとVPS作成時に選んだ秘密鍵でrootへSSH接続できるみたい。 この鍵はVPSをホストしている共有サーバ部分への接続にも使うらしいからあまり共用しない方がいい気がするけどよくわからん。もう少し詳しくなってから考えることにする。

VPS側でChef接続用ユーザーの作成

Chefを実行するためにはSSH接続可能且つパスワードなしでsudo可能なユーザーが必要らしい。ConoHa側に専用の'chef'ユーザーを作成し、rootに設定済みの公開鍵をchefユーザーでも利用可能にする。(rootへのssh接続は後で禁止します)

ローカル側(MacBookAir)
$ ssh conoha

ここからVPSのrootユーザーでの操作

VPS側(rootユーザー)
# adduser chef
# passwd chef
ユーザー chef のパスワードを変更。
新しいパスワード: <パスワードを決めて入力>
新しいパスワードを再入力してください: <パスワードを再入力>
passwd: 全ての認証トークンが正しく更新できました。
# visudo
// 下記1行を追加(パスワードなしでsudoできるようになる)
root    ALL=(ALL)       ALL                          ←この行の下に
chef    ALL=(ALL)       NOPASSWD:ALL     ←この行を追加
// 保存して閉じる(esc -> :wq)

# mkdir /home/chef/.ssh
# cp ~/.ssh/authorized_keys /home/chef/.ssh/
# cd /home/chef/.ssh/
# ls -la
drwxr-xr-x 2 root root 4096  4月  1 00:08 2015 .
drwx------ 3 chef chef 4096  4月  1 00:08 2015 ..
-rw------- 1 root root  445  4月  1 00:08 2015 authorized_keys
# chown chef:chef authorized_keys 
# chown chef:chef .
# chmod 600 authorized_keys 
# chmod 700 .
# ls -la
drwx------ 2 chef chef 4096  4月  1 00:08 2015 .
drwx------ 3 chef chef 4096  4月  1 00:08 2015 ..
-rw------- 1 chef chef  445  4月  1 00:08 2015 authorized_keys
これでVPS側は一旦終わり。logoutで抜ける。

ローカル側(MacBookAir)
$ cd ~/.ssh/
$ vi config
//root接続用になってるところをchefに書き換える
Host conoha
  HostName [VPSのIP]
  IdentityFile ~/.ssh/conoha_private_key
  User root   ←  chefに書き換える

//これでchefユーザーでssh接続できるはず。
$ ssh conoha
[chef@vxxx-xxx-xxx-xxx ~]$ who am i
chef     pts/0        2015-04-01 00:17
[chef@vxxx-xxx-xxx-xxx ~]$ logout
Connection to xxx-xxx-xxx-xxx closed.
//成功
これでchef solo実行準備が整った。

ChefでHello World

Chef-Soloを使ってVPSにHello Worldしてみることまでやってみます。

キッチン(リポジトリ)の作成

knife solo initコマンドを使ってリポジトリ(cookbookを入れていくための箱)を作ります。

ローカル側(MacBookAir)
$ cd ~
$ knife solo init conoha-helloworld
WARNING: No knife configuration file found
Creating kitchen...
Creating knife.rb in kitchen...
Creating cupboards...
Setting up Berkshelf...

こんな感じでファイルが生成されてるはず

Cookbookの作成

knife cookbook createコマンドを使ってクックブック(レシピを入れるための箱)を作ります。

ローカル側(MacBookAir)
$ cd ~/conoha-helloworld/
$ knife cookbook create helloworld -o site-cookbooks/

-oで指定した site-cookbooksフォルダにhelloworldクックブックが生成されました。

レシピの編集

helloworldクックブックの中にあるrecipes/default.rbを修正します。
log "Hello World!!"
これだけ。

VPSにchefをインストール

さて、レシピを作ったので実行準備。knife solo prepareコマンドを使ってvpsにchefをインストールします。

ローカル側(MacBookAir)
$ knife -v
Chef: 12.1.1
$ knife solo prepare conoha
WARNING: No knife configuration file found
Bootstrapping Chef...

//インストールログがずらずらと

Thank you for installing Chef!
Generating node config 'nodes/conoha.json'...
//インストール完了

//vps側で確認してみる。
$ ssh conoha

VPS側(chefユーザー)
[chef@vxxx-xxx-xxx-xxx ~]$ knife -v
Chef: 12.1.1
これでVPSにchefをインストールできました。

VPSにレシピを適用

knife solo prepareを行ったときに、conoha-helloworld/nodes/conoha.jsonが生成されています。
このホストに対してどのcookbookを適用するかを管理するファイル。
すでにhelloworldクックブックは作成済みなのでこれを適用するようにconoha.jsonを書き換えます。
{
  "run_list": [
    "recipe[helloworld]"          ←この1行を追加
  ],
  "automatic": {
    "ipaddress": "conoha"
  }
}
あとはcookするだけ。
knife solo cookコマンドでレシピを適用します。
ローカル側(MacBookAir)
$ cd ~/conoha-helloworld/
$ knife solo cook conoha
Running Chef on conoha...
Checking Chef version...
Installing Berkshelf cookbooks to 'cookbooks'...
Resolving cookbook dependencies...
Uploading the kitchen...
Generating solo config...
Running Chef...
Starting Chef Client, version 12.1.1
Compiling Cookbooks...
Converging 1 resources
Recipe: helloworld::default
  * log[Hello World!!] action write
  

Running handlers:
Running handlers complete
Chef Client finished, 1/1 resources updated in 1.36169233 seconds
Hello World出ましたね!今日はここまで。
ここから先はcookbook作成→レシピ編集→conoha.jsonに追記→knife solo cook conohaの繰り返しです。
Rails環境の構築ができたらまた整理します。

2014年11月30日日曜日

【Berkshelf】The resource at 'hoge' does not appear to be a valid cookbook. Does it have a metadata.rb?

まだまだエラーは続くよー。
この本の通り書いててこの本の通り書いててvendoring cookbookしたらエラーした。
CakePHPで学ぶ継続的インテグレーションCakePHPで学ぶ継続的インテグレーション
渡辺 一宏,吉羽 龍太郎,岸田 健一郎,穴澤 康裕,丸山 弘詩

エラー

デプロイツール?のCapistrano3っていうのを開発用仮想マシンに入れるところ。
下記コマンドでcookbookのひな形を作って
bundle exec knife cookbook create capistrano -o site-cookbooks
できたフォルダのrecipes/default.rbを変更、
Vagrantfileのrun_listに追記して、
Berksfileを修正。
source "http://api.berkshelf.com"

cookbook "apt"
cookbook "phpenv", path: "./site-cookbooks/phpenv"
cookbook "hostsfile"
cookbook "capistrano", path: "./site_cookbooks/capistrano"
で、cookbooksをvendoringしたらエラーした。

naichilabmba:vagrant_book hu$ bundle exec berks vendor cookbooks
Resolving cookbook dependencies...
Fetching 'phpenv' from source at site-cookbooks/phpenv
Fetching 'capistrano' from source at site_cookbooks/capistrano
The resource at '/Users/hu/Documents/vagrant_book/site_cookbooks/capistrano' does not appear to be a valid cookbook. Does it have a metadata.rb?

metadata.rb?

metadata.rbはどう見てもあるんだよなぁ。
naichilabmba:vagrant_book hu$ ls site-cookbooks/capistrano/
CHANGELOG.md README.md attributes definitions files  libraries metadata.rb providers recipes  resources templates
なぜだ…
phpenvの方のvendoringは問題なく成功してるし…。うーむ。

phpenvの方

capistranoの方

phpenvの方は1行追加してあるけど他は全く一緒だよなぁ。
そもそも「knife cookbook create」で作ったテンプレートのままだし。

ためしにphpenvの方のmetadata.rbをリネームしてberks vendorしてみた。
naichilabmba:vagrant_book hu$ bundle exec berks vendor cookbooks
/Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/ridley-4.1.0/lib/ridley/chef/cookbook.rb:40:in `from_path': no metadata.json or metadata.rb found at /Users/hu/Documents/vagrant_book/site-cookbooks/phpenv (IOError)
 from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/berkshelf-3.1.5/lib/berkshelf/locations/path.rb:21:in `cached_cookbook'
 from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/berkshelf-3.1.5/lib/berkshelf/dependency.rb:126:in `cached_cookbook'
 from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/berkshelf-3.1.5/lib/berkshelf/lockfile.rb:387:in `block in reduce!'
 from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/berkshelf-3.1.5/lib/berkshelf/lockfile.rb:372:in `each'
 from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/berkshelf-3.1.5/lib/berkshelf/lockfile.rb:372:in `reduce!'
 from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/berkshelf-3.1.5/lib/berkshelf/installer.rb:32:in `run'
 from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/berkshelf-3.1.5/lib/berkshelf/berksfile.rb:371:in `install'
 from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/berkshelf-3.1.5/lib/berkshelf/berksfile.rb:590:in `vendor'
 from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/berkshelf-3.1.5/lib/berkshelf/cli.rb:387:in `vendor'
 from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/thor-0.19.1/lib/thor/command.rb:27:in `run'
 from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/thor-0.19.1/lib/thor/invocation.rb:126:in `invoke_command'
 from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/thor-0.19.1/lib/thor.rb:359:in `dispatch'
 from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/berkshelf-3.1.5/lib/berkshelf/cli.rb:52:in `dispatch'
 from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/thor-0.19.1/lib/thor/base.rb:440:in `start'
 from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/berkshelf-3.1.5/lib/berkshelf/cli.rb:27:in `execute!'
 from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/berkshelf-3.1.5/bin/berks:5:in `<top (required)>'
 from /Users/hu/.rbenv/versions/1.9.3-p547/bin/berks:23:in `load'
 from /Users/hu/.rbenv/versions/1.9.3-p547/bin/berks:23:in `<main>'
naichilabmba:vagrant_book hu$ 
IOエラーに変わっただと…?
一旦phpenvの方のmetadata.rbを戻してcapistrano側のmetadata.rbをリネームしてみた。
naichilabmba:vagrant_book hu$ bundle exec berks vendor cookbooks
Resolving cookbook dependencies...
Fetching 'phpenv' from source at site-cookbooks/phpenv
Fetching 'capistrano' from source at site_cookbooks/capistrano
The resource at '/Users/hu/Documents/vagrant_book/site_cookbooks/capistrano' does not appear to be a valid cookbook. Does it have a metadata.rb?
naichilabmba:vagrant_book hu$ 
結果変わらず。 どういう状態だろ。
metadata.rbを読み込みに行く前に無いと判断されてる?
設定ファイルミスったかなぁ。

原因発見

改めてBerksfile眺めてたら見つけた。
ひどいミス。
source "http://api.berkshelf.com"

cookbook "apt"
cookbook "phpenv", path: "./site-cookbooks/phpenv"
cookbook "hostsfile"
#cookbook "capistrano", path: "./site_cookbooks/capistrano"
cookbook "capistrano", path: "./site-cookbooks/capistrano"
まぁそんなもんだよね…。
pathが含まれるエラーはとりあえずそのpathの存在見ないとな…すぐ分かったはずなのに。

2014年11月29日土曜日

【nginx】nginxがうまく起動しなくてログおっかけて修正するだけで数時間かかった。


相変わらず下記の本を読みながらCI環境構築を進めてるんだけどnginxがうまく起動しなかった。
CakePHPで学ぶ継続的インテグレーションCakePHPで学ぶ継続的インテグレーション
渡辺 一宏,吉羽 龍太郎,岸田 健一郎,穴澤 康裕,丸山 弘詩

エラー

本では vagrant provision するとChefがnginxの設定や起動までやってくれてすぐにindex.phpに繋がるよ!って書いてあるんだけどどうにもこうにも繋がらない。

vagrant sshで対象の仮想マシンに繋いでnginxの状態を調べてみると…
vagrant@develop:~$ service nginx status
 * nginx is not running
nginx起動してないじゃん…
あと良くわからないのがstartしても何も応答がないんだよね・・・
vagrant@develop:~$ service nginx start
vagrant@develop:~$ service nginx start
vagrant@develop:~$ service nginx status
 * nginx is not running
vagrant@develop:~$ 

ログ確認

じゃあnginxの起動ログ見てみようってことで探した。
参考:http://heartbeats.jp/hbblog/2012/02/nginx03.html
エラーログは「/var/log/nginx/error.log」ってとこにあるらしい。

ログを見ると…ファイルはあるけど現在時刻では何も残ってない…
もしかしてssh接続したユーザーって起動コマンド打てない?って思ってsudoで再実行。
vagrant@develop:~$ sudo service nginx start
vagrant@develop:~$ 
そうしたらログに行が増えてた
2014/11/29 09:20:15 [emerg] 12499#0: invalid number of arguments in "root" directive in /etc/nginx/sites-enabled/test:5

testって設定ファイルがおかしーよ!って言われてるっぽいなぁ。

原因

testってファイルは
VagrantからChef経由でサーバーに作ったファイル。
見てみる。

test
server {
        listen 80;

        root /var/www/application/current/app/webroot
        index index.php index.html index.htm;

        server_name test.localhost;

        location / {
                try_files $uri $uri/ /index.php?$args;
        }

        location ~ \.php$ {
                try_files $uri =404;
                include /etc/nginx/fastcgi_params;
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                fastcgi_intercept_errors on;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_param CAKE_ENV test;
        }
}
4行目…セミコロンないよねorz

修正

ホストマシンのtest.erbを修正し、
「rm -rf cookbooks」でcookbooksフォルダを一旦削除、
「bundle exec berks vendor ./cookbooks」でBerkshelfを使ってcookbookを再作成
「vagrant provision」で仮想マシンへ再度反映

結果

動いたーーーーーーーー
こんな凡ミスで数時間持ってかれた…。
まぁコマンド試行錯誤しててちょっとUNIXに慣れた気がするしいいか。
Related Posts Plugin for WordPress, Blogger...