TemplateWriting

Version 19 (Justin Sherrill, 02/02/2011 05:17 pm)

1 1
h1. Templates
2 1
3 1
4 1
5 16 Justin Sherrill
The following functions and macros can be used within templates.  These are guaranteed to work via the safemode rendering, to ensure a template can do nothing harmful. With safemode disabled other macros may work, but are not supported at this time.
6 15 Justin Sherrill
7 15 Justin Sherrill
To ensure that safemode is enabled, set ":safemode_render = true"  in settings.yml.  Safemode rendering prevents templates from reading and writing files on the file system or modifying application data within foreman.  
8 1
9 1
10 8 Justin Sherrill
h2. Accessing Templates
11 1
12 10 Justin Sherrill
There are two ways to render a template, based on a single host, or based on a Hostgroup.  The host or hostgroup provides all the details with which to render the template.  
13 1
14 10 Justin Sherrill
15 8 Justin Sherrill
h3. Host-based Rendering
16 8 Justin Sherrill
17 13 Justin Sherrill
Only a single template of each type may be rendered for a system.  Foreman determines which template to use following these rules:
18 1
19 13 Justin Sherrill
1. Only the templates of the appropriate kind and associated with the hosts operating system are considered
20 13 Justin Sherrill
2. If a template has a hostgroup/environment combination that matches that of the host, use this template else
21 13 Justin Sherrill
3. If a template is associated with the environment of the host, use this template, else
22 13 Justin Sherrill
4. Use the first template found associated with the operating system associated with the host.
23 1
24 13 Justin Sherrill
So essentially, the hostgroup/environment combination is used first, then just the environment, and finally just the operating system of the host.
25 13 Justin Sherrill
26 13 Justin Sherrill
27 1
To access a template of a certain type simply use this url:
28 1
29 13 Justin Sherrill
@/unattended/KIND_NAME@
30 1
31 13 Justin Sherrill
For example:    @/unattended/provision@
32 12 Justin Sherrill
would render the provisioning template.  The host will be based on the IP Address it is accessed from.  To spoof a template simply access the url in this manner:
33 12 Justin Sherrill
34 13 Justin Sherrill
@/unattended/provision?spoof=192.168.0.1@
35 12 Justin Sherrill
36 12 Justin Sherrill
where 192.168.0.1 is the ip address of the system you want to spoof. This allows you to view a template for a particular system from anywhere.  
37 8 Justin Sherrill
38 8 Justin Sherrill
39 17 Justin Sherrill
40 8 Justin Sherrill
h3. Hostgroup-based rendering
41 9 Justin Sherrill
42 8 Justin Sherrill
Allows any template to be rendered for any Hostgroup.  When rendering using a hostgroup, @host is actually the hostgroup instead of a defined host. The default values for the hostgroup are used for templated values.  This means if a value is not set in the hostgroup, you may get an error when rendering the template.  To access a template using a Hostgroup to render, simply use this URL:
43 8 Justin Sherrill
44 8 Justin Sherrill
/unattended/template/Template Name/Hostgroup Name
45 8 Justin Sherrill
46 8 Justin Sherrill
For example, a hostgroup of name Finance, and a template named WebServerKickstart could be rendered using the url:
47 8 Justin Sherrill
48 11 Justin Sherrill
/unattended/template/WebServerKickstart/Finance
49 1
50 10 Justin Sherrill
h4.  PXE Menus
51 10 Justin Sherrill
52 16 Justin Sherrill
Pxe Menus can be deployed to smart proxies from the Config Templates list page (/config_templates).  All provision templates will be added with each of their hostgroup combinations.  For example if the template "WebServerKickstart" is associated to the Hostgroup1/Production, Hostgroup2/Production, and Hostgroup2/Testing combinations, the template would only be added twice.  Once for WebServerKickstart-Hostgroup1 and WebServerKickstart-Hostgroup2.
53 8 Justin Sherrill
54 8 Justin Sherrill
h2. Writing templates
55 17 Justin Sherrill
56 17 Justin Sherrill
Templates can be written using common ERB style templating.  Here's an example on using a variable/function:
57 17 Justin Sherrill
58 17 Justin Sherrill
@rootpw --iscrypted <%= root_pass %>@
59 17 Justin Sherrill
60 17 Justin Sherrill
Using a simple conditional:
61 17 Justin Sherrill
62 17 Justin Sherrill
@<%= "selinux --disabled\n" if @osver != 3 -%>@
63 17 Justin Sherrill
This would include a line to disable selinux if the operating system version is not 3 (since Selinux isn't supported on RHEL 3)
64 17 Justin Sherrill
65 17 Justin Sherrill
Another way to do conditional (with if/elsif/else):
66 17 Justin Sherrill
67 18 Justin Sherrill
<pre>
68 17 Justin Sherrill
<% if @osver == 5 -%>
69 17 Justin Sherrill
 echo "uses yum"
70 17 Justin Sherrill
<% elsif @osver == 4 -%>
71 17 Justin Sherrill
 echo "uses up2date
72 17 Justin Sherrill
<% else -%>
73 17 Justin Sherrill
 echo "I'm not sure"
74 17 Justin Sherrill
<% end -%>
75 18 Justin Sherrill
</pre>
76 8 Justin Sherrill
77 8 Justin Sherrill
78 8 Justin Sherrill
79 8 Justin Sherrill
h2. Functions and macros:
80 8 Justin Sherrill
81 1
|_.Name|_.Description|_.Example|
82 1
|root_pass  |The root password configured for the system| |
83 19 Justin Sherrill
|ks_console |A string assembled using the port and baud of the host which can be added to a kernel line | ks_console => console=ttyS1,9600 |
84 6 Justin Sherrill
|snippets(name)   | Renders the specified snippet | |
85 1
|foreman_url(kind)| Provides the full URL to a host-rendered template of the given kind  | foreman_url("provision") =>  http://HOST/unattended/provision |
86 1
|@host                |The name of the host| |
87 1
|@host.name                |The name of the host| |
88 1
|@host.diskLayout     |The disklayout of the host (could come from the operating system)| |
89 1
|@host.puppetmaster   |The puppetmaster the host should use | |
90 1
|@host.architecture   |The arch of the host (i.e. x86_64)| |
91 1
|@host.operatingsystem|The operating system name| |
92 1
|@host.operatingsystem.media_url |||
93 1
|@host.operatingsystem.major |The major version of the OS||
94 1
|@host.operatingsystem.minor |The minor version of the OS||
95 1
|@host.operatingsystem.family |The OS Family (I.e. redhat, debian, etc.)||
96 1
|@host.url_for_boot(:kernel) |||
97 1
|@host.url_for_boot(:initrd) |||
98 1
99 1
100 2 Justin Sherrill
101 8 Justin Sherrill
h3. Kickstart only variables:
102 1
103 1
|_.Name|_.Description|_.Example|
104 1
|@dynamic |||
105 1
|@osver |||
106 1
|@arch |||
107 1
|@mediapath |||
108 1
|@epel |||
109 1
|@yumrepo |||
110 1
|@static |||
111 1
112 8 Justin Sherrill
h3. Preseed attributes:
113 6 Justin Sherrill
114 1
|_.Name|_.Description|_.Example|
115 1
|@preseed_path |||
116 1
|@preseed_server |||