1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
.*.swp
84 changes: 81 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,82 @@
node_manager
============

Create and manage node groups as resources.
#node_manager

####Table of Contents
1. [Overview](#overview)
1. [Requirements] (#requirements)
1. [Types] (#types)
* [Node_group] (#node_group)
* [Puppet_environment] (#puppet_environment)

## Overview

Create and manage Node Manager API endpoints as resources.

## Requirements:

- *nix operating system
- Puppet >= 3.7.1

## Types

### Node_group

Node_groups will autorequire parent node_groups.

Enumerate all node groups:
* `puppet resource node_group`<br />

Example output for `puppet resource node_group 'PE MCollective'`
```
node_group { 'PE MCollective':
ensure => 'present',
classes => {'puppet_enterprise::profile::mcollective::agent' => {}},
environment => 'production',
id => '4cdec347-20c6-46d7-9658-7189c1537ae9',
override_environment => 'false',
parent => 'PE Infrastructure',
rule => ['and', ['~', ['fact', 'pe_version'], '.+']],
}
```

### Node_group parameters

* `classes`<br />
Classes that are assigned to the node in hash format. Elements of the hash
are class parameters. Default (empty hash): `{}`

* `environment`<br />
Environment selected for this node group. Default: `production`

* `name`<br />
(namevar) Node group's name.

* `id`<br />
Universal ID for the group. This attribute is read-only.

* `override_environment`<br />
Whether or not this group's environment ment setting overrides
all other other environments. Default: `false`

* `parent`<br />
The UID for the data group. Can be specified by group name or
UID. Default: `default`

* `rules`<br />
An array of classification rules. Default (empty hash): `{}`

### Puppet_environment

Enumerate all puppet environments:
* `puppet resource puppet_environment`<br />

Example output for `puppet resource puppet_environment production`
```
puppet_environment { 'production':
ensure => 'present',
}
```
### Puppet_environment parameters

* `name`<br />
(namevar) Name of the Puppet environment on disk, i.e. the directory name in `$environmentpath`.
58 changes: 58 additions & 0 deletions docs/PE_groups.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
Run this through puppet apply to re-create PE groups. Replace 'master.puppetlabs.vm' with your master hostname as well as any other ports configs, etc.
```
node_group { 'PE ActiveMQ Broker':
ensure => 'present',
classes => {'puppet_enterprise::profile::amq::broker' => {}},
environment => 'production',
override_environment => 'false',
parent => 'PE Infrastructure',
rule => ['or', ['=', 'name', 'master.puppetlabs.vm']],
}
node_group { 'PE Certificate Authority':
ensure => 'present',
classes => {'puppet_enterprise::profile::certificate_authority' => {}},
environment => 'production',
override_environment => 'false',
parent => 'PE Infrastructure',
rule => ['or', ['=', 'name', 'master.puppetlabs.vm']],
}
node_group { 'PE Console':
ensure => 'present',
classes => {'pe_console_prune' => {'prune_upto' => '30'}, 'puppet_enterprise::license' => {}, 'puppet_enterprise::profile::console' => {}, 'puppet_enterprise::profile::mcollective::console' => {}},
environment => 'production',
override_environment => 'false',
parent => 'PE Infrastructure',
rule => ['or', ['=', 'name', 'master.puppetlabs.vm']],
}
node_group { 'PE Infrastructure':
ensure => 'present',
classes => {'puppet_enterprise' => {'certificate_authority_host' => 'master.puppetlabs.vm', 'console_host' => 'master.puppetlabs.vm', 'console_port' => '443', 'database_host' => 'master.puppetlabs.vm', 'database_port' => '5432', 'database_ssl' => 'true', 'mcollective_middleware_hosts' => ['master.puppetlabs.vm'], 'puppet_master_host' => 'master.puppetlabs.vm', 'puppetdb_database_name' => 'pe-puppetdb', 'puppetdb_database_user' => 'pe-puppetdb', 'puppetdb_host' => 'master.puppetlabs.vm', 'puppetdb_port' => '8081'}},
environment => 'production',
override_environment => 'false',
parent => 'default',
}
node_group { 'PE MCollective':
ensure => 'present',
classes => {'puppet_enterprise::profile::mcollective::agent' => {}},
environment => 'production',
override_environment => 'false',
parent => 'PE Infrastructure',
rule => ['and', ['~', ['fact', 'pe_version'], '.+']],
}
node_group { 'PE Master':
ensure => 'present',
classes => {'pe_repo' => {}, 'pe_repo::platform::el_6_x86_64' => {}, 'puppet_enterprise::profile::master' => {}, 'puppet_enterprise::profile::master::mcollective' => {}, 'puppet_enterprise::profile::mcollective::peadmin' => {}},
environment => 'production',
override_environment => 'false',
parent => 'PE Infrastructure',
rule => ['or', ['=', 'name', 'master.puppetlabs.vm']],
}
node_group { 'PE PuppetDB':
ensure => 'present',
classes => {'puppet_enterprise::profile::puppetdb' => {}},
environment => 'production',
override_environment => 'false',
parent => 'PE Infrastructure',
rule => ['or', ['=', 'name', 'master.puppetlabs.vm']],
}
```
92 changes: 92 additions & 0 deletions lib/puppet/provider/helpers.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
class Helpers
require 'yaml'
require 'net/http'
require 'openssl'

def self.rest_helper(method, endpoint, args={})

app = args['app'] ? args['app'] : 'classifier-api'
data = args['data'] ? args['data'] : false
v = args['v'] ? args['v'] : 'v1'

case app
when 'classifier-api'
begin
nc_settings = YAML.load_file("#{Puppet.settings['confdir']}/classifier.yaml")
rescue
fail "Could not find file #{Puppet.settings['confdir']}/classifier.yaml"
else
server = nc_settings['server']
port = nc_settings['port']
end
when 'rbac-api'
server = 'puppet'
port = '4433'
end

rest_endpoint = "/#{app}/#{v}/#{endpoint}"
Puppet.debug(rest_endpoint)
http = Net::HTTP.new(server, port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
http.cert = OpenSSL::X509::Certificate.new(File.read(Puppet.settings['hostcert']))
http.key = OpenSSL::PKey::RSA.new(File.read(Puppet.settings['hostprivkey']))
http.ca_file = Puppet.settings['localcacert']

case method
when 'GET'
req = Net::HTTP::Get.new(rest_endpoint)
when 'POST'
req = Net::HTTP::Post.new(rest_endpoint)
req.body = data
when 'PUT'
req = Net::HTTP::Put.new(rest_endpoint)
req.body = data
when 'DELETE'
req = Net::HTTP::Delete.new(rest_endpoint)
else
fail "#{method} is not a supported method."
end

req['Content-Type'] = 'application/json'
resp = http.request(req)
Puppet.debug "Response code #{resp.code}"

resp

end

def self.data_hash(param_hash, filter=false)
# Construct JSON string, not JSON object
data = '{ '
param_hash.each do |k,v|
if !filter or filter.include? k
data += "\"#{k}\": "
if v.is_a?(String)
data += "\"#{v}\","
elsif v.is_a?(Hash)
data += v.to_s.gsub(/=>/, ':')
data += ','
else
data += "#{v},"
end
end
end
data = data.gsub(/^(.*),/, '\1 }')
Puppet.debug data
data
end

def self.get_args(param_hash, filter=false)
data = '?'
param_hash.each do |k,v|
if !filter or filter.include? k
data += "#{k}=#{v}&"
end
end
data = data.gsub(/^(.*)&/, '\1 }')
Puppet.debug data
data
end

end
32 changes: 32 additions & 0 deletions lib/puppet/provider/nc_api.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
class Puppet::Provider::Nc_api < Puppet::Provider
require 'puppet/provider/helpers'

def self.rest(method, endpoint, data=false)

resp = Helpers.rest_helper(method, endpoint, {'app' => 'classifier-api', 'data' => data})

case resp.code
when '200','204'
resp.body
when '201'
info "New environment created as #{resp.body}"
resp.body
when '303'
info "Added #{resp['Location']} to #{endpoint}"
resp['Location']
when '422'
jresp = JSON.parse(resp.body)
debug_message = "#{jresp['kind']}: "
jresp['details'].each do |k,detail|
debug_message += "#{k}: #{value} "
end
debug debug_message
fail jresp['kind']
else
fail "#{resp.code}: #{resp.message}\n#{resp.body}"
jresp = JSON.parse(resp.body)
debug jresp['kind']
end
end

end
Loading