Project

General

Profile

External Nodes » History » Version 23

Brian Gupta, 07/19/2012 07:33 PM

1 3 Ohad Levy
h1. Foreman can act as a classifier to Puppet through the external nodes interface.
2 1 Ohad Levy
3 10 Ohad Levy
You can now configure your hosts via a web interface, avoiding typing host specific information in your manifest.
4
5 4 Ohad Levy
{{toc}}
6
7 2 Ohad Levy
h2. Import your environment and classes setup
8 1 Ohad Levy
9 11 Ohad Levy
First of all, you probably want to let Foreman know about your setup, if you are using puppet modules - Foreman can import your setup automatically (environments and classes) by:
10 1 Ohad Levy
11
<pre>
12
rake puppet:import:puppet_classes RAILS_ENV=production
13
</pre>
14
15 13 Marcello de Sousa
If you get a prompt you might avoid it with the batch mode using:
16
<pre>
17
rake puppet:import:puppet_classes[batch] RAILS_ENV=production
18
</pre>
19
20
21 1 Ohad Levy
If you prefer, you may manually add classes through the setting page, however, the class names must match Puppet classes.
22
23 14 keith obrien
if for some reason you can't see your nodes, please make sure that you have the following line in your puppet.conf file (or similar)
24 12 Ohad Levy
<pre>modulepath=/etc/puppet/modules</pre> 
25 1 Ohad Levy
26 2 Ohad Levy
h2. Define classes and variables per host
27 1 Ohad Levy
28
You can define per host, classes and variables(parameters), simply create/edit a host, and select its classes.
29
if you see an empty list, make sure that you do have classes (as define in the step above).
30
31
If you want to add variables(parameters), simply add them in the same page as a set name and value.
32
33 2 Ohad Levy
h2. Host Groups
34 1 Ohad Levy
35 3 Ohad Levy
Foreman allows you to group classes, into common groups similar to node inheritances in puppet 
36 16 Ohad Levy
Each group can contain many classes, variables, Provisioning information, and can even inherit from one another (You may think of them as templates for your hosts).
37 1 Ohad Levy
38
If you wish to override the parameters for a specific host, create a parameter with the same name in the host level, 
39 3 Ohad Levy
Foreman will override the values defined in the group level.
40 1 Ohad Levy
41
42 2 Ohad Levy
h2. Other places you can define parameters
43 1 Ohad Levy
44 5 Ohad Levy
It is also possible to define default (common) parameters for all of your hosts (setting -> Global parameters).
45 15 Ohad Levy
Additionally, you can also define them on the domain and operating system level (settings -> Domain -> Domain Parameters)
46 1 Ohad Levy
47
*The order in which the parameters are processed is:
48 15 Ohad Levy
Global, Domain, OS, Host Group and Node, the last occurrence of the parameter will be the one used.
49 1 Ohad Levy
*
50
51 9 Ohad Levy
h2. Example puppet external nodes script
52 1 Ohad Levy
53 23 Brian Gupta
The example below is OLD and does not import facts, please look at the new ENC script example here: https://github.com/theforeman/puppet-foreman/blob/master/templates/external_node.rb.erb
54
55 18 Mikael Fridh
You may find an example script under *extras/puppet/foreman/templates/external_node.rb.erb* - edit it and copy it to, for example: @/etc/puppet/node.rb@.
56 1 Ohad Levy
57 17 Corey Osman
<pre>
58
#! /usr/bin/ruby
59
# a simple script which fetches external nodes from Foreman
60
# you can basically use anything that knows how to get http data, e.g. wget/curl
61
 etc.
62
63
# Foreman url
64
foreman_url="http://foreman.sampledomain.corp"
65
66
require 'net/http'
67 19 Johann Hartwig Hauschild
require 'net/https' if foreman_url =~ /^https/
68 17 Corey Osman
69
foreman_url += "/node/#{ARGV[0]}?format=yml"
70
url = URI.parse(foreman_url)
71 20 Johann Hartwig Hauschild
con = Net::HTTP.new(url.host, url.port)
72 19 Johann Hartwig Hauschild
con.use_ssl = (url.scheme == 'https')
73 17 Corey Osman
req = Net::HTTP::Get.new(foreman_url)
74 19 Johann Hartwig Hauschild
res = con.start { |http| http.request(req) }
75 17 Corey Osman
76
case res
77
when Net::HTTPOK
78
  puts res.body
79
else
80
  $stderr.puts "Error retrieving node %25s: %25s" %25 [ARGV[0], res.class]
81
end
82
</pre>
83 1 Ohad Levy
84
You would need to setup puppet to use external nodes 
85
<pre>  external_nodes = /etc/puppet/node.rb
86
  node_terminus  = exec</pre>
87 21 Lloyd Fournier
88
89 22 Lloyd Fournier
Make sure that the puppet user can execute your enc script and it works:
90 21 Lloyd Fournier
<pre>
91
sudo su - puppet -s /bin/bash
92
/etc/puppet/node.rb [the name of a node, eg agent.local]
93
</pre>
94
95
should output something like:
96
<pre>
97
  parameters: 
98
    puppetmaster: puppet
99
    foreman_env: &id001 production
100
    root_pw: xybxa6JUkz63w
101
  classes: 
102
    - helloworld
103
  environment: *id001
104
</pre>
105
106 1 Ohad Levy
For additional info please see "Puppet documentation":http://reductivelabs.com/trac/puppet/wiki/ExternalNodes
107
108
h2. Verify your setup
109
110 8 Ohad Levy
You may also click on the YAML link to see the output that would be used for puppet external nodes.
111
112
h2. Import your external node setup from an older external node setup
113
114
If you already had an external node setup, you can import your old setup directly to Foreman
115
116
*Note*: This will import your classes and variables (parameters or tags) directly, that means that if you have any logic to dynamically generate the variables, it would not be imported.
117
However, if you define your parameters in the domain level (for example) they will not be added to every single host, therefor, if you want to apply certain parameters per domain, host class etc, you should define them prior to running the importer.
118
119
additionally, it will not import any invalid settings, e.g. parameters which has the same name as facts, or a non string parameters (some classifiers tend to create those).
120
121
To import the classes and parameters per host, run:
122
123
<pre>
124
rake puppet:import:external_nodes script=/path/to/old_external_node_script RAILS_ENV=production
125
</pre>
126
127
128 1 Ohad Levy
*Note*: This will only scan for hosts that already exists in our database, if you want to import hosts, use one of the other importers.