Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
P
packer
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Kristopher Ruzic
packer
Commits
1566b4d8
Commit
1566b4d8
authored
Aug 27, 2013
by
Mitchell Hashimoto
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
builder/vmware: support vmx_template_path [GH-270]
parent
c753946c
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
143 additions
and
6 deletions
+143
-6
CHANGELOG.md
CHANGELOG.md
+2
-0
builder/vmware/builder.go
builder/vmware/builder.go
+26
-0
builder/vmware/builder_test.go
builder/vmware/builder_test.go
+50
-0
builder/vmware/step_create_vmx.go
builder/vmware/step_create_vmx.go
+32
-6
website/source/docs/builders/vmware.html.markdown
website/source/docs/builders/vmware.html.markdown
+33
-0
No files found.
CHANGELOG.md
View file @
1566b4d8
...
...
@@ -16,6 +16,8 @@ IMPROVEMENTS:
*
builder/amazon: Tagging now works with all amazon builder types.
*
builder/vmware: Option
`ssh_skip_request_pty`
for not requesting a PTY
for the SSH connection. [GH-270]
*
builder/vmware: Specify a
`vmx_template_path`
in order to customize
the generated VMX. [GH-270]
*
command/build: Machine-readable output now contains build errors, if any.
*
command/build: An "end" sentinel is outputted in machine-readable output
for artifact listing so it is easier to know when it is over.
...
...
builder/vmware/builder.go
View file @
1566b4d8
...
...
@@ -6,6 +6,7 @@ import (
"github.com/mitchellh/multistep"
"github.com/mitchellh/packer/common"
"github.com/mitchellh/packer/packer"
"io/ioutil"
"log"
"math/rand"
"os"
...
...
@@ -49,6 +50,7 @@ type config struct {
ToolsUploadFlavor
string
`mapstructure:"tools_upload_flavor"`
ToolsUploadPath
string
`mapstructure:"tools_upload_path"`
VMXData
map
[
string
]
string
`mapstructure:"vmx_data"`
VMXTemplatePath
string
`mapstructure:"vmx_template_path"`
VNCPortMin
uint
`mapstructure:"vnc_port_min"`
VNCPortMax
uint
`mapstructure:"vnc_port_max"`
...
...
@@ -152,6 +154,7 @@ func (b *Builder) Prepare(raws ...interface{}) error {
"boot_wait"
:
&
b
.
config
.
RawBootWait
,
"shutdown_timeout"
:
&
b
.
config
.
RawShutdownTimeout
,
"ssh_wait_timeout"
:
&
b
.
config
.
RawSSHWaitTimeout
,
"vmx_template_path"
:
&
b
.
config
.
VMXTemplatePath
,
}
for
n
,
ptr
:=
range
templates
{
...
...
@@ -298,6 +301,14 @@ func (b *Builder) Prepare(raws ...interface{}) error {
errs
,
fmt
.
Errorf
(
"tools_upload_path invalid: %s"
,
err
))
}
if
b
.
config
.
VMXTemplatePath
!=
""
{
if
err
:=
b
.
validateVMXTemplatePath
();
err
!=
nil
{
errs
=
packer
.
MultiErrorAppend
(
errs
,
fmt
.
Errorf
(
"vmx_template_path is invalid: %s"
,
err
))
}
}
if
b
.
config
.
VNCPortMin
>
b
.
config
.
VNCPortMax
{
errs
=
packer
.
MultiErrorAppend
(
errs
,
fmt
.
Errorf
(
"vnc_port_min must be less than vnc_port_max"
))
...
...
@@ -414,3 +425,18 @@ func (b *Builder) Cancel() {
b
.
runner
.
Cancel
()
}
}
func
(
b
*
Builder
)
validateVMXTemplatePath
()
error
{
f
,
err
:=
os
.
Open
(
b
.
config
.
VMXTemplatePath
)
if
err
!=
nil
{
return
err
}
defer
f
.
Close
()
data
,
err
:=
ioutil
.
ReadAll
(
f
)
if
err
!=
nil
{
return
err
}
return
b
.
config
.
tpl
.
Validate
(
string
(
data
))
}
builder/vmware/builder_test.go
View file @
1566b4d8
...
...
@@ -437,6 +437,56 @@ func TestBuilderPrepare_ToolsUploadPath(t *testing.T) {
}
}
func
TestBuilderPrepare_VMXTemplatePath
(
t
*
testing
.
T
)
{
var
b
Builder
config
:=
testConfig
()
// Test bad
config
[
"vmx_template_path"
]
=
"/i/dont/exist/forreal"
err
:=
b
.
Prepare
(
config
)
if
err
==
nil
{
t
.
Fatal
(
"should have error"
)
}
// Test good
tf
,
err
:=
ioutil
.
TempFile
(
""
,
"packer"
)
if
err
!=
nil
{
t
.
Fatalf
(
"err: %s"
,
err
)
}
defer
os
.
Remove
(
tf
.
Name
())
defer
tf
.
Close
()
if
_
,
err
:=
tf
.
Write
([]
byte
(
"HELLO!"
));
err
!=
nil
{
t
.
Fatalf
(
"err: %s"
,
err
)
}
config
[
"vmx_template_path"
]
=
tf
.
Name
()
b
=
Builder
{}
err
=
b
.
Prepare
(
config
)
if
err
!=
nil
{
t
.
Fatalf
(
"should not have error: %s"
,
err
)
}
// Bad template
tf2
,
err
:=
ioutil
.
TempFile
(
""
,
"packer"
)
if
err
!=
nil
{
t
.
Fatalf
(
"err: %s"
,
err
)
}
defer
os
.
Remove
(
tf2
.
Name
())
defer
tf2
.
Close
()
if
_
,
err
:=
tf2
.
Write
([]
byte
(
"{{foo}"
));
err
!=
nil
{
t
.
Fatalf
(
"err: %s"
,
err
)
}
config
[
"vmx_template_path"
]
=
tf2
.
Name
()
b
=
Builder
{}
err
=
b
.
Prepare
(
config
)
if
err
==
nil
{
t
.
Fatal
(
"should have error"
)
}
}
func
TestBuilderPrepare_VNCPort
(
t
*
testing
.
T
)
{
var
b
Builder
config
:=
testConfig
()
...
...
builder/vmware/step_create_vmx.go
View file @
1566b4d8
package
vmware
import
(
"bytes"
"fmt"
"github.com/mitchellh/multistep"
"github.com/mitchellh/packer/packer"
"io/ioutil"
"log"
"os"
"path/filepath"
"text/template"
)
type
vmxTemplateData
struct
{
...
...
@@ -42,11 +42,37 @@ func (stepCreateVMX) Run(state map[string]interface{}) multistep.StepAction {
ISOPath
:
isoPath
,
}
var
buf
bytes
.
Buffer
t
:=
template
.
Must
(
template
.
New
(
"vmx"
)
.
Parse
(
DefaultVMXTemplate
))
t
.
Execute
(
&
buf
,
tplData
)
vmxTemplate
:=
DefaultVMXTemplate
if
config
.
VMXTemplatePath
!=
""
{
f
,
err
:=
os
.
Open
(
config
.
VMXTemplatePath
)
if
err
!=
nil
{
err
:=
fmt
.
Errorf
(
"Error reading VMX template: %s"
,
err
)
state
[
"error"
]
=
err
ui
.
Error
(
err
.
Error
())
return
multistep
.
ActionHalt
}
defer
f
.
Close
()
rawBytes
,
err
:=
ioutil
.
ReadAll
(
f
)
if
err
!=
nil
{
err
:=
fmt
.
Errorf
(
"Error reading VMX template: %s"
,
err
)
state
[
"error"
]
=
err
ui
.
Error
(
err
.
Error
())
return
multistep
.
ActionHalt
}
vmxTemplate
=
string
(
rawBytes
)
}
vmxContents
,
err
:=
config
.
tpl
.
Process
(
vmxTemplate
,
tplData
)
if
err
!=
nil
{
err
:=
fmt
.
Errorf
(
"Error procesing VMX template: %s"
,
err
)
state
[
"error"
]
=
err
ui
.
Error
(
err
.
Error
())
return
multistep
.
ActionHalt
}
vmxData
:=
ParseVMX
(
buf
.
String
()
)
vmxData
:=
ParseVMX
(
vmxContents
)
if
config
.
VMXData
!=
nil
{
log
.
Println
(
"Setting custom VMX data..."
)
for
k
,
v
:=
range
config
.
VMXData
{
...
...
website/source/docs/builders/vmware.html.markdown
View file @
1566b4d8
...
...
@@ -190,6 +190,13 @@ Optional:
uses a randomly chosen port in this range that appears available. By default
this is 5900 to 6000. The minimum and maximum ports are inclusive.
*
`vmx_template_path`
(string) - Path to a
[
configuration template
](
/docs/templates/configuration-templates.html
)
that
defines the contents of the virtual machine VMX file for VMware. This is
for
**advanced users only**
as this can render the virtual machine
non-functional. See below for more information. For basic VMX modifications,
try
`vmx_data`
first.
## Boot Command
The
`boot_command`
configuration is very important: it specifies the keys
...
...
@@ -240,3 +247,29 @@ an Ubuntu 12.04 installer:
"initrd=/install/initrd.gz --
<
enter
>
"
]
</pre>
## VMX Template
The heart of a VMware machine is the "vmx" file. This contains all the
virtual hardware metadata necessary for the VM to function. Packer by default
uses a
[
safe, flexible VMX file
](
https://github.com/mitchellh/packer/blob/20541a7eda085aa5cf35bfed5069592ca49d106e/builder/vmware/step_create_vmx.go#L84
)
.
But for advanced users, this template can be customized. This allows
Packer to build virtual machines of effectively any guest operating system
type.
<div
class=
"alert alert-block alert-warn"
>
<p>
<strong>
This is an advanced feature.
</strong>
Modifying the VMX template
can easily cause your virtual machine to not boot properly. Please only
modify the template if you know what you're doing.
</p>
</div>
Within the template, a handful of variables are available so that your
template can continue working with the rest of the Packer machinery. Using
these variables isn't required, however.
*
`Name`
- The name of the virtual machine.
*
`GuestOS`
- The VMware-valid guest OS type.
*
`DiskName`
- The filename (without the suffix) of the main virtual disk.
*
`ISOPath`
- The path to the ISO to use for the OS installation.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment