ちょっと話題の記事

Amazon Linuxにknife-soloの実行環境を構築してみる

2014.01.05

こんにちは、やま です。2回目の投稿です、よろしくお願いします。

前回、"Amazon Linuxの環境にRubyの実行環境を構築する方法" を紹介させていただきました。今回は、この環境上にknife-soloの環境をつくって、Webサーバを構築する簡単なレシピを作成・実行してみたいと思います。

構成としては以下のイメージです。

amazon-linux_knife-solo

  • Amazon Linux(今回はami-be1c848e)を2台用意
  • knife-solo実行マシンは事前にRubyの環境を用意
  • 両方ともインターネットへ接続可能
  • セキュリティグループの設定はそれぞれ以下の通り
    • knife-solo実行マシン:sshが有効
    • Webサーバ: ssh, httpが有効

操作はすべてLocal PCからknife-solo実行マシンにSSH接続をしておこなっていきます。また、knife-solo実行マシンからWebサーバへアクセスする際には IPアドレス:10.0.1.180 を使用します。

事前準備

knife-soloを実行する場合、対象にSSH接続できる必要があります。よって、今回は事前準備としてknife-solo実行マシン側にWebサーバの秘密鍵を用意して、毎回秘密鍵を指定しなくても済むように設定をしておきます。具体的には以下をおこなっておきます。

  • knife-solo実行マシンの ~/.ssh/ にwebサーバの秘密鍵を格納
  • /etc/ssh/ssh_config に秘密鍵の情報を追記
        IdentityFile ~/.ssh/PrivateKey.pem

    PrivateKey.pemという秘密鍵を使用しています。

 

上記の設定後、webサーバにSSH接続を試したところ、以下の通り秘密鍵のエラーでログインできませんでした。

$ ssh 10.0.1.180
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '/home/ec2-user/.ssh/PrivateKey.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
bad permissions: ignore key: /home/ec2-user/.ssh/PrivateKey.pem
Permission denied (publickey).

「秘密鍵のパーミッションが開きすぎている」とのことなので600に変更したところログインできました。

$ chmod 0600 ~/.ssh/PrivateKey.pem
$ ssh 10.0.1.180
Last login: Sat Jan  4 05:49:47 2014 from 10.0.1.115

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2013.09-release-notes/
6 package(s) needed for security, out of 18 available
Run "sudo yum update" to apply all updates.

なお、knife-soloを実行する際の前提として、SSH接続に使われるログインユーザがsudoかつパスワードなしでchef-soloを実行できる必要がありますが、EC2の場合にはデフォルトでログインユーザがsudo権限を持っているので特に用意する必要はありません。

knife-solo インストール

knife-solo実行マシンにknife-soloをインストールします。

$ gem install knife-solo

~/.bash_profileの再読み込みをおこない、knife の初期設定をおこないます。色々と質問事項が聞かれますがすべてデフォルトで問題ありません。初期化が完了すると ~/.chef/knife.rb にknifeの設定ファイルが保存されます。

$ source ~/.bash_profile
$ knife configure

Chefレポジトリを作成します。

$ cd
$ knife solo init chef-repo

Webサーバにchef-soloをインストール

Webサーバにchef-soloをインストールします。

$ cd chef-repo
$ knife solo prepare 10.0.1.180

cookbookの作成

site-cookbooksフォルダにnginxのクックブックを作成します。

$ knife cookbook create nginx -o site-cookbooks

ファイルの編集

nginxをインストールしてサービスを起動するようにレシピを編集します。

$ cat chef-repo/site-cookbooks/nginx/recipes/default.rb
#
# Cookbook Name:: nginx
# Recipe:: default
#
# Copyright 2014, YOUR_COMPANY_NAME
#
# All rights reserved - Do Not Redistribute
#
package "nginx" do
        action :install
end

service "nginx" do
        action [ :enable, :start ]
end

作成したレシピを実行するようにJSONファイルを編集します。

$ cat chef-repo/nodes/10.0.1.180.json
{
        "run_list":[
                "recipe[nginx]"
        ]
}

Cookbookを適応

レシピを実行してCookbookを適用します。以下のコマンドによってknife-solo実行マシンの各種ファイルがWebサーバへ同期されてchef-soloが実行されます。

$ cd chef-repo
$ knife solo cook 10.0.1.180
Running Chef on 10.0.1.180...
Checking Chef version...
Uploading the kitchen...
Generating solo config...
Running Chef...
Starting Chef Client, version 11.8.2
Compiling Cookbooks...
Converging 2 resources
Recipe: nginx::default
  * package[nginx] action install
    - install version 1.4.3-1.14.amzn1 of package nginx

  * service[nginx] action enable
    - enable service service[nginx]

  * service[nginx] action start
    - start service service[nginx]

Chef Client finished, 3 resources updated

ブラウザからWebサーバのグローバルIPにアクセスをしてページが表示されることを確認します。

nginx_default

knife-soloを用いてWebサーバが構築できたことが確認できました。

 

まとめ

ということでAmazon Linux上にknife-soloの実行環境を作って、簡単なレシピを実行するまでの一連の手順をご紹介しました。初歩的な内容になりますが、これからknife-soloをちょっと触ってみようという方にとって何かしらの役に立てればと思っております。

なお、今回の構成は簡易的にknife-soloの実行を試すもので、セキュリティや運用面などを考慮していません。実際の利用を検討される場合には、踏み台を立てるなどの対策をご検討いただければと思います。以下の記事が参考になります。

よろしくお願いします。