oscar 0.2.0alpha1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. data/.gitignore +3 -0
  2. data/CHANGELOG +12 -0
  3. data/Gemfile +1 -0
  4. data/LICENSE +14 -0
  5. data/README.markdown +97 -0
  6. data/Vagrantfile +6 -0
  7. data/bootstrap/base/pre/set_hostname.sh +3 -0
  8. data/bootstrap/base/provision/install_puppet_enterprise.sh +6 -0
  9. data/bootstrap/master/post/relocate_puppet.sh +23 -0
  10. data/config/.gitignore +1 -0
  11. data/config/roles.yaml.dist +17 -0
  12. data/doc/answers/README.markdown +1 -0
  13. data/doc/answers/agent.txt +10 -0
  14. data/doc/answers/master-1.1.txt +22 -0
  15. data/doc/answers/master-2.0.0.txt +42 -0
  16. data/doc/answers/master-2.5.0.txt +36 -0
  17. data/doc/answers/master-db.txt +52 -0
  18. data/lib/oscar.rb +17 -0
  19. data/lib/oscar/config.rb +97 -0
  20. data/lib/oscar/environment.rb +28 -0
  21. data/lib/oscar/networking.rb +47 -0
  22. data/lib/oscar/node.rb +91 -0
  23. data/lib/oscar/schema.yaml +73 -0
  24. data/lib/oscar/version.rb +3 -0
  25. data/lib/pe_build.rb +13 -0
  26. data/lib/pe_build/action.rb +20 -0
  27. data/lib/pe_build/action/download.rb +56 -0
  28. data/lib/pe_build/action/unpackage.rb +70 -0
  29. data/lib/pe_build/command.rb +31 -0
  30. data/lib/pe_build/command/download.rb +8 -0
  31. data/lib/pe_build/command/list.rb +10 -0
  32. data/lib/pe_build/config.rb +30 -0
  33. data/lib/pe_build/provisioners.rb +9 -0
  34. data/lib/pe_build/provisioners/puppet_enterprise.rb +1 -0
  35. data/lib/pe_build/provisioners/puppet_enterprise_bootstrap.rb +138 -0
  36. data/lib/pe_build/version.rb +5 -0
  37. data/manifests/.gitignore +3 -0
  38. data/modules/.gitignore +2 -0
  39. data/oscar.gemspec +27 -0
  40. data/templates/answers/agent.txt.erb +10 -0
  41. data/templates/answers/master.txt.erb +52 -0
  42. metadata +175 -0
data/.gitignore ADDED
@@ -0,0 +1,3 @@
1
+ .vagrant
2
+ config.yaml
3
+ .pe_build
data/CHANGELOG ADDED
@@ -0,0 +1,12 @@
1
+ CHANGELOG
2
+ =========
3
+
4
+ 0.2.0alpha1
5
+ -----------
6
+
7
+ * vagrant-hosts has been split out into an independent gem
8
+ * Added Gemfile, gemspec.
9
+ * Cleanup around validating and extracting the PE installer tarball
10
+ * Add support for autogenerated answers files.
11
+ * Perform the GRAND RENAMING from SoupKitchen to Oscar. It's the last
12
+ rename, I promise.
data/Gemfile ADDED
@@ -0,0 +1 @@
1
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,14 @@
1
+ Copyright 2012 Adrien Thebo
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License");
4
+ you may not use this file except in compliance with the License.
5
+ You may obtain a copy of the License at
6
+
7
+ http://www.apache.org/licenses/LICENSE-2.0
8
+
9
+ Unless required by applicable law or agreed to in writing, software
10
+ distributed under the License is distributed on an "AS IS" BASIS,
11
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ See the License for the specific language governing permissions and
13
+ limitations under the License.
14
+
data/README.markdown ADDED
@@ -0,0 +1,97 @@
1
+ Instapants
2
+ ==========
3
+
4
+ Create a full Puppet Enterprise environment from vagrant base boxes.
5
+
6
+ Versions
7
+ --------
8
+
9
+ Right now, the master branch of soupkitchen is going through a major rewrite.
10
+ The codebase is in flux and thus the documentation is really going to be based
11
+ on inline comments.
12
+
13
+ All of the supported behavior before the write has been tagged as version 0.0.1
14
+ and is the reference point for the following documentation.
15
+
16
+ Prerequisites
17
+ -------------
18
+
19
+ * Vagrant 1.0
20
+ * Virtualbox 4.x (4.0 strongly recommended for OSX 10.7)
21
+
22
+ Installation
23
+ ------------
24
+
25
+ git clone git://github.com/adrienthebo/soupkitchen
26
+ git checkout 0.0.1
27
+ cd soupkitchen
28
+
29
+ # You'll need a config.yaml to specify how to build the environment. Contact your
30
+ # friendly neighborhood Puppet support monkey on where this is located. Place
31
+ # this file in the insta-pe directory.
32
+ wget http://your.web.server/insta-pe/config.yaml
33
+
34
+ # You'll also need the extracted universal installers for Puppet Enterprise.
35
+ # Place the extracted installers in insta-pe/files.
36
+ cd soupkitchen/files
37
+ tar xvf puppet-enterprise-X.Y.Z.tar.gz
38
+
39
+ # soupkitchen assumes the you either have all your vagrant boxes already added or
40
+ # are hosted on a webserver.
41
+ vagrant up
42
+
43
+ Configuration
44
+ -------------
45
+
46
+ Configuration is provided through a yaml file. (Yes, the vagrant config file
47
+ has a config file. Deal with it.) The top level values are all keys. You'll
48
+ have something like this:
49
+
50
+ ---
51
+ # Configuration settings for Puppet Enterprise.
52
+ pe:
53
+ # The version of PE to install. Using a version of 0.0.0 disables the installation
54
+ version: 2.5.1
55
+ installer_path: /vagrant/files/puppet-enterprise-%s-all/puppet-enterprise-installer
56
+ installer:
57
+ # The program to execute to run the PE install. You can insert 'bash -x' to do a trace
58
+ # of the installation. Any string containing :version will be replaced with the current version.
59
+ executable: /vagrant/files/puppet-enterprise-:version-all/puppet-enterprise-installer
60
+ args:
61
+ # Additional arguments to pass to the installer
62
+ - "-l /root/puppet-enterprise-installer.log"
63
+ - "-D"
64
+ - "| tee /root/installer-all.log"
65
+
66
+ # Profiles are generic configurations for a basebox
67
+ profiles:
68
+ # One or more key/value pairs, where the name is the profile name and the values are hashes.
69
+ debian:
70
+ # The vagrant base box to use.
71
+ boxname: debian-6.0.4-i386
72
+ # The URL that the box can be downloaded from. This is optional
73
+ boxurl: http://your.web.server/insta-pe/debian-6.0.4-i386.box
74
+ # add more profiles as necessary
75
+
76
+ # Your actual node definitions. This is an array of hashes
77
+ nodes:
78
+ -
79
+ # name: the name of the node to address with vagrant commands
80
+ name: master
81
+ # role: one of (master, agent). Self explanatory.
82
+ role: master
83
+ # The name of the profile to use in the previous section.
84
+ profile: debian
85
+ # The IP address to assign for the host
86
+ address: 10.16.1.2
87
+ # A hash where the keys are VM port names and the values are hypervisor port names. Optional.
88
+ # You'll want to forward 443 on the master to your hypervisor for access to the PEC.
89
+ forwards:
90
+ 443: 20443
91
+
92
+ You can also view the config.yaml.example in this directory.
93
+
94
+ Caveats
95
+ -------
96
+
97
+ Do not look at the Vagrantfile in this directory. You'll go blind.
data/Vagrantfile ADDED
@@ -0,0 +1,6 @@
1
+ # lol shim
2
+ $LOAD_PATH << "#{File.dirname(__FILE__)}/lib"
3
+ require 'pe_build'
4
+ require 'oscar'
5
+
6
+ Oscar.facehug! File.dirname(__FILE__)
@@ -0,0 +1,3 @@
1
+ hostname <%= @env[:vm].name %>
2
+ domainname soupkitchen.internal
3
+ echo <%= @env[:vm].name %> > /etc/hostname
@@ -0,0 +1,6 @@
1
+ if [ -f /opt/puppet/bin/puppet ]; then
2
+ echo "Puppet Enterprise already present, version $(/opt/puppet/bin/puppet --version)"
3
+ echo "Skipping installation."
4
+ else
5
+ <%= @installer_cmd %>
6
+ fi
@@ -0,0 +1,23 @@
1
+ # Update puppet.conf to add the manifestdir directive to point to the
2
+ # /manifests mount, if the directive isn't already present.
3
+ sed -i '
4
+ 2 {
5
+ /manifest/ !i\
6
+ manifestdir = /manifests
7
+ }
8
+ ' /etc/puppetlabs/puppet/puppet.conf
9
+
10
+ # Update puppet.conf to add the modulepath directive to point to the
11
+ # /module mount, if it hasn't already been set.
12
+ sed -i '
13
+ /modulepath/ {
14
+ /vagrant/ !s,$,:/modules,
15
+ }
16
+ ' /etc/puppetlabs/puppet/puppet.conf
17
+
18
+ # Rewrite the olde site.pp config since it's not used, and warn people
19
+ # about this.
20
+ echo '# /etc/puppetlabs/puppet/manifests is not used; see /manifests.' > /etc/puppetlabs/puppet/manifests/site.pp
21
+
22
+ # Enable autosigning on the master
23
+ echo '*' > /etc/puppetlabs/puppet/autosign.conf
data/config/.gitignore ADDED
@@ -0,0 +1 @@
1
+ *
@@ -0,0 +1,17 @@
1
+ ---
2
+
3
+ roles:
4
+ -
5
+ # Puppet Enterprise Masters need port 443 forwarded so that the console is
6
+ # reachable from the hypervisor
7
+ name: master
8
+ forwards:
9
+ -
10
+ source: 443
11
+ dest: 20443
12
+
13
+ -
14
+ name: agent
15
+
16
+ -
17
+ name: console
@@ -0,0 +1 @@
1
+ These are reference answers files for the various versions of PE.
@@ -0,0 +1,10 @@
1
+ q_install=y
2
+ q_puppet_cloud_install=n
3
+ q_puppet_enterpriseconsole_install=n
4
+ q_puppet_symlinks_install=y
5
+ q_puppetagent_certname=$(hostname -s)
6
+ q_puppetagent_install=y
7
+ q_puppetagent_server=master
8
+ q_puppetmaster_install=n
9
+ q_vendor_packages_install=y
10
+ q_continue_or_reenter_master_hostname=c
@@ -0,0 +1,22 @@
1
+ q_install=y
2
+ q_puppet_symlinks_install=y
3
+ q_puppetagent_certname=master
4
+ q_puppetagent_install=y
5
+ q_puppetagent_pluginsync=y
6
+ q_puppetagent_server=master
7
+ q_puppetdashboard_database_install=y
8
+ q_puppetdashboard_database_name=console
9
+ q_puppetdashboard_database_password=puppet
10
+ q_puppetdashboard_database_root_password=puppet
11
+ q_puppetdashboard_database_user=console
12
+ q_puppetdashboard_httpd_port=443
13
+ q_puppetdashboard_install=y
14
+ q_puppetmaster_certdnsnames=master:puppet
15
+ q_puppetmaster_certname=master
16
+ q_puppetmaster_dashboard_hostname=master
17
+ q_puppetmaster_dashboard_port=443
18
+ q_puppetmaster_install=y
19
+ q_puppetmaster_use_dashboard_classifier=y
20
+ q_puppetmaster_use_dashboard_reports=y
21
+ q_rubydevelopment_install=y
22
+ q_vendor_packages_install=y
@@ -0,0 +1,42 @@
1
+ q_install=y
2
+ q_puppet_cloud_install=n
3
+ q_puppet_enterpriseconsole_auth_database_name=console_auth
4
+ q_puppet_enterpriseconsole_auth_database_password=console_auth
5
+ q_puppet_enterpriseconsole_auth_database_user=console_auth
6
+ q_puppet_enterpriseconsole_auth_password=console
7
+ q_puppet_enterpriseconsole_auth_user_email=console@example.com
8
+ q_puppet_enterpriseconsole_database_install=y
9
+ q_puppet_enterpriseconsole_database_name=console
10
+ q_puppet_enterpriseconsole_database_password=console
11
+ q_puppet_enterpriseconsole_database_remote=n
12
+ q_puppet_enterpriseconsole_database_root_password=root
13
+ q_puppet_enterpriseconsole_database_user=console
14
+ q_puppet_enterpriseconsole_httpd_port=443
15
+ q_puppet_enterpriseconsole_install=y
16
+ q_puppet_enterpriseconsole_inventory_hostname=$(hostname -s)
17
+ q_puppet_enterpriseconsole_inventory_port=8140
18
+ q_puppet_enterpriseconsole_master_hostname=$(hostname -s)
19
+ q_puppet_enterpriseconsole_smtp_host=smtp.google.com
20
+ q_puppet_enterpriseconsole_smtp_password=
21
+ q_puppet_enterpriseconsole_smtp_port=25
22
+ q_puppet_enterpriseconsole_smtp_use_tls=n
23
+ q_puppet_enterpriseconsole_smtp_user_auth=n
24
+ q_puppet_enterpriseconsole_smtp_username=
25
+ q_puppet_symlinks_install=y
26
+ q_puppetagent_certname=$(hostname -s)
27
+ q_puppetagent_install=y
28
+ q_puppetagent_server=$(hostname -s)
29
+ q_puppetca_install=y
30
+ q_puppetmaster_certname=$(hostname -s)
31
+ q_puppetmaster_dnsaltnames=$(hostname -s),puppet,$(hostname -f),puppet.$(domainname)
32
+ q_puppetmaster_enterpriseconsole_hostname=localhost
33
+ q_puppetmaster_enterpriseconsole_port=443
34
+ q_puppetmaster_forward_facts=n
35
+ q_puppetmaster_install=y
36
+ q_vendor_packages_install=y
37
+
38
+ # pe 2.0 option
39
+ q_puppet_enterpriseconsole_auth_user=console
40
+
41
+ # pe 2.0 - 2.5 upgrade options
42
+ q_puppet_enterpriseconsole_setup_auth_db=y
@@ -0,0 +1,36 @@
1
+ q_install=y
2
+ q_puppet_cloud_install=n
3
+ q_puppet_enterpriseconsole_auth_database_name=console_auth
4
+ q_puppet_enterpriseconsole_auth_database_password=console_auth
5
+ q_puppet_enterpriseconsole_auth_database_user=console_auth
6
+ q_puppet_enterpriseconsole_auth_password=console
7
+ q_puppet_enterpriseconsole_auth_user_email=console@soupkitchen.internal
8
+ q_puppet_enterpriseconsole_database_install=y
9
+ q_puppet_enterpriseconsole_database_name=console
10
+ q_puppet_enterpriseconsole_database_password=console
11
+ q_puppet_enterpriseconsole_database_remote=n
12
+ q_puppet_enterpriseconsole_database_root_password=console
13
+ q_puppet_enterpriseconsole_database_user=console
14
+ q_puppet_enterpriseconsole_httpd_port=443
15
+ q_puppet_enterpriseconsole_install=y
16
+ q_puppet_enterpriseconsole_inventory_hostname=$(hostname -s)
17
+ q_puppet_enterpriseconsole_inventory_port=8140
18
+ q_puppet_enterpriseconsole_master_hostname=$(hostname -s)
19
+ q_puppet_enterpriseconsole_smtp_host=localhost
20
+ q_puppet_enterpriseconsole_smtp_password=
21
+ q_puppet_enterpriseconsole_smtp_port=25
22
+ q_puppet_enterpriseconsole_smtp_use_tls=n
23
+ q_puppet_enterpriseconsole_smtp_user_auth=n
24
+ q_puppet_enterpriseconsole_smtp_username=
25
+ q_puppet_symlinks_install=y
26
+ q_puppetagent_certname=$(hostname -s)
27
+ q_puppetagent_install=y
28
+ q_puppetagent_server=$(hostname -s)
29
+ q_puppetca_install=y
30
+ q_puppetmaster_certname=$(hostname -s)
31
+ q_puppetmaster_dnsaltnames=$(hostname -s),puppet,$(hostname -f),puppet.$(domainname)
32
+ q_puppetmaster_enterpriseconsole_hostname=localhost
33
+ q_puppetmaster_enterpriseconsole_port=443
34
+ q_puppetmaster_forward_facts=n
35
+ q_puppetmaster_install=y
36
+ q_vendor_packages_install=y
@@ -0,0 +1,52 @@
1
+ q_install=y
2
+ q_puppet_cloud_install=n
3
+
4
+ q_puppet_enterpriseconsole_auth_database_name=console_auth
5
+ q_puppet_enterpriseconsole_auth_database_password=console_auth
6
+ q_puppet_enterpriseconsole_auth_database_user=console_auth
7
+ q_puppet_enterpriseconsole_auth_password=console
8
+ q_puppet_enterpriseconsole_auth_user_email=console@example.com
9
+
10
+ # Use existing database
11
+ q_puppet_enterpriseconsole_database_install=n
12
+ q_puppet_enterpriseconsole_setup_db=y
13
+
14
+ q_puppet_enterpriseconsole_database_name=console
15
+ q_puppet_enterpriseconsole_database_user=console
16
+ q_puppet_enterpriseconsole_database_password=console
17
+ q_puppet_enterpriseconsole_database_remote=n
18
+ q_puppet_enterpriseconsole_database_root_password=console
19
+
20
+ q_puppet_enterpriseconsole_httpd_port=443
21
+ q_puppet_enterpriseconsole_install=y
22
+
23
+ q_puppet_enterpriseconsole_inventory_hostname=master
24
+ q_puppet_enterpriseconsole_inventory_port=8140
25
+
26
+ q_puppet_enterpriseconsole_master_hostname=master
27
+
28
+ q_puppet_enterpriseconsole_smtp_host=smtp.google.com
29
+ q_puppet_enterpriseconsole_smtp_password=
30
+ q_puppet_enterpriseconsole_smtp_port=25
31
+ q_puppet_enterpriseconsole_smtp_use_tls=n
32
+ q_puppet_enterpriseconsole_smtp_user_auth=n
33
+ q_puppet_enterpriseconsole_smtp_username=
34
+
35
+ q_puppet_symlinks_install=y
36
+ q_puppetagent_certname=master
37
+ q_puppetagent_install=y
38
+ q_puppetagent_server=master
39
+ q_puppetca_install=y
40
+ q_puppetmaster_certname=master
41
+ q_puppetmaster_dnsaltnames=master,puppet
42
+ q_puppetmaster_enterpriseconsole_hostname=localhost
43
+ q_puppetmaster_enterpriseconsole_port=443
44
+ q_puppetmaster_forward_facts=n
45
+ q_puppetmaster_install=y
46
+ q_vendor_packages_install=y
47
+
48
+ # pe 2.0 option
49
+ q_puppet_enterpriseconsole_auth_user=console
50
+
51
+ # pe 2.0 - 2.5 upgrade options
52
+ q_puppet_enterpriseconsole_setup_auth_db=y
data/lib/oscar.rb ADDED
@@ -0,0 +1,17 @@
1
+
2
+ module Oscar
3
+
4
+ def self.facehug!(directory)
5
+ env = Oscar::Environment.new
6
+ env.config.load! directory
7
+ env.run!
8
+
9
+ env
10
+ end
11
+ end
12
+
13
+ require 'oscar/version'
14
+ require 'oscar/config'
15
+ require 'oscar/environment'
16
+ require 'oscar/networking'
17
+ require 'oscar/node'
@@ -0,0 +1,97 @@
1
+ require 'oscar'
2
+ require 'yaml'
3
+ require 'kwalify'
4
+
5
+ class Oscar::Config
6
+
7
+ attr_reader :data
8
+
9
+ def initialize
10
+ @data = {}
11
+
12
+ schema_path = File.expand_path(File.join(File.dirname(__FILE__), 'schema.yaml'))
13
+ schema = YAML.load_file schema_path
14
+ validator = Kwalify::Validator.new(schema)
15
+ @parser = Kwalify::Yaml::Parser.new(validator)
16
+ end
17
+
18
+ def load!(searchpath)
19
+ files = ['config.yaml', 'config'].map { |m| "#{searchpath}/#{m}" }
20
+ load_all files
21
+ end
22
+
23
+ # Recursively load any YAML files contained in the given paths.
24
+ def load_all(*paths)
25
+ paths.flatten.each do |path|
26
+ if File.file?(path) and path.match /\.yaml$/
27
+ load_file(path)
28
+ elsif File.directory? path
29
+ load_all Dir["#{path}/*"]
30
+ #else
31
+ # warn "#{path} is neither a YAML file nor a directory, ignoring it."
32
+ end
33
+ end
34
+ end
35
+
36
+ # Load YAML from a file and merge it into the aggregated YAML
37
+ #
38
+ # @raise [TypeError] If the YAML in a given file does not match the configuration schema
39
+ def load_file(filename)
40
+ localdata = @parser.parse_file(filename)
41
+ errors = @parser.errors
42
+
43
+ if (errors and not errors.empty?)
44
+ errors.each do |err|
45
+ puts "#{filename} line #{err.linenum}, column #{err.column}, [kwalify path #{err.path}] #{err.message}"
46
+ end
47
+ raise TypeError
48
+ else
49
+ @data.merge!(localdata)
50
+ end
51
+ end
52
+
53
+ # Collects all node configuration as an array of the node structured data.
54
+ #
55
+ # @return [Array<Hash<String, String>>]
56
+ def all_node_configs
57
+ names = @data["nodes"].map { |h| h['name'] }
58
+ names.map { |n| node_config(n) }
59
+ end
60
+
61
+ # Provides the structured data representation of a node.
62
+ #
63
+ # Configuration priority is 'profile' -> 'role' -> 'node'
64
+ #
65
+ # @param [String] name The name of the node to fetch
66
+ #
67
+ # @return [Hash<String, String>]
68
+ def node_config(node_name)
69
+ config = {}
70
+
71
+ unless (node_hash = @data['nodes'].find { |h| h['name'] == node_name })
72
+ raise "Node configuration for #{node_name} not found"
73
+ end
74
+
75
+ # Check to see if the node has a profile or role. If one of those values
76
+ # do exist, try to lookup that data and merge it into the config hash.
77
+ ['profile', 'role'].each do |type|
78
+ plural_type = "#{type}s"
79
+
80
+ type_name = node_hash[type] # Check to see if we have the requested type
81
+ if (type_name and type_hash = @data[plural_type].find { |t| t['name'] == type_name })
82
+ # The requested type exists in the node hash, and we were able to lookup
83
+ # the related configuration.
84
+ config.merge! type_hash
85
+ else
86
+ # The requested type exists in the node hash, but we were not able to
87
+ # lookup the related configuraion; die messily.
88
+ raise %{#{type.capitalize} configuration "#{type}" for #{node_name} not found}
89
+ end
90
+ end
91
+
92
+ # Merge the node hash last so that it takes precedence
93
+ config.merge! node_hash
94
+
95
+ config
96
+ end
97
+ end