AWS
chef
knife
knife-zero

Knife-Zero bootstrapを用いてAmazon EC2にChefをインストールする際の手順

More than 3 years have passed since last update.

目的

Amaon EC2インスタンスにKnife-Zeroを介してChefをインストールする。

ほぼ以下のsawanoboly氏の記事の通りに進めるため、EC2にインストールする際に必要な手順のみを記述する。

前提条件

環境

  • ローカルホストOS : CentOS 6.5
  • Vagrant : 1.6.5
  • Bundler : 1.7.7
  • EC2 AMI : Amazon Linux AMI 2014.09.1 (HVM)

  • AWS上にEC2インスタンスを作成・SSH接続が可能であること。

[local@localhost VagrantEC2]$ vagrant up --provider=aws
Bringing machine 'default' up with 'aws' provider...
==> default: HandleBoxUrl middleware is deprecated. Use HandleBox instead.
            ...

[local@localhost VagrantEC2]$ vagrant ssh-config --host ec2 >> ~/.ssh/config
[local@localhost VagrantEC2]$ ssh ec2

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

https://aws.amazon.com/amazon-linux-ami/2014.09-release-notes/
16 package(s) needed for security, out of 41 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-172-31-29-xx ~]$ 

Vagrant経由でEC2インスタンス立ち上げからSSH接続が可能であることまでを確認。

EC2ユーザーの作成

※この項目は必須ではありません
 ec2デフォルトユーザー(ec2-user)でもこれ以降の処理は可能。
 ユーザー作成を行わない場合は、以降の処理のSSH接続ユーザーおよび認証鍵をデフォルトユーザーのものに読み替えること。

 
Knife-Zero実行の際にEC2側で使用するユーザーを追加。

[ec2-user@ip-172-31-29-xx ~]$ sudo su -                                        
[root@ip-172-31-29-xx ~]# adduser remote
[root@ip-172-31-29-xx ~]# passwd remote 

sudo権限を持たせる。

visudo
remote ALL=(ALL) ALL

 
SSH認証鍵を作成し、ローカルからSSH接続を行えるよう環境を構築。

[local@localhost ~]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
        ...

[local@localhost VagrantEC2]$ ssh remote@(EC2インスタンスのIPアドレス) -i ~/.ssh/id_rsa
Enter passphrase for key '/home/local/.ssh/id_rsa': 
Last login: Wed Dec  3 08:13:20 2014 from penta.tokai-soft.net

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

https://aws.amazon.com/amazon-linux-ami/2014.09-release-notes/
16 package(s) needed for security, out of 41 available
Run "sudo yum update" to apply all updates.
[remote@ip-172-31-29-xx ~]$ 

 

  • SSH認証の設定の仕方がわからない場合

  以下の記事を参考
  ssh公開鍵認証を実装する(自分メモ)
  SSH ログインで Permission Denied

Knife-Zeroインストールおよび実行

ホームディレクトリ以下にChef-Repoディレクトリを作成。
bundle initを行い、Knife-Zero実行環境を作成する。

[local@localhost Chef-Repo]$ bundle init

 
作成されたGemfileに、以下のようにKnife-Zeroおよび必要なgemを記述し、インストールする。

Gemfile
source "https://rubygems.org"                                                                      

gem 'chef'                                           
gem 'knife-zero'
gem 'rb-readline'
[local@localhost Chef-Repo]$ bundle install --path vendor/bundle

 
インストールが無事成功したら、knifeコマンドのデフォルト動作をローカルモードにするためknife.rbを作る。

[local@localhost Chef-Repo]$ mkdir .chef
[local@localhost Chef-Repo]$ echo 'local_mode true' > .chef/knife.rb

次に、以下のコマンドを入力し、EC2にChefをインストールする。

[local@localhost Chef-Repo]$ bundle exec knife zero bootstrap <EC2インスタンスのIPアドレス> -x remote -i ~/.ssh/id_rsa --hint ec2 --sudo

オプション解説

  • -x user    :SSH接続ユーザー名

  • -i key_path :SSH認証鍵のパス

  • --hint ec2 :OhaiヒントをEC2に設定
            Ohaiは接続先ノードの構成情報(メタデータ)を収集するツールであり、
            設定されたヒントに従い、構成情報を収集、JSON形式に整形、またChef-Clientに提供を行う。
            ここでは、EC2ノードの構成情報を収集するようヒントを設定している。

  • --sudo    :sudo権限で実行させる

EC2への接続が開始される。
途中、SSH認証鍵および接続先ユーザーのパスワードを要求されるため、入力する。

DL is deprecated, please use Fiddle
ffi-yajl/json_gem is deprecated, these monkeypatches will be dropped shortly
WARNING: No knife configuration file found
WARN: No cookbooks directory found at or above current directory.  Assuming /home/local/Chef-Repo.
Connecting to (EC2のIPアドレス)
Enter passphrase for /home/local/.ssh/id_rsa: ← SSH認証鍵のパスワードを入力
knife sudo password:
Enter your password: ← 接続先ユーザーのパスワードを入力
Installing Chef Client...

 
認証が問題なく通れば、以下のメッセージが表示され、Chefがインストールされる。

Starting Chef Client, version 11.16.4
Creating a new client identity for ip-172-31-29-xx.ap-northeast-1.compute.internal using the validator key.
resolving cookbooks for run list: []
Synchronizing Cookbooks:
Compiling Cookbooks...
[2014-12-03T08:13:43+00:00] WARN: Node ip-172-31-29-xx.ap-northeast-1.compute.internal has an empty run list.
Converging 0 resources

Running handlers:
Running handlers complete
Chef Client finished, 0/0 resources updated in 1.591018293 seconds
[local@localhost Chef-Repo]$ 

 
最後に、EC2側でChefがインストールされていることを確認する。

[remote@ip-172-31-29-xx ~]$ chef-
chef-apply   chef-client  chef-shell   chef-solo    
[remote@ip-172-31-29-xx ~]$ chef-client -v
Chef: 11.16.4

レシピの適用

bootstrapが成功したことでEC2インスタンスが管理ノードとして登録された。

[local@localhost Chef-Repo]$ bundle exec knife node list

ip-172-31-29-xx.ap-northeast-1.compute.internal

 
参考元に従い、knife zero chef_clientを用いて、ノードにレシピを実行させる。
ここでは自作のscalaインストールレシピをEC2に適用する。
 
まずは、ノードのrun_listにsetup-scalaレシピを追加する。

[local@localhost Chef-Repo]$ bundle exec knife node run_list add ip-172-31-29-xx.ap-northeast-1.compute.internal setup-scala

次に、chef_client でrun_listに登録されたレシピを実行させる。

[local@localhost Chef-Repo]$ bundle exec knife zero chef_client 'name:*' --attribute ec2.public_ipv4 -x remote -i ~/.ssh/id_rsa.pem --sudo

オプション解説

  • --attribute attribute_name

  bootstrap時にOhaiが収集した構成情報を参照する。
  ここでは、EC2インスタンスのパブリックIPを参照している。

 
最後に、EC2側で確認。問題なくインストールが完了している。

[remote@ip-172-31-29-xx ~]$ scala -version
Scala code runner version 2.9.2 -- Copyright 2002-2011, LAMP/EPFL

参考