29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
# File 'lib/ssp/application/node.rb', line 29
def create(fqdn, *roles)
server = connection.servers.new
run_list = roles.map { |r| r =~ /recipe\[(.*)\]/ ? $1 : "role[#{r}]" }
setup_node_script = "#!/bin/bash\n\nIP=$(ifconfig eth0 | sed -ne 's/.*inet addr:\\\\([0-9\\\\.]*\\\\).*/\\\\1/p')\n\necho \"127.0.0.1 localhost localhost.localdomain\" > /etc/hosts\necho \"$IP \#{fqdn} \#{fqdn.split(\".\").first}\" >> /etc/hosts\n EOH\n if chef_config[:chef_server_url] == \"https://chef-server.rackspace\"\n chef_server_ip = %x{dscl . read Hosts/chef-server.rackspace 2>/dev/null}[/[\\d\\.]+/]\n setup_node_script << %{echo \"\#{chef_server_ip} chef.sspti.me\" >> /etc/hosts\\n}\n chef_config[:chef_server_url] = \"https://chef.sspti.me\"\n end\n setup_node_script << \"exit 0\\n\"\n\n # Always include the chef-client role in the run list\n unless run_list.include? \"role[chef-client]\"\n run_list.unshift \"role[chef-client]\"\n end\n\n server.flavor_id = options[:flavor]\n server.image_id = options[:image]\n server.name = fqdn\n server.personality = [\n {\n 'path' => '/etc/setup-node',\n 'contents' => setup_node_script\n },\n {\n 'path' => \"/etc/chef/validation.pem\",\n 'contents' => IO.read(chef_config[:validation_key])\n },\n {\n 'path' => \"/etc/chef/client.rb\",\n 'contents' => <<-EOH\nlog_level :info\nlog_location STDOUT\nchef_server_url \"\#{chef_config[:chef_server_url]}\"\nvalidation_client_name \"\#{chef_config[:validation_client_name]}\"\n EOH\n },\n {\n 'path' => \"/etc/chef/first-boot.json\",\n 'contents' => { \"run_list\" => run_list }.to_json\n },\n ]\n\n server.save\n\n say_status \"Name: \", server.name, :cyan\n say_status \"Flavor: \", server.flavor_id, :cyan\n say_status \"Image: \", server.image_id, :cyan\n say_status \"Public IP: \", server.addresses[\"public\"], :cyan\n say_status \"Private IP: \", server.addresses[\"private\"], :cyan\n say_status \"Password: \", server.password, :cyan\n\n say \"\\nRequesting server\", :magenta\n saved_password = server.password\n\n # wait for it to be ready to do stuff\n server.wait_for { print \".\"; ready? }\n\n say \"\\nServer ready, waiting 15 seconds to bootstrap.\"\n sleep 15\n\n say \"\\nBootstrapping \#{shell.set_color(server.name, :bold)}...\"\n\n ssh = ::Chef::Knife::Ssh.new\n ssh.name_args = [ server.addresses[\"public\"][0], \"/bin/bash /etc/setup-node && /usr/local/bin/chef-client -j /etc/chef/first-boot.json\" ]\n ssh.config[:ssh_user] = \"root\"\n ssh.config[:manual] = true\n ssh.config[:password] = saved_password\n ssh.password = saved_password\n ssh.run\nend\n"
|