Giter Club home page Giter Club logo

mccloud's Introduction

Note: documentation is currently in flux

About

What the hell is mccloud?

Build Status

Over the years I fell in love with Vagrant and wanted to have the same workflow for ec2, kvm, internal clouds etc..

Therefore Mccloud aims to be the equivalent of vagrant but extending it to use providers:

  • aws/ec2
  • kvm
  • simple scripts
  • and of course vagrant itself.

I'm aware vagrant might extend it's providers in the future; still as they are currently not yet implemented I thought I'd share this code with you. As new provider will become available in vagrant they will also be available in mccloud through the vagrant provider

Kudos to great stuff

Without the following opensource software this would not be that awesome!

  • Vagrant is great for testing machines on your local machines
  • Fog is a great fog library for managing cloud systems
  • Fission is a gem to interact with vmware fusion machines

Kudos to the authors!

Why not in vagrant?

NOTE: mccloud is meant to be complementary to vagrant - we truely love @mitchellh

  • Main reason - this code has been around way before there was discussion on vagrant new providers
  • Companies are using it now as it supports EC2, KVM, scripts, NOW
  • Vagrant is (currently) focused on desktop vm types only - this extends it to server based cloud solution
  • Once providers are available in vagrant, you can easily switch: the effort is not in the Mccloudfile or Vagrantfile syntax but in the provisioning
  • Vagrant moves away from the 'gem ' support and targets fat installers - I need this code available as a library
  • Vagrant new setup requires root to be installed - not what I want
  • Vagrant builder (might) replace veewee with new setup - I want to continue working with it now

Bottom line - if vagrant has the new plugin architecture going and documented I'm happy to review again

Installation

Requirements

  • You currently need ruby installed. Either use the system ruby or install rvm
  • libxml, libxslt and nokogiri

Using the stable gem

$ gem install mccloud

Using the cutting edge github code

$ git clone [email protected]:jedi4ever/mccloud.git
$ cd mccloud
# Note when you use rvm , there is an .rvmrc that will set some aliases
$ bundle install
$ bundle exec mccloud

Configuration

Similar to a Vagrantfile, mccloud has a Mccloudfile where all is configured. TODO: there is currently no mccloud init as it's hard to guess your preferred options

Mccloudfile Skeleton

A mccloudfile is actually a ruby code file with a specific block

Mccloud::Config.run do |config|
end

Provider section

As mccloud supports multiple providers , the first part you need to do it define the providers you want to use

Provider AWS

You can use this provider to create/manage ec2 instances.

As this relies on fog, you first have to create a fog configuration file

$ cat $HOME/.fog
:default:
  :aws_access_key_id: <your id here>
  :aws_secret_access_key: <your acess key here>

The syntax to use for an ec2

Mccloud::Config.run do |config|

  # Define a :aws provider 'aws-us-east'
  config.provider.define "aws-us-east" do |provider_config|

    #Note: this are option provided to fog for creation
    provider_config.provider.options = { }

    provider_config.provider.flavor = :aws

    # Region in which to create the VM
    provider_config.provider.region = "us-east-1"

    ## Check if necessary keypairs exist
    ## To speed things up, set it to false
    provider_config.provider.check_keypairs = false

    ## Disable check if required security groups exist
    ## To speed things up, set it to false
    provider_config.provider.check_security_groups =  false

    ## If you share an amazon account with multiple people
    ## You can use namespaces to separate resources
    ## All resources will take this prefix
    provider_config.provider.namespace = ""

    ## Fog credential pair to use in .fog file
    provider_config.provider.credential = :default

  end
end

If using the aws/ec see also the section about defining keystores and keypairs

Provider host

Useful with machines that are only ssh-able and where you don't have create options

Mccloud::Config.run do |config|

  # Define a :host provider 'host-provider' that is ssh-able
  config.provider.define "host-provider" do |provider_config|
    provider_config.provider.flavor = :host
  end

end

Provider vagrant

Have mccloud pick up your Vagrantfile

Mccloud::Config.run do |config|

  # Define a :vagrant provider 'vagrant-provider'
  config.provider.define "vagrant-provider" do |provider_config|
    provider_config.provider.flavor = :vagrant
  end
end

Provider script

Usefull if your cloud doesn't have an ip, but you can create start,stop, etc... scripts to do the work

Mccloud::Config.run do |config|

  datacenter_settings = {
    :DATACENTER => 'belgium',
    :ENVIRONMENT => 'test'
  }

  # Define a :script provider 'script-provider'
  config.provider.define "script-provider" do |provider_config|
    provider_config.provider.flavor = :script


    # environment variables to pass to the scripts
    # these are passed as MCCLOUD_<varname>
    provider_config.provider.variables = datacenter_settings

    # No need for a namespace
    provider_config.provider.namespace = ""

    # location of the start, stop etc.. scripts
    provider_config.provider.script_dir = "myscript-provider"
  end

end

Provider kvm (might not work out of the box)

this works together with veewee that support creating kvm template machines. Like on vagrant, mccloud clones a veewee created vm

config.provider.define "kvm-libvirt" do |config|
  config.provider.flavor=:libvirt
  config.provider.options={ :libvirt_uri => "qemu+ssh://ubuntu@kvmbox/system" }
  config.provider.namespace="test"
end

Keypair section

Currently only used by aws provider. Allows you to define a re-usable name for keypairs for each aws region

config.keypair.define "mccloud" do |key_config|
  key_config.keypair.public_key_path = "#{File.join(ENV['HOME'],'.ssh','mccloud_rsa.pub')}"
  key_config.keypair.private_key_path = "#{File.join(ENV['HOME'],'.ssh','mccloud_rsa')}"
end

Keystore section

Currently only used by aws provider. Allows you to define multiple keystores for your aws keys

config.keystore.define "aws-us-east-key-store" do |keystore_config|
  keystore_config.keystore.provider = "aws-us-east"
  keystore_config.keystore.keypairs = [
    # :name is the name as it will be displayed on amazon
    # :keypair is the named as defined  in the mccloudfile
    { :name => "mccloud", :keypair => "mccloud"},
  ]
end

IP definitions

config.ip.define "ip-demo1" do |config|
  config.ip.provider="aws-eu-west"
  config.ip.address="46.137.72.170"
  config.ip.vmname = "aws-demo1"
end

LB definitions

config.lb.define "mccloud-development-patrick-lb" do |config|
 config.lb.provider="aws-eu-west"
 config.lb.members=["aws-demo2","aws-demo1"]
 config.lb.sorry_members=["aws-demo2"]
end

Template/definitions

TODO

VM definitions

Core vm

Sharing of files is done over rsync because cloud based architectures don't have the ability to mount local folders

vm_config.vm.share_folder("somename", "/source/inthemachinepath", "localmachinepath")

vm_config.vm.bootstrap = "somescript"
vm_config.vm.bootstrap_user = "root"
vm_config.vm.bootstrap_password = "blabla"
vm_config.vm.user = "ubuntu"

vm_config.vm.name
vm_config.vm.port

vm_config.vm.private_key_path
vm_config.vm.public_key_path
vm_config.vm.agent_forwarding
vm_config.vm.autoselection
vm_config.vm.bootstrap
vm_config.vm.bootstrap_user
vm_config.vm.bootstrap_password

vm_config.vm.forward_port

AWS vm

vm.ami
vm.key_name
vm.security_groups = Array
vm.user_data
vm.flavor
vm.user

config.vm.define "demo" do |config|
 config.vm.provider="aws-eu-west"
 config.vm.ami="ami-e59ca991"
 config.vm.flavor="t1.micro"
 config.vm.zone="eu-west-1a"
 config.vm.user="ubuntu"
 config.vm.security_groups=["thesecuritygroup"]
 config.vm.key_name="mccloud-key-patrick"
 config.vm.bootstrap="definitions/ubuntu/bootstrap-ubuntu-system.sh"
 config.vm.private_key_path="keys/mccloud_rsa"
 config.vm.public_key_path="keys/mccloud_rsa.pub"
end

this is the way we are currently mounting EBS Volumes with Mccloud. For attaching an EBS volume created from a Snaphot;

  # see http://fog.io/1.1.2/rdoc/Fog/Compute/AWS/Servers.html
  # and https://github.com/fog/fog/blob/v1.1.2/lib/fog/aws/requests/compute/run_instances.rb
  config.vm.create_options = {
    :block_device_mapping => [
      { "DeviceName" => "/dev/sdf", "Ebs.SnapshotId" =>

"snap-d056d786", "Ebs.DeleteOnTermination" => true } ] }

Or, for attaching a newly created EBS volume:

config.vm.create_options = {
:block_device_mapping => [
{ "DeviceName" => "/dev/sdf", "Ebs.VolumeSize" => "100",
"Ebs.DeleteOnTermination" => false }
]
}

The mounting we then do our provision.sh script:

  echo "/dev/sdf1 /mnt/ebs ext4 defaults 0 0" >> /etc/fstab
  mkdir -p /mnt/ebs
  mount -a

Fog vm

Vagrant vm

config.vm.define "compute1" do |vm_config|
  vm_config.vm.provider   = "vagrant"
end

Host vm

config.vm.define "mycoolhost.com" do |config|
  config.vm.provider=:hosts
  config.vm.ip_address="mycoolhost.com"
  config.vm.user="ubuntu"
  config.vm.port = "2222"
  config.vm.bootstrap  = "bootstrap/centos-603"
  config.vm.agent_forwarding = true
end

KVM vm

config.vm.define "backend" do |config|
 config.vm.provider="juno-libvirt"

 config.vm.create_options={
   :network_interface_type => "bridge",
   :volume_template_name => "test-baseimage.img",
   :cpus => "3",
   :memory_size => 2*1024*1024, #2 GB
 }
 config.vm.user="ubuntu"
 config.vm.bootstrap="definitions/ubuntu/bootstrap-ubuntu-system.sh"
 config.vm.private_key_path="keys/mccloud_rsa"
 config.vm.public_key_path="keys/mccloud_rsa.pub"
end

Vmfusion vm

need to check this

Provisioners

You can use multiple provisioners per vm

Puppet apply provisioner

manifest_file
manifest_path
module_paths = Array
pp_path
options

vm_config.vm.provision :puppet do |puppet|
  puppet_flags = "--verbose --show_diff"
  puppet.manifest_file = "site.pp"
  puppet.pp_path = "/var/tmp/puppet"
  puppet.manifests_path = "puppet/manifests"
  puppet.module_path = [ "puppet/modules" ,"puppet/my-modules"]
  puppet.options = puppet_flags
end

Chef-solo provisioner

cookbooks_path
roles_path
provisioning_path
data_bags_path
encrypted_data_bag_secret_key_path
json
json_erb
clean_after_run
roles

mccloud server is added to json

add_role(name)
add_recipe(name)

 # Read chef solo nodes files
 require 'chef'
 nodes = []
 Dir["data_bags/node/*.json"].each do |n|
       nodes << JSON.parse(IO.read(n))
 end

 nodes.each do |n|
   config.vm.define n.name do |vm_config|
     vm_config.vm.provider   = "host"
     vm_config.vm.ip_address = n.automatic_attrs[:ipaddress]
     vm_config.vm.user       = n.automatic_attrs[:sudo_user]

     vm_config.vm.bootstrap  = File.join("bootstrap","bootstrap-#{n.automatic_attrs[:platform]}.sh")
     vm_config.vm.bootstrap_user  = n.automatic_attrs[:bootstrap_user]
     vm_config.vm.bootstrap_password  = n.automatic_attrs[:bootstrap_password]

     vm_config.vm.provision :chef_solo do |chef|
      chef.cookbooks_path = [ "cookbooks", "site-cookbooks" ]
      chef.roles_path = "roles"
      chef.data_bags_path = "data_bags"
      chef.encrypted_data_bag_secret_key_path = "my_databag_secret"
      chef.clean_after_run = false

      chef.json.merge!(n.default_attrs)
      chef.json.merge!(n.automatic_attrs)
      chef.json.merge!(n.override_attrs)

      chef.add_role n.chef_environment
      chef.add_role n.automatic_attrs[:platform]

      n.run_list.run_list_items.each do |r|
        chef.add_role r.name if r.type == :role
        chef.add_recipe r.name if r.type == :recipe
      end
    end #end provisioner

  end #end vm define
end # nodes.each


 # Using ips in erb json
 chef.json.merge!({
   :logger => {
            :redis_host_ip => "<%= private_ips['frontend'] %>"
        }
 })

 # Defining a default node
  def default_node(chef)
    chef.add_recipe("ntp")
    chef.add_recipe("timezone")
    chef.json.merge!({
      :nagios_host_ip => "<%= private_ips['monitoring'] %>",
      :ruby => {
      :version => "1.9.2",
      :patch_level => "p180"}}
    })
  end

Shell provisioner

option command.sudo = true|false

  config.vm.provision :shell do |command|
    command.inline="uptime"
  end

  config.vm.provision :shell do |command|
    command.path="script.sh"
  end

Usage

Some functions are there in the CLI, but they are left overs from previous coding sessions.

Mostly working

Tasks:

mccloud version                      # Prints the Mccloud version information

mccloud bootstrap [NAME] [FILENAME]  # Executes the bootstrap sequence
mccloud destroy [NAME]               # Destroys the machine
mccloud forward [NAME]               # Forwards ports from a machine to localhost
mccloud halt [NAME]                  # Shutdown the machine
mccloud help [TASK]                  # Describe available tasks or one specific task
mccloud image                        # Subcommand to manage images
mccloud up [NAME]                    # Starts the machine and provisions it
mccloud provision [NAME]             # Provisions the machine
mccloud reload [NAME]                # Reboots the machine
mccloud ssh [NAME] [COMMAND]         # Ssh-shes into the box
mccloud status [name]                # Shows the status of the current Mccloud environment

mccloud lb                           # Subcommand to manage Loadbalancers
mccloud balance [LB-NAME]            # Balances loadbalancers
mccloud sorry [LB-NAME]              # Puts loadbalancers in a sorry state

mccloud ip                           # Subcommand to manage IP's
mccloud ips [NAME]                   # Associate IP addresses

Experimental/Not checked

mccloud define NAME TEMPLATE-NAME    # Creates a new definition based on a tempate
mccloud init                         # Initializes a new Mccloud project

mccloud keypair                      # Subcommand to manage keypairs
mccloud keystore                     # Subcommand to manage keystores

mccloud package [NAME]               # Packages the machine
mccloud template                     # Subcommand to manage templates
mccloud vm                           # Subcommand to manage vms

DISCLAIMER:

this is eternal beta sofware . Don't trust it:) And don't complain if it removes all your EC instances at once....

mccloud's People

Contributors

btm avatar cwarden avatar jedi4ever avatar kr3l avatar robonaut avatar tknerr avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

mccloud's Issues

How to use bootstrap templates?

Right now I'm doing something like this:

Mccloud::Config.run do |config|

  config.vm.define "web" do |web_config|

    # TODO: is there shorter way to reference them?
    web_config.vm.bootstrap="W:/tools/vagrant/vagrant/vagrant/embedded/lib/ruby/gems/1.9.1/gems/mccloud-0.0.13/lib/mccloud/templates/bootstrap/bootstrap-ubuntu-system.sh"

  end
end

But this looks pretty wrong to me :-)

I guess I have not yet understood how to use the bootstrap templates with Mccloud... Can someone enlighten me?

Absence of .fog file will cause abrupt exit of `mccloud vm list` when first ec2 instance is encountered.

When more than one provider is configured, listing VMs will abruptly halt on the first ec2 provided VM if a ~/.fog file is not found, regardless of whether or not there are additional non-ec2 VMs to be listed.

For example, we currently see:

alias                         |provider            |ip-address
--------------------------------------------------------------------------------
alias1                        |provider            |          
Missing Credentials
Create the file /home/username/.fog with the following content:                                                                                                                                                        
=====================  snippet begin =====================                                                                                                                                                           
---                                                                                                                                                                                                                  
:xxxxxxxxx:                                                                                                                                                                                                          
  :aws_access_key_id: <your aws_access_key_id>                                                                                                                                                                       
  :aws_secret_access_key: <your aws_secret_access_key>                                                                                                                                                               

=====================  snippet end   =====================

Note the absence of "alias3". With a ~/.fog file, we might expect to see:

alias                         |provider            |ip-address
--------------------------------------------------------------------------------
alias1                        |providerA           |          
alias2                        |aws-us-east         |
alias3                        |providerA           |          

Update fog dependency

would you mind updating the fog dependency to 1.6.0 for compatibility with the latest veewee version?

Keypair management does not work?

Given a Mccloudfile like below I was expecting that

  1. the keypairs defined in config.keystore.define would be created within AWS
  2. within config.vm.define I could simply reference the keypair

Mccloudfile:

Mccloud::Config.run do |config|

  # locate keypair for use with mccloud (must be present or will be created upon `mccloud init`)
  config.keypair.define "my-mccloud-keypair" do |key_config|
    key_config.keypair.public_key_path = "#{File.join(ENV['HOME'],'.ssh','mccloud_rsa.pub')}"
    key_config.keypair.private_key_path = "#{File.join(ENV['HOME'],'.ssh','mccloud_rsa')}"
  end

  # define keypairs to be created within AWS
  config.keystore.define "aws-us-east-key-store" do |keystore_config|
    keystore_config.keystore.provider = "aws-us-east"
    keystore_config.keystore.keypairs = [
      # :name is the name as it will be displayed on amazon
      # :pairname is the named as defined above
      { :name => "my-mccloud-key", :pairname => "my-mccloud-keypair" },
    ]
  end

  config.vm.define "web" do |web_config|
    web_config.vm.provider= "aws-us-east"
    web_config.vm.ami = "ami-3c994355"
    web_config.vm.flavor = "m1.small"
    web_config.vm.zone = "us-east-1a"
    web_config.vm.user="ubuntu"

    web_config.vm.key_name = "my-mccloud-key"

  end
end

However, it seems that both expectations are not met.

When I created the keypair manually via the AWS console, then I run into this error:

W:\tmp\demo>mccloud up web
Loaded providers[1] vms[1] ips[0] lbs[0] stacks[0] templates[1] keypairs[1] keystores[1]
Creating new vm web for provider aws-us-east
[web] - Waiting for the machine to become accessible
.................
[web] - Waiting for ssh port to become available
[web] - Ssh Port is available

Waiting for ssh login on 23.22.123.163 with user ubuntu to sshd on port => 22 to work (Timeout in 6000 seconds)
.Something blew up Mccloud. Time for McGuyver:

can't convert nil into String
W:/tools/vagrant/vagrant/vagrant/embedded/lib/ruby/gems/1.9.1/gems/net-ssh-2.2.2/lib/net/ssh/authentication/key_manager.rb:64:in `expand_path'
W:/tools/vagrant/vagrant/vagrant/embedded/lib/ruby/gems/1.9.1/gems/net-ssh-2.2.2/lib/net/ssh/authentication/key_manager.rb:64:in `add'
W:/tools/vagrant/vagrant/vagrant/embedded/lib/ruby/gems/1.9.1/gems/net-ssh-2.2.2/lib/net/ssh/authentication/session.rb:60:in `block in authenticate'
W:/tools/vagrant/vagrant/vagrant/embedded/lib/ruby/gems/1.9.1/gems/net-ssh-2.2.2/lib/net/ssh/authentication/session.rb:60:in `each'
W:/tools/vagrant/vagrant/vagrant/embedded/lib/ruby/gems/1.9.1/gems/net-ssh-2.2.2/lib/net/ssh/authentication/session.rb:60:in `authenticate'
W:/tools/vagrant/vagrant/vagrant/embedded/lib/ruby/gems/1.9.1/gems/net-ssh-2.2.2/lib/net/ssh.rb:190:in `start'
W:/tools/vagrant/vagrant/vagrant/embedded/lib/ruby/gems/1.9.1/gems/mccloud-0.0.13/lib/mccloud/util/ssh.rb:20:in `block in when_ssh_login_works'
W:/tools/vagrant/vagrant/vagrant/embedded/lib/ruby/1.9.1/timeout.rb:68:in `timeout'
W:/tools/vagrant/vagrant/vagrant/embedded/lib/ruby/gems/1.9.1/gems/mccloud-0.0.13/lib/mccloud/util/ssh.rb:15:in `when_ssh_login_works'
W:/tools/vagrant/vagrant/vagrant/embedded/lib/ruby/gems/1.9.1/gems/mccloud-0.0.13/lib/mccloud/provider/aws/vm/up.rb:95:in `up'
W:/tools/vagrant/vagrant/vagrant/embedded/lib/ruby/gems/1.9.1/gems/mccloud-0.0.13/lib/mccloud/provider/aws/provider.rb:133:in `block in up'
W:/tools/vagrant/vagrant/vagrant/embedded/lib/ruby/gems/1.9.1/gems/mccloud-0.0.13/lib/mccloud/provider/core/provider.rb:53:in `on_selected_components'
W:/tools/vagrant/vagrant/vagrant/embedded/lib/ruby/gems/1.9.1/gems/mccloud-0.0.13/lib/mccloud/provider/aws/provider.rb:132:in `up'
W:/tools/vagrant/vagrant/vagrant/embedded/lib/ruby/gems/1.9.1/gems/mccloud-0.0.13/lib/mccloud/command/up.rb:12:in `block in execute'
W:/tools/vagrant/vagrant/vagrant/embedded/lib/ruby/gems/1.9.1/gems/mccloud-0.0.13/lib/mccloud/command/up.rb:10:in `each'
W:/tools/vagrant/vagrant/vagrant/embedded/lib/ruby/gems/1.9.1/gems/mccloud-0.0.13/lib/mccloud/command/up.rb:10:in `execute'
W:/tools/vagrant/vagrant/vagrant/embedded/lib/ruby/gems/1.9.1/gems/thor-0.14.6/lib/thor/task.rb:22:in `run'
W:/tools/vagrant/vagrant/vagrant/embedded/lib/ruby/gems/1.9.1/gems/thor-0.14.6/lib/thor/invocation.rb:118:in `invoke_task'
W:/tools/vagrant/vagrant/vagrant/embedded/lib/ruby/gems/1.9.1/gems/thor-0.14.6/lib/thor/invocation.rb:124:in `block in invoke_all'
W:/tools/vagrant/vagrant/vagrant/embedded/lib/ruby/gems/1.9.1/gems/thor-0.14.6/lib/thor/invocation.rb:124:in `each'
W:/tools/vagrant/vagrant/vagrant/embedded/lib/ruby/gems/1.9.1/gems/thor-0.14.6/lib/thor/invocation.rb:124:in `map'
W:/tools/vagrant/vagrant/vagrant/embedded/lib/ruby/gems/1.9.1/gems/thor-0.14.6/lib/thor/invocation.rb:124:in `invoke_all'
W:/tools/vagrant/vagrant/vagrant/embedded/lib/ruby/gems/1.9.1/gems/thor-0.14.6/lib/thor/group.rb:226:in `dispatch'
W:/tools/vagrant/vagrant/vagrant/embedded/lib/ruby/gems/1.9.1/gems/thor-0.14.6/lib/thor/invocation.rb:109:in `invoke'
W:/tools/vagrant/vagrant/vagrant/embedded/lib/ruby/gems/1.9.1/gems/mccloud-0.0.13/lib/mccloud/cli.rb:45:in `block in register'
W:/tools/vagrant/vagrant/vagrant/embedded/lib/ruby/gems/1.9.1/gems/thor-0.14.6/lib/thor/task.rb:22:in `run'
W:/tools/vagrant/vagrant/vagrant/embedded/lib/ruby/gems/1.9.1/gems/thor-0.14.6/lib/thor/invocation.rb:118:in `invoke_task'
W:/tools/vagrant/vagrant/vagrant/embedded/lib/ruby/gems/1.9.1/gems/thor-0.14.6/lib/thor.rb:263:in `dispatch'
W:/tools/vagrant/vagrant/vagrant/embedded/lib/ruby/gems/1.9.1/gems/thor-0.14.6/lib/thor/base.rb:389:in `start'
W:/tools/vagrant/vagrant/vagrant/embedded/lib/ruby/gems/1.9.1/gems/mccloud-0.0.13/bin/mccloud:18:in `<top (required)>'
W:/tools/vagrant/vagrant/vagrant/embedded/bin/mccloud:19:in `load'
W:/tools/vagrant/vagrant/vagrant/embedded/bin/mccloud:19:in `<main>'

In the end I totally discarded the keystore to make it work in the meantime (still with the prerequisite is that keypair was manually imported to AWS):

Mccloud::Config.run do |config|

  config.vm.define "web" do |web_config|
    web_config.vm.provider= "aws-us-east"
    web_config.vm.ami = "ami-3c994355"
    web_config.vm.flavor = "m1.small"
    web_config.vm.zone = "us-east-1a"
    web_config.vm.user="ubuntu"

    web_config.vm.key_name = "my-mccloud-key"

    # this made it work
    web_config.vm.private_key_path="W:/home/.ssh/mccloud_rsa"
    web_config.vm.public_key_path="W:/home/.ssh/mccloud_rsa.pub"

  end
end

Am I doing something wrong here?

Relax thor version constraint

Would you mind relaxing the thor dependency to > 0.14 as you already did in veewee.gemspec?

Edit: just noticed it's really thor > 0.14 in veewee. thor >= 0.14.6 would be sufficient for me to make it play nice with other gems which require thor ~> 0.16.0, e.g. berkshelf.

data_bags don't work with chef_solo provisioner

In the Mccloudfile I'm specifying chef.data_bags_path as show in the README:

    # provisioning sript (runs on each mccloud up or provision)
    config.vm.provision :chef_solo do |chef|
      chef.cookbooks_path = [ "cookbooks" ]
      chef.data_bags_path = "data_bags"
      chef.clean_after_run = false
      chef.log_level = "info"
      chef.add_recipe "myrecipe"
    end

The data bags get properly rsync'ed, but the data_bag_path does not get added to the solo.rb being generated on the node.

As a result the data bags are not picked up.

shell provisioner fails when using inline code

The shell-provisioner fails to work when using inline-code:

        vm_config.vm.provision :shell do |command|
            command.sudo = true
            command.inline = <<-EOS
                true
            EOS
        end

with the following error

Something blew up Mccloud. Time for McGuyver:

can't convert StringIO into String
/Users/niels/Documents/2013-09-iedereen-beroemd-rudi/vendor/ruby/1.9.1/bundler/gems/mccloud-b726b06c0ba5/lib/mccloud/provider/aws/vm/scp.rb:10:in `exists?'
/Users/niels/Documents/2013-09-iedereen-beroemd-rudi/vendor/ruby/1.9.1/bundler/gems/mccloud-b726b06c0ba5/lib/mccloud/provider/aws/vm/scp.rb:10:in `scp'
/Users/niels/Documents/2013-09-iedereen-beroemd-rudi/vendor/ruby/1.9.1/bundler/gems/mccloud-b726b06c0ba5/lib/mccloud/provider/aws/vm/scp.rb:6:in `transfer'
/Users/niels/Documents/2013-09-iedereen-beroemd-rudi/vendor/ruby/1.9.1/bundler/gems/mccloud-b726b06c0ba5/lib/mccloud/provisioner/shell.rb:25:in `run'
/Users/niels/Documents/2013-09-iedereen-beroemd-rudi/vendor/ruby/1.9.1/bundler/gems/mccloud-b726b06c0ba5/lib/mccloud/provider/aws/vm/provision.rb:13:in `block in _provision'
/Users/niels/Documents/2013-09-iedereen-beroemd-rudi/vendor/ruby/1.9.1/bundler/gems/mccloud-b726b06c0ba5/lib/mccloud/provider/aws/vm/provision.rb:11:in `each'
/Users/niels/Documents/2013-09-iedereen-beroemd-rudi/vendor/ruby/1.9.1/bundler/gems/mccloud-b726b06c0ba5/lib/mccloud/provider/aws/vm/provision.rb:11:in `_provision'
/Users/niels/Documents/2013-09-iedereen-beroemd-rudi/vendor/ruby/1.9.1/bundler/gems/mccloud-b726b06c0ba5/lib/mccloud/provider/aws/provider.rb:202:in `block in provision'
/Users/niels/Documents/2013-09-iedereen-beroemd-rudi/vendor/ruby/1.9.1/bundler/gems/mccloud-b726b06c0ba5/lib/mccloud/provider/core/provider.rb:53:in `on_selected_components'
/Users/niels/Documents/2013-09-iedereen-beroemd-rudi/vendor/ruby/1.9.1/bundler/gems/mccloud-b726b06c0ba5/lib/mccloud/provider/aws/provider.rb:201:in `provision'
/Users/niels/Documents/2013-09-iedereen-beroemd-rudi/vendor/ruby/1.9.1/bundler/gems/mccloud-b726b06c0ba5/lib/mccloud/command/provision.rb:12:in `block in execute'
/Users/niels/Documents/2013-09-iedereen-beroemd-rudi/vendor/ruby/1.9.1/bundler/gems/mccloud-b726b06c0ba5/lib/mccloud/command/provision.rb:10:in `each'
/Users/niels/Documents/2013-09-iedereen-beroemd-rudi/vendor/ruby/1.9.1/bundler/gems/mccloud-b726b06c0ba5/lib/mccloud/command/provision.rb:10:in `execute'
/Users/niels/Documents/2013-09-iedereen-beroemd-rudi/vendor/ruby/1.9.1/gems/thor-0.18.1/lib/thor/command.rb:27:in `run'
/Users/niels/Documents/2013-09-iedereen-beroemd-rudi/vendor/ruby/1.9.1/gems/thor-0.18.1/lib/thor/invocation.rb:120:in `invoke_command'
/Users/niels/Documents/2013-09-iedereen-beroemd-rudi/vendor/ruby/1.9.1/gems/thor-0.18.1/lib/thor/invocation.rb:127:in `block in invoke_all'
/Users/niels/Documents/2013-09-iedereen-beroemd-rudi/vendor/ruby/1.9.1/gems/thor-0.18.1/lib/thor/invocation.rb:127:in `each'
/Users/niels/Documents/2013-09-iedereen-beroemd-rudi/vendor/ruby/1.9.1/gems/thor-0.18.1/lib/thor/invocation.rb:127:in `map'
/Users/niels/Documents/2013-09-iedereen-beroemd-rudi/vendor/ruby/1.9.1/gems/thor-0.18.1/lib/thor/invocation.rb:127:in `invoke_all'
/Users/niels/Documents/2013-09-iedereen-beroemd-rudi/vendor/ruby/1.9.1/gems/thor-0.18.1/lib/thor/group.rb:233:in `dispatch'
/Users/niels/Documents/2013-09-iedereen-beroemd-rudi/vendor/ruby/1.9.1/gems/thor-0.18.1/lib/thor/invocation.rb:109:in `invoke'
/Users/niels/Documents/2013-09-iedereen-beroemd-rudi/vendor/ruby/1.9.1/bundler/gems/mccloud-b726b06c0ba5/lib/mccloud/cli.rb:45:in `block in register'
/Users/niels/Documents/2013-09-iedereen-beroemd-rudi/vendor/ruby/1.9.1/gems/thor-0.18.1/lib/thor/command.rb:27:in `run'
/Users/niels/Documents/2013-09-iedereen-beroemd-rudi/vendor/ruby/1.9.1/gems/thor-0.18.1/lib/thor/invocation.rb:120:in `invoke_command'
/Users/niels/Documents/2013-09-iedereen-beroemd-rudi/vendor/ruby/1.9.1/gems/thor-0.18.1/lib/thor.rb:363:in `dispatch'
/Users/niels/Documents/2013-09-iedereen-beroemd-rudi/vendor/ruby/1.9.1/gems/thor-0.18.1/lib/thor/base.rb:439:in `start'
/Users/niels/Documents/2013-09-iedereen-beroemd-rudi/vendor/ruby/1.9.1/bundler/gems/mccloud-b726b06c0ba5/bin/mccloud:18:in `<top (required)>'
/Users/niels/Documents/2013-09-iedereen-beroemd-rudi/vendor/ruby/1.9.1/bin/mccloud:23:in `load'
/Users/niels/Documents/2013-09-iedereen-beroemd-rudi/vendor/ruby/1.9.1/bin/mccloud:23:in `<main>'

Presumably, the problem is somewhere here:

Improve :host Provider Support

While trying out the :host provider I noticed the following issues:

  1. mccloud status <host> shows the status of the VMs of other providers (AWS in this case) which should not be. In addition, it shows nothing for the :host provider:
W:\tmp\demo>mccloud status host_web
Loaded providers[2] vms[2] ips[0] lbs[0] stacks[0] templates[1] keypairs[0] keystores[0]

Server(s) - provider aws-us-east
Name       Instance Id  IP                   Type            Status
================================================================================

Image(s) - provider aws-us-east
================================================================================

Volume(s) - provider aws-us-east
================================================================================

  1. mccloud bootstrap <host> fails with:
W:\tmp\demo>mccloud bootstrap host_web
Loaded providers[2] vms[2] ips[0] lbs[0] stacks[0] templates[1] keypairs[0] keystores[0]
[host_web] - Uploading bootstrap code to machine host_web
vagrant
Something blew up Mccloud. Time for McGuyver:

can't convert Net::SSH::AuthenticationFailed into String
W:/tools/vagrant/vagrant/vagrant/embedded/lib/ruby/gems/1.9.1/gems/mccloud-0.0.13/lib/mccloud/provider/core/vm/ssh_bootstrap.rb:25:in `+'
W:/tools/vagrant/vagrant/vagrant/embedded/lib/ruby/gems/1.9.1/gems/mccloud-0.0.13/lib/mccloud/provider/core/vm/ssh_bootstrap.rb:25:in `rescue in ssh_bootstrap'
W:/tools/vagrant/vagrant/vagrant/embedded/lib/ruby/gems/1.9.1/gems/mccloud-0.0.13/lib/mccloud/provider/core/vm/ssh_bootstrap.rb:21:in `ssh_bootstrap'
W:/tools/vagrant/vagrant/vagrant/embedded/lib/ruby/gems/1.9.1/gems/mccloud-0.0.13/lib/mccloud/provider/host/vm/bootstrap.rb:6:in `_bootstrap'
W:/tools/vagrant/vagrant/vagrant/embedded/lib/ruby/gems/1.9.1/gems/mccloud-0.0.13/lib/mccloud/provider/host/provider.rb:44:in `block in bootstrap'
W:/tools/vagrant/vagrant/vagrant/embedded/lib/ruby/gems/1.9.1/gems/mccloud-0.0.13/lib/mccloud/provider/core/provider.rb:53:in `on_selected_components'
W:/tools/vagrant/vagrant/vagrant/embedded/lib/ruby/gems/1.9.1/gems/mccloud-0.0.13/lib/mccloud/provider/host/provider.rb:43:in `bootstrap'
W:/tools/vagrant/vagrant/vagrant/embedded/lib/ruby/gems/1.9.1/gems/mccloud-0.0.13/lib/mccloud/command/bootstrap.rb:14:in `block in execute'
W:/tools/vagrant/vagrant/vagrant/embedded/lib/ruby/gems/1.9.1/gems/mccloud-0.0.13/lib/mccloud/command/bootstrap.rb:12:in `each'
W:/tools/vagrant/vagrant/vagrant/embedded/lib/ruby/gems/1.9.1/gems/mccloud-0.0.13/lib/mccloud/command/bootstrap.rb:12:in `execute'
W:/tools/vagrant/vagrant/vagrant/embedded/lib/ruby/gems/1.9.1/gems/thor-0.14.6/lib/thor/task.rb:22:in `run'
W:/tools/vagrant/vagrant/vagrant/embedded/lib/ruby/gems/1.9.1/gems/thor-0.14.6/lib/thor/invocation.rb:118:in `invoke_task'
W:/tools/vagrant/vagrant/vagrant/embedded/lib/ruby/gems/1.9.1/gems/thor-0.14.6/lib/thor/invocation.rb:124:in `block in invoke_all'
W:/tools/vagrant/vagrant/vagrant/embedded/lib/ruby/gems/1.9.1/gems/thor-0.14.6/lib/thor/invocation.rb:124:in `each'
W:/tools/vagrant/vagrant/vagrant/embedded/lib/ruby/gems/1.9.1/gems/thor-0.14.6/lib/thor/invocation.rb:124:in `map'
W:/tools/vagrant/vagrant/vagrant/embedded/lib/ruby/gems/1.9.1/gems/thor-0.14.6/lib/thor/invocation.rb:124:in `invoke_all'
W:/tools/vagrant/vagrant/vagrant/embedded/lib/ruby/gems/1.9.1/gems/thor-0.14.6/lib/thor/group.rb:226:in `dispatch'
W:/tools/vagrant/vagrant/vagrant/embedded/lib/ruby/gems/1.9.1/gems/thor-0.14.6/lib/thor/invocation.rb:109:in `invoke'
W:/tools/vagrant/vagrant/vagrant/embedded/lib/ruby/gems/1.9.1/gems/mccloud-0.0.13/lib/mccloud/cli.rb:45:in `block in register'
W:/tools/vagrant/vagrant/vagrant/embedded/lib/ruby/gems/1.9.1/gems/thor-0.14.6/lib/thor/task.rb:22:in `run'
W:/tools/vagrant/vagrant/vagrant/embedded/lib/ruby/gems/1.9.1/gems/thor-0.14.6/lib/thor/invocation.rb:118:in `invoke_task'
W:/tools/vagrant/vagrant/vagrant/embedded/lib/ruby/gems/1.9.1/gems/thor-0.14.6/lib/thor.rb:263:in `dispatch'
W:/tools/vagrant/vagrant/vagrant/embedded/lib/ruby/gems/1.9.1/gems/thor-0.14.6/lib/thor/base.rb:389:in `start'
W:/tools/vagrant/vagrant/vagrant/embedded/lib/ruby/gems/1.9.1/gems/mccloud-0.0.13/bin/mccloud:18:in `<top (required)>'
W:/tools/vagrant/vagrant/vagrant/embedded/bin/mccloud:19:in `load'
W:/tools/vagrant/vagrant/vagrant/embedded/bin/mccloud:19:in `<main>'

This is the Mccloudfile I used for testing: https://gist.github.com/3414976

Error bootstrapping server '[]=' string not matched

This appears to be happening because fog is raising an ArgumentError. Mccloud assumes that the error string will contain "Missing required arguments: ", but it does not.

session.rb:110:in `[]=': string not matched (IndexError)
    from /Users/mtnygard/.rvm/gems/ruby-1.8.7-p352@metron/bundler/gems/mccloud-9de38ab7e7ec/lib/mccloud/session.rb:110:in `load_config'
    from /Users/mtnygard/.rvm/gems/ruby-1.8.7-p352@metron/bundler/gems/mccloud-9de38ab7e7ec/lib/mccloud/session.rb:98:in `each'
    from /Users/mtnygard/.rvm/gems/ruby-1.8.7-p352@metron/bundler/gems/mccloud-9de38ab7e7ec/lib/mccloud/session.rb:98:in `load_config'
    from /Users/mtnygard/.rvm/gems/ruby-1.8.7-p352@metron/bundler/gems/mccloud-9de38ab7e7ec/bin/mccloud:16:in `create_session'
    from /Users/mtnygard/.rvm/gems/ruby-1.8.7-p352@metron/bundler/gems/mccloud-9de38ab7e7ec/bin/mccloud:122:in `bootstrap'
    from /Users/mtnygard/.rvm/gems/ruby-1.8.7-p352@metron/gems/thor-0.14.6/lib/thor/task.rb:22:in `send'
    from /Users/mtnygard/.rvm/gems/ruby-1.8.7-p352@metron/gems/thor-0.14.6/lib/thor/task.rb:22:in `run'
    from /Users/mtnygard/.rvm/gems/ruby-1.8.7-p352@metron/gems/thor-0.14.6/lib/thor/invocation.rb:118:in `invoke_task'
    from /Users/mtnygard/.rvm/gems/ruby-1.8.7-p352@metron/gems/thor-0.14.6/lib/thor.rb:263:in `dispatch'
    from /Users/mtnygard/.rvm/gems/ruby-1.8.7-p352@metron/gems/thor-0.14.6/lib/thor/base.rb:389:in `start'
    from /Users/mtnygard/.rvm/gems/ruby-1.8.7-p352@metron/bundler/gems/mccloud-9de38ab7e7ec/bin/mccloud:172
    from /Users/mtnygard/.rvm/gems/ruby-1.8.7-p352@metron/bin/mccloud:19:in `load'
    from /Users/mtnygard/.rvm/gems/ruby-1.8.7-p352@metron/bin/mccloud:19

SSH Warnings

I'm getting lots of SSH warnings like these (tested on libvirt branch):

W:\tmp\demo>mccloud provision web
Loaded providers[1] vms[1] ips[0] lbs[0] stacks[0] templates[1] keypairs[0] keystores[0]
[web] - starting provisioning with chef_solo as provisioner
[web] - ssh -p 22 [email protected] "test -d '/tmp/cookbooks' || mkdir -p '/tmp/cookbooks' "
Warning: Permanently added '50.17.146.192' (ECDSA) to the list of known hosts.
Connection to 50.17.146.192 closed.
[web] - rsyncing W:/tmp/demo/cookbooks/
Pseudo-terminal will not be allocated because stdin is not a terminal.
Warning: Permanently added '50.17.146.192' (ECDSA) to the list of known hosts.
[web] - [chef_solo] - running chef-solo
[web] - [chef_solo] - login as ubuntu
[web] - ssh -p 22 [email protected] "sudo -i chef-solo -c /tmp/solo.rb -j /tmp/dna.json -l info"
Warning: Permanently added '50.17.146.192' (ECDSA) to the list of known hosts.
[2012-08-21T11:39:48+00:00] INFO: *** Chef 10.12.0 ***
....
[web] - [chef_solo] - Cleaning up dna.json
Warning: Permanently added '50.17.146.192' (ECDSA) to the list of known hosts.
Connection to 50.17.146.192 closed.
[web] - [chef_solo] - Cleaning up solo.json
Warning: Permanently added '50.17.146.192' (ECDSA) to the list of known hosts.
Connection to 50.17.146.192 closed.
[web] - [chef_solo] - Cleaning cookbook_path ./cookbooks
Warning: Permanently added '50.17.146.192' (ECDSA) to the list of known hosts.
Connection to 50.17.146.192 closed.

Is this specific to my Windows7 / Ruby1.9.2p125 setup? Or has anybody else seen these as well?

Mccloud fails on a Windows Client

using current HEAD revision of libvirt branch (d2370fa) on a Windows7 / Ruby 1.9.3p125 install:

mccloud init works as expected and creates a Mccloudfile

a subsequent call to mccloud status fails silently with the following error:

W:\tmp\testo>mccloud status
Error processing configfile - Sorry

with logging turned on (set MCCLOUD_LOG=STDOUT) I get this:

W:\tmp\testo>mccloud status
2012-08-21 10:06:59 +0200 - environment - [mccloud] Setting @cwd to .
2012-08-21 10:06:59 +0200 - environment - [mccloud] Setting @mccloud_file to Mccloudfile
2012-08-21 10:06:59 +0200 - environment - [mccloud] Setting @autoload to true
2012-08-21 10:06:59 +0200 -  - [mccloud] Calculating computed rootpath
2012-08-21 10:06:59 +0200 -  - [mccloud] Start provided: .
2012-08-21 10:06:59 +0200 - environment - [mccloud] Autoload activated? true
2012-08-21 10:06:59 +0200 - environment - [mccloud] Environment initialized (#<Mccloud::Environment:0x2813790>)
2012-08-21 10:06:59 +0200 - environment - [mccloud]  - cwd : .
2012-08-21 10:06:59 +0200 - config - [mccloud] Initializing empty list of vms,lbs,stacks, ips in config
2012-08-21 10:06:59 +0200 - environment - [mccloud] Loading configuration...
2012-08-21 10:06:59 +0200 -  - [mccloud] Reading Mccloud::Config.run do |config|

<.....rest of config file displayed.....>

end # End Mccloud

2012-08-21 10:06:59 +0200 -  - [mccloud] done loading the mccloud setting
2012-08-21 10:06:59 +0200 -  - [mccloud] initalizing keypair
2012-08-21 10:06:59 +0200 - config provider - [mccloud] Start stubbing provider
2012-08-21 10:06:59 +0200 - config provider - [mccloud] End stubbing provider
2012-08-21 10:06:59 +0200 - config provider - [mccloud] Found provider of type aws
2012-08-21 10:07:00 +0200 - ui - [mccloud] Error processing configfile - Sorry
Error processing configfile - Sorry

Bootstrap ans SSH timeout

I am using a lot mccloud . many time it hanging up on bootstrap step or after it seem that it te NET::ssh issu
do you have this issue ?

thank you

Unable to resolve dependencies: mccloud requires net-ssh (~> 2.2.2)

Pardon my Ruby/gem ignorance -- However, I was only attempting to install mccloud for the first time and was abruptly stopped with the following error:

leek ~ % gem install mccloud                                                                                                                                                                                               
ERROR:  While executing gem ... (Gem::DependencyError)
    Unable to resolve dependencies: mccloud requires net-ssh (~> 2.2.2)
leek ~ % gem list                                                                                                                                                                                                                         

*** LOCAL GEMS ***

animation (0.1.alpha.3)
ansi (1.4.3)
builder (3.2.0)
capifony (2.2.8)
capistrano (2.14.2)
capistrano-ext (1.2.1)
capistrano-maintenance (0.0.2)
capistrano_colors (0.5.5)
chunky_png (1.2.8, 1.2.7)
colored (1.2)
compass (0.12.2)
compass_twitter_bootstrap (2.2.2.2)
excon (0.20.1)
ffi (1.8.1)
fog (1.10.1)
formatador (0.2.4)
fssm (0.2.10)
highline (1.6.18)
i18n (0.6.4)
inifile (2.0.2)
json (1.7.7)
listen (1.0.2, 0.7.3)
mime-types (1.23)
multi_json (1.7.2)
net-scp (1.1.0)
net-sftp (2.1.1)
net-ssh (2.6.7)
net-ssh-gateway (1.2.0)
nokogiri (1.5.9)
railsless-deploy (1.1.0)
rb-fsevent (0.9.3)
rb-inotify (0.9.0)
rb-kqueue (0.2.0)
ruby-hmac (0.4.0)
rubygems-update (2.0.3, 2.0.0)
sass (3.2.8, 3.2.7)
terminal-table (1.4.5)

AWS Bootstrap fails

The AWS bootstrap fails when the bootstrap template is uploaded via scp:

[sample-app] - Error uploading file R:/puroz-chef-workflow/test/ec2-bootstrap/.chef/bootstrap/omnibus-chef-10.16.2.sh invalid option(s): port, key_data, keys_only, keys

The exception comes from lib/provider/aws/vm/scp.rb near Fog::SCP.new(...)

Catching the exception and looking at the backtrace reveals that it comes from net/ssh:

invalid option(s): port, key_data, keys_only, keys
W:/tools/ruby/ruby-1.9.3-p385-i386-mingw32/lib/ruby/gems/1.9.1/gems/net-ssh-2.2.2/lib/net/ssh.rb:162:in `start'
W:/tools/ruby/ruby-1.9.3-p385-i386-mingw32/lib/ruby/gems/1.9.1/gems/net-scp-1.0.4/lib/net/scp.rb:197:in `start'
W:/tools/ruby/ruby-1.9.3-p385-i386-mingw32/lib/ruby/gems/1.9.1/gems/fog-1.9.0/lib/fog/core/scp.rb:70:in `upload'
D:/Repos/_github/mccloud/lib/mccloud/provider/aws/vm/scp.rb:21:in `scp'
D:/Repos/_github/mccloud/lib/mccloud/provider/aws/vm/scp.rb:6:in `transfer'

Working on a PR to fix it...

How to update the security group?

In my Mccloudfile I have something like this:

Mccloud::Config.run do |config|

  config.vm.define "web" do |web_config|

    web_config.vm.security_groups = [ "mccloud" ]

  end
end

When I modify the security groups here, e.g...

    web_config.vm.security_groups = [ "mccloud", "http"  ]

...how do I get these changes to AWS?

I have tried both mccloud provision web and a mccloud up web (while it was already up) with no success.

Is there a different command I would have to use in this case?

kvm/libvirt support?

Hi,
just wondering what the status of kvm/libvirt support is? I see fog has support for libvirt now, but the mccloud readme still mentions only ec2 is supported.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.