knife-oca
Knife plugin for OCA (OpenNebula Cloud API)
Requirements
-
The oca gem is needed for oca provider in fog.
-
The net-scp is optional and needed if you use ‘knife oca template instantiate’ with the ‘–is-chef-server’ option.
gem install oca net-scp
-
Install patched fog
-
Clone the official
fog
gem source (and checkout version 1.5.0): -
Checkout
eaaf335870436499fe61c62fe42f44cd9e1584d0
(it’s a dev commit after 1.5.0 release, you might want to skip this step if you know what you are doing :) ) -
Install fog merged with my oca branch:
https://github.com/Reverand221/fog/tree/oca
-
Pull my fog oca provider
-
Build the fog gem
-
Install the fog gem
git clone git://github.com/fog/fog.git cd fog git checkout eaaf335870436499fe61c62fe42f44cd9e1584d0 git remote add fog-oca git://github.com/Reverand221/fog.git git pull fog-oca oca gem build fog.gemspec gem install fog-1.5.0.gem
-
Status
This gem contains the minimal api support that I required for my personal task. It is far away from being complete. The same is true for my oca fog provider. I have no plans to support more features unless I need them myself or there is heavy demand.
Assumptions
-
You have a OpenNebula 3.2+ private cloud instance running and its XML-RPC endpoint visible from your workstation.
-
You have two types of Virtual Machine Images prepared and uploaded to your OpenNebula cloud as templates:
-
chef-server: A *nix installation with a chef server and a ssh daemon preinstalled and setup to start operation on VM boot.
-
naked: Some basic *nix installation with a ssh daemon preinstalled and setup to start operation on VM boot.
-
-
The VM IP Adresses have DNS names and are registered in the reverse domain.
Installation
See requirements above !!!
gem install knife-oca
Usage Example
Setup a directory structure as following:
demo
|-- cookbooks
|-- knife.rb
|-- roles
Put your cookbooks and roles into the corresponding subdirectories.
The knife.rb file should contain the following:
oca_one_auth 'user:passwd'
oca_xml_rpc_endpoint 'http://frontend.opennebula.example:2633/RPC2'
ssh_password 'sshP4Ssw0Rd'
ssh_user 'sshuser'
The values should be replaced with the credentials to your OpenNebula cloud frontend and the ssh daemons on your VMs.
> knife oca template list
ID Name Architecture CPUs Memory
11 debian64-6.0.5-chef-server-10.12 x86_64 2 5632
12 debian64-6.0.5-naked x86_64 1 2816
Instantiate a Chef server. Template No 11 has a preinstalled chef server which starts operation on bootup.
> knife oca template instantiate 11 --is-chef-server
Instance ID: 175
Template: debian64-6.0.5-chef-server-10.12
# CPUs: 2
Memory: 5632
Architecture: x86_64
Waiting for server.............................................................done
Public DNS Name: vm-0059.cloud.example.com
Public IP Address: 10.17.0.89
Waiting for sshd......done
Downloading file vm-0059.cloud.example.com:/etc/chef/validation.pem to /demo ...
Downloading file vm-0059.cloud.example.com:/etc/chef/webui.pem to /demo ...
done
Creating initial API user...
Created client[someuser]
Configuration file written to /demo/knife.rb
Instance ID: 175
Template: debian64-6.0.5-chef-server-10.12
# CPUs: 2
Memory: 5632
Architecture: x86_64
Public DNS Name: vm-0059.cloud.example.com
Public IP Address: 10.17.0.89
Environment: _default
Knife config generated: /demo/knife.rb
This command launched the chef server template and fully configured our workstation knife for the use with this new chef server. Let’s have a look into the knife.rb
file:
log_level :info
log_location STDOUT
node_name 'someuser'
client_key '/demo/someuser.pem'
validation_client_name 'chef-validator'
validation_key '/demo/validation.pem'
chef_server_url 'https://vm-0059.cloud.example.com:443'
cache_type 'BasicFile'
( :path => '/demo/checksums' )
cookbook_path [ '/demo/cookbooks' ]
oca_one_auth 'user:passwd'
oca_xml_rpc_endpoint 'http://frontend.opennebula.example:2633/RPC2'
ssh_password 'sshP4Ssw0Rd'
ssh_user 'sshuser'
A knife status
will show the chef server node itself if you are running a chef-client
.
> knife status
8 minutes ago, vm-0059.cloud.example.com, vm-0059.cloud.example.com, 10.17.0.89, debian 6.0.5.
knife oca server list
will list the corresponding virtual machines in OpenNebula.
> knife oca server list
ID Public IP Public DNS Name State CPUs Memory Template
175 10.17.0.89 vm-0059.cloud.example.com runn 2 5632 debian64-6.0.5-chef-server-10.12
You can upload your cookbooks and roles now with knife cookbook upload
and knife role from file
.
Now we want to launch naked VMs and bootstrap them with a chef-client. Optionally you can directly pass a run list with the command, e.g. knife oca template instantiate 12 --run-list 'role[samplerole]'
> knife oca template instantiate 12
Instance ID: 176
Template: debian64-6.0.5-naked
# CPUs: 1
Memory: 2816
Architecture: x86_64
Waiting for server...............................done
Public DNS Name: vm-005a.cloud.example.com
Public IP Address: 10.17.0.90
Waiting for sshd.....done
Bootstrapping Chef on vm-005a.cloud.example.com
vm-005a.cloud.example.com --2012-09-11 16:56:46-- http://opscode.com/chef/install.sh
vm-005a.cloud.example.com Resolving opscode.com...
vm-005a.cloud.example.com 184.106.28.82
vm-005a.cloud.example.com Connecting to opscode.com|184.106.28.82|:80...
vm-005a.cloud.example.com connected.
vm-005a.cloud.example.com HTTP request sent, awaiting response...
vm-005a.cloud.example.com 301 Moved Permanently
vm-005a.cloud.example.com Location: http://www.opscode.com/chef/install.sh [following]
vm-005a.cloud.example.com --2012-09-11 16:56:51-- http://www.opscode.com/chef/install.sh
vm-005a.cloud.example.com Resolving www.opscode.com...
vm-005a.cloud.example.com 184.106.28.82
vm-005a.cloud.example.com Reusing existing connection to opscode.com:80.
vm-005a.cloud.example.com HTTP request sent, awaiting response...
vm-005a.cloud.example.com 200 OK
vm-005a.cloud.example.com Length: 5801 (5.7K) [application/x-sh]
vm-005a.cloud.example.com Saving to: “STDOUT”
vm-005a.cloud.example.com
0% [ ] 0 --.-K/s
100%[======================================>] 5,801 --.-K/s in 0.1s
vm-005a.cloud.example.com
vm-005a.cloud.example.com 2012-09-11 16:56:57 (51.8 KB/s) - written to stdout [5801/5801]
vm-005a.cloud.example.com
vm-005a.cloud.example.com Downloading Chef 10.12.0 for debian...
vm-005a.cloud.example.com Installing Chef 10.12.0
vm-005a.cloud.example.com Selecting previously deselected package chef.
vm-005a.cloud.example.com (Reading database ...
(Reading database ... 65%
(Reading database ... 70%
(Reading database ... 75%
(Reading database ... 80%
(Reading database ... 85%
(Reading database ... 90%
(Reading database ... 95%
(Reading database ... 22593 files and directories currently installed.)
vm-005a.cloud.example.com Unpacking chef (from /tmp/chef_10.12.0_amd64.deb) ...
vm-005a.cloud.example.com Setting up chef (10.12.0-1.debian.6.0.4) ...
vm-005a.cloud.example.com Thank you for installing Chef!
vm-005a.cloud.example.com [Tue, 11 Sep 2012 16:57:43 +0200] INFO: *** Chef 10.12.0 ***
vm-005a.cloud.example.com [Tue, 11 Sep 2012 16:57:45 +0200] INFO: Client key /etc/chef/client.pem is not present - registering
vm-005a.cloud.example.com [Tue, 11 Sep 2012 16:57:46 +0200] INFO: HTTP Request Returned 404 Not Found: Cannot load node vm-005a.cloud.example.com
vm-005a.cloud.example.com [Tue, 11 Sep 2012 16:57:46 +0200] INFO: Setting the run_list to [] from JSON
vm-005a.cloud.example.com [Tue, 11 Sep 2012 16:57:46 +0200] INFO: Run List is []
vm-005a.cloud.example.com [Tue, 11 Sep 2012 16:57:46 +0200] INFO: Run List expands to []
vm-005a.cloud.example.com [Tue, 11 Sep 2012 16:57:46 +0200] INFO: Starting Chef Run for vm-005a.cloud.example.com
vm-005a.cloud.example.com [Tue, 11 Sep 2012 16:57:46 +0200] INFO: Running start handlers
vm-005a.cloud.example.com [Tue, 11 Sep 2012 16:57:46 +0200] INFO: Start handlers complete.
vm-005a.cloud.example.com [Tue, 11 Sep 2012 16:57:46 +0200] INFO: Loading cookbooks []
vm-005a.cloud.example.com [Tue, 11 Sep 2012 16:57:46 +0200] WARN: Node vm-005a.cloud.example.com has an empty run list.
vm-005a.cloud.example.com [Tue, 11 Sep 2012 16:57:46 +0200] INFO: Chef Run complete in 0.3328068 seconds
vm-005a.cloud.example.com [Tue, 11 Sep 2012 16:57:46 +0200] INFO: Running report handlers
vm-005a.cloud.example.com [Tue, 11 Sep 2012 16:57:46 +0200] INFO: Report handlers complete
Instance ID: 176
Template: debian64-6.0.5-naked
# CPUs: 1
Memory: 2816
Architecture: x86_64
Public DNS Name: vm-005a.cloud.example.com
Public IP Address: 10.17.0.90
Environment: _default
The new node will be registered with the chef server
> knife status
25 minutes ago, vm-0059.cloud.example.com, vm-0059.cloud.example.com, 10.17.0.89, debian 6.0.5.
11 minutes ago, vm-005a.cloud.example.com, vm-005a.cloud.example.com, 10.17.0.90, debian 6.0.5.
and with OpenNebula.
> knife oca server list
ID Public IP Public DNS Name State CPUs Memory Template
175 10.17.0.89 vm-0059.cloud.example.com runn 2 5632 debian64-6.0.5-chef-server-10.12
176 10.17.0.90 vm-005a.cloud.example.com runn 1 2816 debian64-6.0.5-naked
We might decide to delete a node eventually. --purge
will delete the node also on the chef server:
> knife oca server delete 176 --purge -y
ID: 176
Public IP: 10.17.0.90
Public DNS Name: vm-005a.cloud.example.com
Template: debian64-6.0.5-naked
WARNING: Deleted server 176
WARNING: Deleted node vm-005a.cloud.example.com
WARNING: Deleted client vm-005a.cloud.example.com
> knife status
29 minutes ago, vm-0059.cloud.example.com, vm-0059.cloud.example.com, 10.17.0.89, debian 6.0.5.
> knife oca server list
ID Public IP Public DNS Name State CPUs Memory Template
175 10.17.0.89 vm-0059.cloud.example.com runn 2 5632 debian64-6.0.5-chef-server-10.12
Reference Documentation
- knife oca server list
- knife oca server delete ID [ID …]
-
--purge
to delete node on chef server too - knife oca template list
- knife oca template instantiate ID
-
--is-chef-server
to not bootstrap and configure knife--run-list
to supply the initial run list
In-depth documentation of all the available options can be listed by appending --help
to the above commands.
Feedback
Pls contact me directly on any matter at <[email protected]>
.
License
This knife-oca gem is based on the https://github.com/opscode/knife-ec2
source.
# Author:: Dennis Klein (<[email protected]>)
# Copyright:: Copyright (c) 2012 GSI Helmholtz Centre for Heavy Ion Research.
#
# Author:: Adam Jacob (<[email protected]>)
# Author:: Seth Chisamore (<[email protected]>)
# Copyright:: Copyright (c) 2010-2011 Opscode, Inc.
#
# License:: Apache License, Version 2.0
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.