From d4af4bf8119660a975c487d70dc1a2483e337967 Mon Sep 17 00:00:00 2001 From: Will Farrington Date: Tue, 12 Feb 2013 16:41:56 -0800 Subject: [PATCH] Update our boxen template with the latest and greatest --- Gemfile | 6 +- Gemfile.lock | 21 ++- Puppetfile | 4 +- Puppetfile.lock | 4 +- docs/personal-configuration.md | 64 ++++++--- docs/puppet.md | 144 +++++++++++++++++++++ docs/rails.md | 2 +- manifests/site.pp | 9 +- script/bootstrap | 5 +- script/boxen-my-config | 2 +- script/nuke | 24 +++- vendor/cache/boxen-0.7.1.gem | Bin 23552 -> 0 bytes vendor/cache/boxen-0.7.3.gem | Bin 0 -> 23552 bytes vendor/cache/builder-3.1.4.gem | Bin 0 -> 26112 bytes vendor/cache/json_pure-1.7.6.gem | Bin 146432 -> 0 bytes vendor/cache/json_pure-1.7.7.gem | Bin 0 -> 148480 bytes vendor/cache/multi_json-1.5.0.gem | Bin 15872 -> 0 bytes vendor/cache/multi_json-1.6.0.gem | Bin 0 -> 24064 bytes vendor/cache/net-ssh-2.6.5.gem | Bin 0 -> 166912 bytes vendor/cache/octokit-1.22.0.gem | Bin 218112 -> 0 bytes vendor/cache/octokit-1.23.0.gem | Bin 0 -> 219648 bytes vendor/cache/rbvmomi-1.6.0.gem | Bin 0 -> 177664 bytes vendor/cache/trollop-2.0.gem | Bin 0 -> 22528 bytes vendor/puppet/cache/boxen-puppet-ruby-0.5.1.tar.gz | Bin 8115 -> 0 bytes vendor/puppet/cache/boxen-puppet-ruby-0.7.1.tar.gz | Bin 0 -> 8887 bytes vendor/shims/xcrun | 4 + 26 files changed, 247 insertions(+), 42 deletions(-) create mode 100644 docs/puppet.md delete mode 100644 vendor/cache/boxen-0.7.1.gem create mode 100644 vendor/cache/boxen-0.7.3.gem create mode 100644 vendor/cache/builder-3.1.4.gem delete mode 100644 vendor/cache/json_pure-1.7.6.gem create mode 100644 vendor/cache/json_pure-1.7.7.gem delete mode 100644 vendor/cache/multi_json-1.5.0.gem create mode 100644 vendor/cache/multi_json-1.6.0.gem create mode 100644 vendor/cache/net-ssh-2.6.5.gem delete mode 100644 vendor/cache/octokit-1.22.0.gem create mode 100644 vendor/cache/octokit-1.23.0.gem create mode 100644 vendor/cache/rbvmomi-1.6.0.gem create mode 100644 vendor/cache/trollop-2.0.gem delete mode 100644 vendor/puppet/cache/boxen-puppet-ruby-0.5.1.tar.gz create mode 100644 vendor/puppet/cache/boxen-puppet-ruby-0.7.1.tar.gz create mode 100755 vendor/shims/xcrun diff --git a/Gemfile b/Gemfile index 1b34f08..d68e2e5 100644 --- a/Gemfile +++ b/Gemfile @@ -1,7 +1,9 @@ -source "http://rubygems.org" +source "https://rubygems.org" -gem "boxen", "~> 0.7" +gem "boxen", "0.7.3" group :development do gem "aws-sdk" + gem "net-ssh" + gem "rbvmomi" end diff --git a/Gemfile.lock b/Gemfile.lock index 4ad4f3e..c78be2d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,5 +1,5 @@ GEM - remote: http://rubygems.org/ + remote: https://rubygems.org/ specs: addressable (2.3.2) ansi (1.4.3) @@ -7,7 +7,7 @@ GEM json (~> 1.4) nokogiri (>= 1.4.4) uuidtools (~> 2.1) - boxen (0.7.1) + boxen (0.7.3) ansi (~> 1.4) hiera (~> 1.0.0) highline (~> 1.6) @@ -15,6 +15,7 @@ GEM librarian-puppet (~> 0.9) octokit (~> 1.15) puppet (~> 3.0) + builder (3.1.4) facter (1.6.17) faraday (0.8.5) multipart-post (~> 1.1) @@ -24,16 +25,17 @@ GEM hiera (1.0.0) highline (1.6.15) json (1.7.6) - json_pure (1.7.6) + json_pure (1.7.7) librarian-puppet (0.9.7) json puppet thor (~> 0.15) - multi_json (1.5.0) + multi_json (1.6.0) multipart-post (1.1.5) + net-ssh (2.6.5) netrc (0.7.7) nokogiri (1.5.6) - octokit (1.22.0) + octokit (1.23.0) addressable (~> 2.2) faraday (~> 0.8) faraday_middleware (~> 0.9) @@ -43,7 +45,12 @@ GEM puppet (3.1.0) facter (~> 1.6) hiera (~> 1.0) + rbvmomi (1.6.0) + builder + nokogiri (>= 1.4.1) + trollop thor (0.17.0) + trollop (2.0) uuidtools (2.1.3) PLATFORMS @@ -51,4 +58,6 @@ PLATFORMS DEPENDENCIES aws-sdk - boxen (~> 0.7) + boxen (= 0.7.3) + net-ssh + rbvmomi diff --git a/Puppetfile b/Puppetfile index 5c4f7de..a286c9c 100644 --- a/Puppetfile +++ b/Puppetfile @@ -1,3 +1,5 @@ +# This file manages Puppet module dependencies. +# # It works a lot like Bundler. We provide some core modules by # default. This ensures at least the ability to construct a basic # environment. @@ -28,7 +30,7 @@ github "inifile", "0.9.0", :repo => "cprice-puppet/puppetlabs-inifile" github "nginx", "0.2.1" github "nodejs", "0.0.2" github "nvm", "0.0.5" -github "ruby", "0.5.1" +github "ruby", "0.7.1" github "stdlib", "3.0.0", :repo => "puppetlabs/puppetlabs-stdlib" github "sudo", "0.0.1" diff --git a/Puppetfile.lock b/Puppetfile.lock index 8703d8c..dafe506 100644 --- a/Puppetfile.lock +++ b/Puppetfile.lock @@ -46,7 +46,7 @@ GITHUBTARBALL GITHUBTARBALL remote: boxen/puppet-ruby specs: - ruby (0.5.1) + ruby (0.7.1) GITHUBTARBALL remote: boxen/puppet-sudo @@ -74,7 +74,7 @@ DEPENDENCIES nginx (= 0.2.1) nodejs (= 0.0.2) nvm (= 0.0.5) - ruby (= 0.5.1) + ruby (= 0.7.1) stdlib (= 3.0.0) sudo (= 0.0.1) diff --git a/docs/personal-configuration.md b/docs/personal-configuration.md index 61ebe1c..a7a05f7 100644 --- a/docs/personal-configuration.md +++ b/docs/personal-configuration.md @@ -7,9 +7,12 @@ per-user configurations. How? The personal manifest. +## What even is a personal manifest? + Personal manifests live in `modules/people/manifests/.pp`, where `` is your GitHub username. -A basic personal manifest might look like so: + +The simplest personal manifest looks like this: ``` puppet class people::wfarr { @@ -17,19 +20,46 @@ class people::wfarr { } ``` -Now, each time `wfarr` runs Boxen it'll automatically print out "hello world" -somewhere during the run. -You can even run `boxen-my-config` to generate a default template for you -and open it up in your editor. -When you're done, you can simply run `boxen` and it'll include your changes -in your personal manifest. -**You should always keep your manifest committed and pushed to your repository**. -Otherwise, auto-updates won't work! - -The whole point of these personal manifest are they are _your_ manifest. -You shouldn't worry if the things in here are work-related or not. -This is about full automation. -Want to install Minecraft and Rdio by default? -Do it in your personal manifest. - -You can check out the [projects README](../modules/projects/README.md) for further examples. +Ah, the good old "Hello World". +It's boring, but you can see there's really not much boilerplate involved. +Let's try something *real* this time: + +``` puppet +class people::wfarr { + include boxen::development +} +``` + +So what does this do? +It clones every repo in the Boxen org to `~/src/boxen/`. +How? +Well, we can refer to [the source code](https://github.com/boxen/puppet-boxen/blob/master/manifests/development.pp)! +If you're new to Puppet, or are unsure of what that class is doing, check out +the [intro to puppet](./puppet.md) we've put together. + +## Running different code on multiple machines + +Puppet has conditionals and switching. +Typically, the most reliable way to ensure some code runs on one machine but not +others is to use the `case` statement on the `hostname` fact. +Example: + +``` puppet +case $::hostname { + 'scruffy': { + notify { "I'm Scruffy. The Janitor.": } + } + + 'bender': { + notify { "My full name is Bender Bending Rodriguez": } + } + + default: { + notify { "Wha?": } + } +} +``` + +One thing to note here is that Puppet always **requires** a default path +on a case statement. +Default is equivalent to "anything that isn't matched above". diff --git a/docs/puppet.md b/docs/puppet.md new file mode 100644 index 0000000..b8f2e31 --- /dev/null +++ b/docs/puppet.md @@ -0,0 +1,144 @@ +# wtf is a puppet? + +Puppet is configuration management tool, written in Ruby, that compiles +and runs code written in the Puppet language. + +But what does that actually mean in words a human can understand? +Puppet is a tool that runs some code and that code can do all sorts of +really powerful things to configure computers for you. + +Why do I want code mucking about with my laptop though? +For the exact same reasons you want code configuring your server. +In particular, homogeneity, reproducibility, reusability, and automation. +When you use code to express how a machine should be configured, +you know that all of your machines are configured the same way, +that you can repeat that configuration any number of times, +and that you don't have to do it manually each time. + +## How does Puppet work? + +A Puppet run has two main steps: compilation and application. + +The compilations step starts with reading in what's called the site manifest. +The site manifest is a single file that contains Puppet code that is responsible +for telling the compiler what other Puppet code it should compile. + +Here are the first few lines of the default site manifest for Boxen: + +``` +include boxen::environment +include homebrew +include gcc +``` + +This tells the Puppet compiler that it must include the classes +`boxen::environment`, `homebrew`, and `gcc`. +Puppet will look for those classes on the modulepath. +Typically, these files would be located at +`$modulepath/boxen/manifests/environment.pp` and +`$modulepath/homebrew/manifests/init.pp`. + +These might include other classes as well, or define **resources**. +Resources are the building blocks of Puppet. +A resource is an abstract description about a **thing** and the **state** +that thing should be in. +Every resource has a **type**, which is just a classification of resources. +For example, we might have a resource `Package[mysql]` and its type would be +`Package`. +Puppet also supports multiple providers for types which act as pluggable +backends depending on the operating system it's running on or the tools +available on a particular system (in the case of the `Package` type, +we might have providers for `yum` and for `aptget`). + +So now the Puppet compiler has finished tracking down and loading all the +classes and resources it needs. +Assuming we haven't encountered any compile-time errors, Puppet then begins +the next phase of a run: applying the catalog. + +All of the resources Puppet has collected into the catalog have formed a +DAG (directed, acyclic graph) that represents the order in which all these +resources can be applied in a correct order. +Puppet simply grabs the first "node" in this graph and traverses all nodes +in the graph, applying each resource as it goes. + +Application of an individual resource starts with Puppet asking "is this +resource in the state requested?" If the answer is yes, Puppet moves onto the +next node and repeats this process. If the answer is no, Puppet will make +whatever changes it can to reconcile the current state of the resource with +what it should be, and then continues on. + +Once all resources have been applied, the Puppet run is complete. + +## Declarative by nature + +One of the most confusing parts of the Puppet language to many newcomers is +how the Puppet catalog orders and applies resources. +The key thing to remember is that Puppet is a **declarative** language rather +than a procedural one. +In human words, the only order that matters in Puppet is order specified by +relationships between resources. + +Here's an example of how someone new to Puppet might write a class: + +``` puppet +class mysql { + file { '/etc/my.cnf': source => 'puppet:///modules/mysql/my.cnf.erb' ; } + package { 'mysql': } + service { 'mysql': } +} +``` + +Someone expecting Puppet to be procedural would read this manifest as a list +saying: + +* First create the my.cnf file +* Then install the mysql package +* Then start the mysql service + +The problem is, they would be **wrong**. +There is no guarantee Puppet will apply these resources in that order, +and it's quite likely that it won't. + +The proper way to ensure ordering in Puppet is to use one of the four +**relationship metaparameters**: + +* before - Run this resource before another resource +* notify - Same as before, but triggers a refresh on that resource +* require - Run this resource after another resource +* subscribe - Same as require, but triggers a refresh on that resource + +The behavior of these metaparameters should be pretty clear. +Triggering a resource simply means that a resource will "refresh" itself. +That typically means something like a `Service` resource restarting itself. +It's important to remember that these metaparameters are valid on **any** resource. + +So, let's rewrite our example properly: + +``` puppet +class mysql { + file { '/etc/my.cnf': + source => 'puppet:///modules/mysql/my.cnf.erb', + notify => Service['mysql'] + } + + package { 'mysql': + notify => Service['mysql'] + } + + service { 'mysql': } +} +``` + +Now we're telling Puppet what order to apply these resources in: + +* Make sure /etc/my.cnf is in place before we start the mysql service +* If /etc/my.cnf changes, tell mysql to restart +* Make sure the mysql package is in place before we start the mysql service +* If the mysql package changes, tell mysql to restart + +It's important to note that we didn't tell Puppet if `File[/etc/my.cnf]` +should come before or after `Package[mysql]`. +This is intentional. +Most package managers won't overwrite a configuration file that already exists +at package install-time, so in this case, we can assume installing the mysql +package won't clobber our custom `/etc/my.cnf` file. diff --git a/docs/rails.md b/docs/rails.md index 35cd487..79f69ab 100644 --- a/docs/rails.md +++ b/docs/rails.md @@ -18,11 +18,11 @@ class projects::rails_app { include phantomjs boxen::project { 'rails_app': - source => 'mycompany/rails_app', ruby => '1.9.3', mysql => true, redis => true, nginx => true, + source => 'username/rails_app' } } ``` diff --git a/manifests/site.pp b/manifests/site.pp index cb3e9ea..40b7d69 100644 --- a/manifests/site.pp +++ b/manifests/site.pp @@ -1,5 +1,6 @@ require boxen::environment -require homebrew::repo +require homebrew +require gcc Exec { group => 'staff', @@ -8,6 +9,8 @@ Exec { path => [ "${boxen::config::home}/rbenv/shims", + "${boxen::config::hime}/rbenv/bin", + "${boxen::config::hime}/rbenv/plugins/ruby-build/bin", "${boxen::config::home}/homebrew/bin", '/usr/bin', '/bin', @@ -16,7 +19,7 @@ Exec { ], environment => [ - "HOMEBREW_CACHE=${homebrew::cachedir}", + "HOMEBREW_CACHE=${homebrew::config::cachedir}", "HOME=/Users/${::luser}" ] } @@ -43,6 +46,8 @@ Service { provider => ghlaunchd } +Homebrew::Formula <| |> -> Package <| |> + node default { # core modules, needed for most things include dnsmasq diff --git a/script/bootstrap b/script/bootstrap index 6fac744..b8760f6 100755 --- a/script/bootstrap +++ b/script/bootstrap @@ -13,10 +13,7 @@ set -e rm -rf .bundle/config rm -rf .librarian/puppet/config -# Export CC to explicitly set the compiler used for cexts. - -export CC=gcc - # Bundle install unless we're already up to date. +export PATH=$(pwd)/vendor/shims:$PATH bundle install --binstubs bin --path .bundle --quiet "$@" diff --git a/script/boxen-my-config b/script/boxen-my-config index 3975d9e..66050b4 100755 --- a/script/boxen-my-config +++ b/script/boxen-my-config @@ -19,6 +19,6 @@ unless File.exist? path end end -exec(editor, path) if editor && system("tty -s") +exec(editor, path) if editor && system("test -t 1") puts path diff --git a/script/nuke b/script/nuke index d1ca2a5..4a06979 100755 --- a/script/nuke +++ b/script/nuke @@ -14,11 +14,13 @@ services = false OptionParser.new do |o| o.banner = "Remove most traces of Boxen from your machine." - o.on("--all", "Remove everything possible.") { all = true } - o.on("--force", "Actually do it.") { force = true } - o.on("--help", "Show this help.") { abort o.to_s } - o.on("--opt", "Remove /opt/boxen.") { opt = true } - o.on("--services", "Remove and unload services.") { services = true } + o.on("--all", "Remove everything possible.") { all = true } + o.on("--force", "Actually do it.") { force = true } + o.on("--help", "Show this help.") { abort o.to_s } + o.on("--opt", "Remove /opt/boxen.") { opt = true } + o.on("--services", "Remove and unload services.") { services = true } + o.on("--receipts", "Remove package receipts used by Puppet.") { receipts = true } + o.on("--gitconfig", "Remove Boxen-provided git credential helper config.") { gitconfig = true } o.parse! @@ -31,7 +33,7 @@ end if all || services boxen_services = [] - boxen_services << Dir["/Library/Launch*/com.boxen.*.plist"] + boxen_services << Dir["/Library/Launch*/dev.*.plist"] boxen_services.flatten.each do |plist| warn "-> Removing #{plist}." @@ -49,3 +51,13 @@ if all || opt warn "-> Removing /opt/boxen." system "rm", "-rf", "/opt/boxen" if force end + +if all || receipts + warn "-> Removing /var/db/.puppet_*." + system "rm", "-rf", "/var/db/.puppet_*" if force +end + +if all || gitconfig + warn "-> Removing git credential helper config." + system "/usr/bin/git", "config", "--global", "--unset", "credential.helper" +end diff --git a/vendor/cache/boxen-0.7.1.gem b/vendor/cache/boxen-0.7.1.gem deleted file mode 100644 index 9a7f6c097a43e422c8dc69741fac19fc09132eec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23552 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 it^OL?Uwa!%gqh(pZ1^px0aiikL!Pr{VzQS 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