knife-nc 0.0.0 → 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -14,7 +14,7 @@ knife-ec2 と同じように、インスタンスを作成した上で Chef の
14
14
  # "chef" gem のインストール
15
15
  gem install chef
16
16
 
17
- # "ニフティクラウドSDK for Ruby" のインストール
17
+ # "ニフティクラウドSDK for Ruby" のインストール
18
18
  wget http://cloud.nifty.com/api/sdk/NIFTY_Cloud_SDK_for_ruby.zip
19
19
  cd NIFTY_Cloud_SDK_for_ruby
20
20
  rake install
@@ -25,33 +25,40 @@ knife-ec2 と同じように、インスタンスを作成した上で Chef の
25
25
 
26
26
  # 設定
27
27
 
28
- NIFTY CLoud REST API と通信するため、knife コマンドにアクセスキー/シークレットキーを教えてやる必要があります。
28
+ NIFTY Cloud REST API と通信するため、knife コマンドにアクセスキー/シークレットキーを教えてやる必要があります。
29
29
  knife.rb に設定するのが一番簡単でしょう。
30
30
 
31
- knife[:nc_access_key_id] = "Your NIFTY Cloud Access Key ID"
32
- knife[:nc_secret_access_key] = "Your NIFTY Cloud Secret Access Key"
31
+ knife[:nc_access_key] = "Your NIFTY Cloud Access Key"
32
+ knife[:nc_secret_key] = "Your NIFTY Cloud Access Key"
33
33
 
34
34
  knife.rb をバージョン管理システムにコミットしている場合 (つまり誰でも閲覧可能になっている場合) には、
35
35
  環境変数から読み込ませることも可能です。
36
36
 
37
- knife[:nc_access_key_id] = "#{ENV['NIFTY_CLOUD_ACCESS_KEY_ID']}"
38
- knife[:nc_secret_access_key] = "#{ENV['NIFTY_CLOUD_SECRET_ACCESS_KEY']}"
37
+ knife[:nc_access_key] = "#{ENV['NIFTY_CLOUD_ACCESS_KEY']}"
38
+ knife[:nc_secret_key] = "#{ENV['NIFTY_CLOUD_SECRET_KEY']}"
39
39
 
40
40
  アクセスキー/シークレットキーは knife サブコマンドの -A (--nc-access-key) と -K (--nc-secret-key) オプションで指定することもできます。
41
41
 
42
42
  # provision a new mini instance
43
- knife ec2 server create -r 'role[webserver]' -I 1 -T mini -A 'Your NIFTY Cloud Access Key ID' -K "Your AWS Secret Access Key"
43
+ knife nc server create -r 'role[webserver]' -I 1 -T mini -A 'Your NIFTY Cloud Access Key' -K "Your NIFTY Cloud Secret Key"
44
44
 
45
45
  さらに下記のオプションが knife.rb に設定可能です。
46
46
 
47
- *
48
- *
47
+ * nc_instance_type
48
+ * nc_image_id
49
+ * nc_ssh_key_id
50
+ * nc_bootstrap_version
51
+ * nc_distro
52
+ * nc_template_file
53
+ * nc_user_data
49
54
 
50
55
  ## サブコマンド一覧
51
56
 
52
57
  ### knife nc server create
53
58
 
54
- NIFTY Cloud 上にインスタンスを作成し SSH 経由で Chef のブートストラップを行います。「ブートストラップ」というのは Chef をインストールして Chef クライアントとして Chef サーバと通信できるようにすることです。デフォルトでは centos5-gems テンプレートでブートストラップを行います。-d オプションか --template-file オプションで振る舞いを上書きすることができます。インスタンス作成時、あとから knife コマンド経由で削除可能とするために、diableApiTermination を false に設定することに注意してください。
59
+ NIFTY Cloud 上にインスタンスを作成し SSH 経由で Chef のブートストラップを行います。「ブートストラップ」というのは Chef をインストールして Chef クライアントとして Chef サーバと通信できるようにすることです。利用するブートストラップ・スクリプトは指定したイメージ ID によって自動的に検出されますが、-d オプションや --template-file オプションで上書きすることもできます。インスタンス作成時、あとから knife コマンド経由で削除可能とするために、diableApiTermination を false に設定することに注意してください。
60
+
61
+ また、v0.0.1 からは独自オプションとして -R または --ssh-passphrase オプションで SSH パスフレーズが指定できるようになりました。
55
62
 
56
63
  ### knife nc server delete
57
64
 
@@ -66,17 +73,33 @@ NIFTY Cloud 上にインスタンスを作成し SSH 経由で Chef のブート
66
73
  knife-ec2 にはないオリジナルのコマンドです。現在のアカウントで利用可能なイメージの一覧を表示します。
67
74
  knife nc server create コマンドの -I オプションに渡す Image ID を確認するために利用してください。
68
75
 
76
+ ## NIFTY Cloud イメージ向けブートストラップ
77
+
78
+ knife-nc gem には NIFTY Cloud で提供されているイメージに最適化された 2 つのブートストラップ・スクリプト (nc-centos5-gems, nc-centos6-gems) が同梱されています。
79
+ knife nc server create を利用する際にはイメージ ID に応じて自動で利用すべきスクリプトの判別が行われます。
80
+ knife bootstrap からこのスクリプトを利用するには下記のように -d オプションで識別子を指定してください。
81
+
82
+ knife bootstrap XXX.XXX.XXX.XXX -d nc-centos5-gems
83
+
84
+ なお、サポート対象のイメージ ID と各イメージ ID に対応するスクリプトの識別子は下記の通りです。
85
+
86
+ イメージ ID | OS・ディストリビューション | ブートストラップ・スクリプト | 同梱されている gem
87
+ ------------|----------------------------|------------------------------|-------------------
88
+ 1 | CentOS 5.3 32bit Plain | nc-centos5-gems | knife-nc
89
+ 2 | CentOS 5.3 64bit Plain | nc-centos5-gems | knife-nc
90
+ 6 | CentOS 5.3 32bit Server | nc-centos5-gems | knife-nc
91
+ 7 | CentOS 5.3 64bit Server | nc-centos5-gems | knife-nc
92
+ 13 | CentOS 5.6 64bit Plain | nc-centos5-gems | knife-nc
93
+ 14 | CentOS 5.6 64bit Server | nc-centos5-gems | knife-nc
94
+ 17 | Ubuntu 10.04 64bit Plain | ubuntu10.04-gems | chef
95
+ 21 | CentOS 6.2 64bit Plain | nc-centos6-gems | knife-nc
96
+
69
97
  ## TODO
70
98
 
71
99
  * nc server create の -U オプション (起動スクリプト指定) の動作確認ができていない
72
100
  * nc server create の --template-file オプション (ブートストラップ用テンプレート指定) の動作確認ができていない
73
- * nc server create の -P オプションが SSH Key のパスフレーズに適用されない
74
- * そもそも Chef::Knife::Bootstrap が SSH キーのパスフレーズに対応していないので保留としています
75
- * nc server create の -I オプション (イメージ ID 指定) で一部ブートストラップできないイメージがある
76
- * CentOS 5 + 64bit の組み合わせで Ruby の OpenSSL ライブラリで "Cipher is not a module" エラーが出て止まってしまうようです
77
- * nc server create で利用しているデフォルトの centos5-gems テンプレートを一部修正する必要があります
78
- * EPEL rpm の URL が変更されたため現状動いていないっぽいです、Chef 本体に[こちらの修正](https://github.com/vgirnet/chef/commit/62bdc5a7415025555502583cad5f6a6543e7a954)を適用すれば動きます
79
101
 
80
102
  ## ライセンス
81
103
 
82
- Opscode Chef のプロダクトに準じて Apache Lisence, Version 2.0 を適用します。
104
+ [knife-ec2](https://github.com/opscode/knife-ec2) をベースに NIFTY Cloud 向けに修正を加えたものです。
105
+ オリジナルに準じて Apache Lisence, Version 2.0 を適用します。
@@ -0,0 +1,65 @@
1
+ bash -c '
2
+ <%= "export http_proxy=\"#{knife_config[:bootstrap_proxy]}\"" if knife_config[:bootstrap_proxy] -%>
3
+
4
+ if [ ! -f /usr/bin/chef-client ]; then
5
+ yum erase -y ruby-1.8.5-24.el5
6
+ yum erase -y ruby-libs-1.8.5-24.el5
7
+ yum erase -y ruby-devel-1.8.5-24.el5
8
+
9
+ wget <%= "--proxy=on " if knife_config[:bootstrap_proxy] %>http://dl.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm
10
+ rpm -Uvh epel-release-5-4.noarch.rpm
11
+ wget <%= "--proxy=on " if knife_config[:bootstrap_proxy] %>http://rpm.aegisco.com/aegisco/rhel/aegisco-rhel.rpm
12
+ rpm -Uvh aegisco-rhel.rpm
13
+
14
+ yum install -y gcc gcc-c++ automake autoconf make
15
+ yum --disablerepo=base install -y ruby ruby-devel
16
+
17
+ cd /tmp
18
+ wget <%= "--proxy=on " if knife_config[:bootstrap_proxy] %>http://production.cf.rubygems.org/rubygems/rubygems-1.6.2.tgz
19
+ tar zxf rubygems-1.6.2.tgz
20
+ cd rubygems-1.6.2
21
+ ruby setup.rb --no-format-executable
22
+ fi
23
+
24
+ gem update --system
25
+ gem update
26
+ gem install ohai --no-rdoc --no-ri --verbose
27
+ gem install chef --no-rdoc --no-ri --verbose <%= bootstrap_version_string %>
28
+
29
+ mkdir -p /etc/chef
30
+
31
+ (
32
+ cat <<'EOP'
33
+ <%= validation_key %>
34
+ EOP
35
+ ) > /tmp/validation.pem
36
+ awk NF /tmp/validation.pem > /etc/chef/validation.pem
37
+ rm /tmp/validation.pem
38
+
39
+ <% if @chef_config[:encrypted_data_bag_secret] -%>
40
+ (
41
+ cat <<'EOP'
42
+ <%= encrypted_data_bag_secret %>
43
+ EOP
44
+ ) > /tmp/encrypted_data_bag_secret
45
+ awk NF /tmp/encrypted_data_bag_secret > /etc/chef/encrypted_data_bag_secret
46
+ rm /tmp/encrypted_data_bag_secret
47
+ <% end -%>
48
+
49
+ (
50
+ cat <<'EOP'
51
+ <%= config_content %>
52
+ EOP
53
+ ) > /etc/chef/client.rb
54
+
55
+ (
56
+ cat <<'EOP'
57
+ <% if Chef::Version.new(Chef::VERSION) >= Chef::Version.new('0.10.10') %>
58
+ <%= first_boot.to_json %>
59
+ <% else %>
60
+ <%= { "run_list" => @run_list }.to_json %>
61
+ <% end %>
62
+ EOP
63
+ ) > /etc/chef/first-boot.json
64
+
65
+ <%= start_chef %>'
@@ -0,0 +1,55 @@
1
+ bash -c '
2
+ <%= "export http_proxy=\"#{knife_config[:bootstrap_proxy]}\"" if knife_config[:bootstrap_proxy] -%>
3
+
4
+ if [ ! -f /usr/bin/chef-client ]; then
5
+ yum install -y ruby ruby-devel gcc gcc-c++ automake autoconf make
6
+
7
+ cd /tmp
8
+ wget <%= "--proxy=on " if knife_config[:bootstrap_proxy] %>http://production.cf.rubygems.org/rubygems/rubygems-1.6.2.tgz
9
+ tar zxf rubygems-1.6.2.tgz
10
+ cd rubygems-1.6.2
11
+ ruby setup.rb --no-format-executable
12
+ fi
13
+
14
+ gem update --system
15
+ gem update
16
+ gem install ohai --no-rdoc --no-ri --verbose
17
+ gem install chef --no-rdoc --no-ri --verbose <%= bootstrap_version_string %>
18
+
19
+ mkdir -p /etc/chef
20
+
21
+ (
22
+ cat <<'EOP'
23
+ <%= validation_key %>
24
+ EOP
25
+ ) > /tmp/validation.pem
26
+ awk NF /tmp/validation.pem > /etc/chef/validation.pem
27
+ rm /tmp/validation.pem
28
+
29
+ <% if @chef_config[:encrypted_data_bag_secret] -%>
30
+ (
31
+ cat <<'EOP'
32
+ <%= encrypted_data_bag_secret %>
33
+ EOP
34
+ ) > /tmp/encrypted_data_bag_secret
35
+ awk NF /tmp/encrypted_data_bag_secret > /etc/chef/encrypted_data_bag_secret
36
+ rm /tmp/encrypted_data_bag_secret
37
+ <% end -%>
38
+
39
+ (
40
+ cat <<'EOP'
41
+ <%= config_content %>
42
+ EOP
43
+ ) > /etc/chef/client.rb
44
+
45
+ (
46
+ cat <<'EOP'
47
+ <% if Chef::Version.new(Chef::VERSION) >= Chef::Version.new('0.10.10') %>
48
+ <%= first_boot.to_json %>
49
+ <% else %>
50
+ <%= { "run_list" => @run_list }.to_json %>
51
+ <% end %>
52
+ EOP
53
+ ) > /etc/chef/first-boot.json
54
+
55
+ <%= start_chef %>'
@@ -15,8 +15,10 @@
15
15
  # See the License for the specific language governing permissions and
16
16
  # limitations under the License.
17
17
  #
18
-
18
+ $:.unshift(File.dirname(__FILE__) + '../../') unless $:.include?(File.dirname(__FILE__) + '../../')
19
19
  require 'chef/knife'
20
+ require 'knife-nc/chef_extensions'
21
+ require 'knife-nc/nifty_cloud_sdk_extensions'
20
22
 
21
23
  class Chef
22
24
  class Knife
@@ -53,7 +55,7 @@ class Chef
53
55
  connection = NIFTY::Cloud::Base.new(
54
56
  :access_key => Chef::Config[:knife][:nc_access_key],
55
57
  :secret_key => Chef::Config[:knife][:nc_secret_key]
56
- )
58
+ )
57
59
  end
58
60
  end
59
61
 
@@ -38,7 +38,7 @@ class Chef
38
38
  ui.color('State', :bold)
39
39
  ]
40
40
  connection.describe_images.imagesSet.item.each do |image|
41
- image_list << image.imageId
41
+ image_list << image.imageId
42
42
  image_list << image.name
43
43
  image_list << "#{image.imageOwnerId} (#{image.imageOwnerAlias})"
44
44
  image_list << "#{image.imageState} (#{image.isPublic ? 'public' : 'private'})"
@@ -76,6 +76,12 @@ class Chef
76
76
  :long => "--ssh-password PASSWORD",
77
77
  :description => "The ssh password"
78
78
 
79
+ option :ssh_passphrase,
80
+ :short => "-R PASSPHRASE",
81
+ :long => "--ssh-passphrase PASSPHRASE",
82
+ :description => "The ssh passphrase",
83
+ :proc => Proc.new { |key| Chef::Config[:knife][:ssh_passphrase] = key }
84
+
79
85
  option :ssh_locally,
80
86
  :short => "-L",
81
87
  :long => "--ssh-locally",
@@ -99,8 +105,7 @@ class Chef
99
105
  :short => "-d DISTRO",
100
106
  :long => "--distro DISTRO",
101
107
  :description => "Bootstrap a distro using a template",
102
- :proc => Proc.new { |d| Chef::Config[:knife][:nc_distro] = d },
103
- :default => "centos5-gems"
108
+ :proc => Proc.new { |d| Chef::Config[:knife][:nc_distro] = d }
104
109
 
105
110
  option :nc_template_file,
106
111
  :long => "--template-file TEMPLATE",
@@ -170,22 +175,6 @@ class Chef
170
175
  puts "\n"
171
176
  confirm("Do you really want to create this server")
172
177
 
173
- # monkey patch NIFTY::Cloud::Base (ignore password option and enable user data)
174
- connection.instance_eval do
175
- def run_instances(options)
176
- options[:password] = 'ignoreme'
177
- @user_data = options[:user_data]
178
- super(options)
179
- end
180
- def response_generator(params)
181
- params.delete('Password') if params['Password'] == 'ignoreme'
182
- if @user_data
183
- params['UserData'] = extract_user_data(:user_data => @user_data, :base64_encoded => true)
184
- params['UserData.Encoding'] = 'base64'
185
- end
186
- super(params)
187
- end
188
- end
189
178
  server = connection.run_instances(create_server_def).instancesSet.item.first
190
179
 
191
180
  msg_pair("Instance ID", server.instanceId)
@@ -235,11 +224,25 @@ class Chef
235
224
  bootstrap.config[:run_list] = config[:run_list]
236
225
  bootstrap.config[:ssh_user] = config[:ssh_user]
237
226
  bootstrap.config[:ssh_password] = config[:ssh_password]
227
+ bootstrap.config[:ssh_passphrase] = config[:ssh_passphrase]
238
228
  bootstrap.config[:identity_file] = config[:identity_file]
239
229
  bootstrap.config[:chef_node_name] = config[:chef_node_name] || server.instanceId
240
230
  bootstrap.config[:prerelease] = config[:prerelease]
241
231
  bootstrap.config[:bootstrap_version] = locate_config_value(:nc_bootstrap_version)
242
- bootstrap.config[:distro] = locate_config_value(:nc_distro)
232
+
233
+ image_id = locate_config_value(:nc_image_id)
234
+ if locate_config_value(:nc_distro)
235
+ bootstrap.config[:distro] = locate_config_value(:nc_distro)
236
+ elsif %w(1 2 6 7 13 14).include?(image_id)
237
+ bootstrap.config[:distro] = 'nc-centos5-gems'
238
+ elsif image_id == '17'
239
+ bootstrap.config[:distro] = 'ubuntu10.04-gems'
240
+ elsif image_id == '21'
241
+ bootstrap.config[:distro] = 'nc-centos6-gems'
242
+ else
243
+ bootstrap.config[:distro] = 'nc-centos5-gems'
244
+ end
245
+
243
246
  bootstrap.config[:use_sudo] = true unless config[:ssh_user] == 'root'
244
247
  bootstrap.config[:template_file] = locate_config_value(:nc_template_file)
245
248
  bootstrap.config[:environment] = config[:environment]
@@ -257,7 +260,7 @@ class Chef
257
260
 
258
261
  if @name_args.empty?
259
262
  errors << "You have not provided a valid instance ID."
260
- end
263
+ end
261
264
 
262
265
  if config[:security_group].nil?
263
266
  errors << "You have not provided a valid Security Group."
@@ -286,7 +289,7 @@ class Chef
286
289
 
287
290
  if Chef::Config[:knife][:nc_user_data]
288
291
  begin
289
- server_def.merge!(:user_data => File.read(Chef::Config[:knife][:nc_user_data]))
292
+ server_def.merge!(:user_data => File.read(locate_config_value(:nc_user_data)))
290
293
  rescue
291
294
  ui.warn("Cannot read #{Chef::Config[:knife][:nc_user_data]}: #{$!.inspect}. Ignoring option.")
292
295
  end
@@ -79,7 +79,7 @@ class Chef
79
79
  confirm("Do you really want to delete this server")
80
80
 
81
81
  print "\n#{ui.color("Waiting for server to shutdown", :magenta)}"
82
- connection.stop_instances(:instance_id => instance_id, :force => true)
82
+ connection.stop_instances(:instance_id => instance_id, :force => true)
83
83
  while server.instanceState.name != 'stopped'
84
84
  print "."
85
85
  server = connection.describe_instances(:instance_id => instance_id).reservationSet.item.first.instancesSet.item.first
@@ -43,8 +43,8 @@ class Chef
43
43
  ]
44
44
  connection.describe_instances.reservationSet.item.each do |instance|
45
45
  server = instance.instancesSet.item.first
46
- group = instance.groupSet
47
- server_list << server.instanceId
46
+ group = instance.groupSet
47
+ server_list << server.instanceId
48
48
  server_list << server.ipAddress.to_s
49
49
  server_list << server.privateIpAddress.to_s
50
50
  server_list << server.instanceType
@@ -0,0 +1,54 @@
1
+ #
2
+ # Author:: tily (<tidnlyam@gmail.com>)
3
+ # Copyright:: Copyright (c) 2011 tily
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+ require 'chef/knife'
19
+ require 'chef/knife/ssh'
20
+ require 'chef/knife/bootstrap'
21
+
22
+ class Chef::Knife
23
+ class Ssh
24
+ alias original_session_from_list session_from_list
25
+
26
+ option :ssh_passphrase,
27
+ :long => "--ssh-passphrase PASSPHRASE",
28
+ :description => "Your SSH Passphrase",
29
+ :proc => Proc.new { |key| Chef::Config[:knife][:ssh_passphrase] = key }
30
+
31
+ def session_from_list(list)
32
+ session = original_session_from_list(list)
33
+ session.servers.each do |server|
34
+ server.options[:passphrase] = config[:ssh_passphrase]
35
+ end
36
+ session
37
+ end
38
+ end
39
+
40
+ class Bootstrap
41
+ alias original_knife_ssh knife_ssh
42
+
43
+ option :ssh_passphrase,
44
+ :long => "--ssh-passphrase PASSPHRASE",
45
+ :description => "Your SSH Passphrase",
46
+ :proc => Proc.new { |key| Chef::Config[:knife][:ssh_passphrase] = key }
47
+
48
+ def knife_ssh
49
+ ssh = original_knife_ssh
50
+ ssh.config[:ssh_passphrase] = config[:ssh_passphrase]
51
+ ssh
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,37 @@
1
+ #
2
+ # Author:: tily (<tidnlyam@gmail.com>)
3
+ # Copyright:: Copyright (c) 2011 tily
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+ require 'NIFTY'
19
+
20
+ class NIFTY::Cloud::Base
21
+ alias original_run_instances run_instances
22
+ alias original_response_generator response_generator
23
+ def run_instances(options)
24
+ options[:password] = 'ignoreme' unless options[:password]
25
+ @user_data = options[:user_data]
26
+ original_run_instances(options)
27
+ end
28
+
29
+ def response_generator(params)
30
+ params.delete('Password') if params['Password'] == 'ignoreme'
31
+ if @user_data
32
+ params['UserData'] = extract_user_data(:user_data => @user_data, :base64_encoded => true)
33
+ params['UserData.Encoding'] = 'base64'
34
+ end
35
+ original_response_generator(params)
36
+ end
37
+ end
@@ -1,6 +1,6 @@
1
1
  module Knife
2
2
  module Nc
3
- VERSION = "0.0.0"
3
+ VERSION = "0.0.1"
4
4
  MAJOR, MINOR, TINY = VERSION.split('.')
5
5
  end
6
6
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: knife-nc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0
4
+ version: 0.0.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-03-20 00:00:00.000000000Z
12
+ date: 2012-06-03 00:00:00.000000000Z
13
13
  dependencies: []
14
14
  description: NIFTY Cloud Support for Chef's Knife Command
15
15
  email:
@@ -24,16 +24,20 @@ files:
24
24
  - .rspec
25
25
  - Gemfile
26
26
  - LICENSE
27
+ - README.md
27
28
  - Rakefile
28
29
  - knife-nc.gemspec
30
+ - lib/chef/knife/bootstrap/nc-centos5-gems.erb
31
+ - lib/chef/knife/bootstrap/nc-centos6-gems.erb
29
32
  - lib/chef/knife/nc_base.rb
30
33
  - lib/chef/knife/nc_image_list.rb
31
34
  - lib/chef/knife/nc_server_create.rb
32
35
  - lib/chef/knife/nc_server_delete.rb
33
36
  - lib/chef/knife/nc_server_list.rb
37
+ - lib/knife-nc/chef_extensions.rb
38
+ - lib/knife-nc/nifty_cloud_sdk_extensions.rb
34
39
  - lib/knife-nc/version.rb
35
40
  - spec/spec_helper.rb
36
- - README.md
37
41
  homepage: https://github.com/tily/ruby-knife-nc
38
42
  licenses: []
39
43
  post_install_message: