packer-config 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +36 -0
  3. data/.rubocop.yml +340 -0
  4. data/.travis.yml +6 -0
  5. data/Gemfile +17 -0
  6. data/LICENSE +176 -0
  7. data/README.md +107 -0
  8. data/Rakefile +47 -0
  9. data/TODO.md +8 -0
  10. data/lib/packer-config.rb +181 -0
  11. data/lib/packer/builder.rb +65 -0
  12. data/lib/packer/builders/all.rb +17 -0
  13. data/lib/packer/builders/amazon.rb +214 -0
  14. data/lib/packer/builders/docker.rb +47 -0
  15. data/lib/packer/builders/virtualbox.rb +169 -0
  16. data/lib/packer/dataobject.rb +128 -0
  17. data/lib/packer/envvar.rb +27 -0
  18. data/lib/packer/macro.rb +28 -0
  19. data/lib/packer/postprocessor.rb +77 -0
  20. data/lib/packer/postprocessors/all.rb +16 -0
  21. data/lib/packer/postprocessors/docker.rb +35 -0
  22. data/lib/packer/postprocessors/vagrant.rb +47 -0
  23. data/lib/packer/provisioner.rb +86 -0
  24. data/lib/packer/provisioners/all.rb +16 -0
  25. data/lib/packer/provisioners/file.rb +36 -0
  26. data/lib/packer/provisioners/shell.rb +60 -0
  27. data/packer-config.gemspec +46 -0
  28. data/spec/integration/README.md +14 -0
  29. data/spec/integration/builds/.gitignore +4 -0
  30. data/spec/integration/centos_vagrant_spec.rb +76 -0
  31. data/spec/integration/packer_cache/.gitignore +4 -0
  32. data/spec/integration/scripts/chef.sh +199 -0
  33. data/spec/integration/scripts/cleanup.sh +17 -0
  34. data/spec/integration/scripts/fix-slow-dns.sh +13 -0
  35. data/spec/integration/scripts/hello.sh +3 -0
  36. data/spec/integration/scripts/kickstart/centos-6.5-ks.cfg +71 -0
  37. data/spec/integration/scripts/minimize.sh +9 -0
  38. data/spec/integration/scripts/sshd.sh +6 -0
  39. data/spec/integration/scripts/vagrant.sh +10 -0
  40. data/spec/integration/scripts/vmtools.sh +39 -0
  41. data/spec/packer/builder_spec.rb +39 -0
  42. data/spec/packer/builders/amazon_spec.rb +88 -0
  43. data/spec/packer/builders/docker_spec.rb +25 -0
  44. data/spec/packer/builders/virtualbox_spec.rb +44 -0
  45. data/spec/packer/dataobject_spec.rb +239 -0
  46. data/spec/packer/envvar_spec.rb +38 -0
  47. data/spec/packer/macro_spec.rb +38 -0
  48. data/spec/packer/postprocessor_spec.rb +72 -0
  49. data/spec/packer/postprocessors/docker_import_spec.rb +27 -0
  50. data/spec/packer/postprocessors/docker_push_spec.rb +27 -0
  51. data/spec/packer/postprocessors/vagrant_spec.rb +27 -0
  52. data/spec/packer/provisioner_spec.rb +78 -0
  53. data/spec/packer/provisioners/file_spec.rb +63 -0
  54. data/spec/packer/provisioners/shell_spec.rb +116 -0
  55. data/spec/packer_config_spec.rb +197 -0
  56. data/spec/spec_helper.rb +19 -0
  57. data/spec/unit_helper.rb +15 -0
  58. metadata +220 -0
@@ -0,0 +1,4 @@
1
+ # Ignore everything in this directory
2
+ *
3
+ # Except this file
4
+ !.gitignore
@@ -0,0 +1,199 @@
1
+ #!/bin/sh
2
+ # WARNING: REQUIRES /bin/sh
3
+ #
4
+ # - must run on /bin/sh on solaris 9
5
+ # - must run on /bin/sh on AIX 6.x
6
+ # - if you think you are a bash wizard, you probably do not understand
7
+ # this programming language. do not touch.
8
+ # - if you are under 40, get peer review from your elders.
9
+ #
10
+ # Author:: Julian C. Dunn (<jdunn@getchef.com>)
11
+ # Cribbed Code From:: Lamont Granquist, Seth Chisamore, Stephen Delano & Tyler Cloke
12
+ # Copyright:: Copyright (c) 2013, Chef Software, Inc.
13
+ # License:: Apache License, Version 2.0
14
+ #
15
+ # Licensed under the Apache License, Version 2.0 (the "License");
16
+ # you may not use this file except in compliance with the License.
17
+ # You may obtain a copy of the License at
18
+ #
19
+ # http://www.apache.org/licenses/LICENSE-2.0
20
+ #
21
+ # Unless required by applicable law or agreed to in writing, software
22
+ # distributed under the License is distributed on an "AS IS" BASIS,
23
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
24
+ # See the License for the specific language governing permissions and
25
+ # limitations under the License.
26
+ #
27
+
28
+ # Set $CHEF_VERSION inside Packer's template. Valid options are:
29
+ # 'provisionerless' -- build a box without Chef
30
+ # 'x.y.z' -- build a box with version x.y.z of Chef
31
+ # 'latest' -- build a box with the latest version of Chef
32
+ # 'prerelease' -- build a box with a prerelease version of Chef
33
+
34
+ chef_installer="/tmp/install-chef.sh"
35
+ chef_installer_url="https://www.getchef.com/chef/install.sh"
36
+
37
+ # Check whether a command exists - returns 0 if it does, 1 if it does not
38
+ exists() {
39
+ if command -v $1 >/dev/null 2>&1
40
+ then
41
+ return 0
42
+ else
43
+ return 1
44
+ fi
45
+ }
46
+
47
+ unable_to_retrieve_package() {
48
+ echo "Unable to retrieve install.sh!"
49
+ if test "x$stderr_results" != "x"; then
50
+ echo "\nDEBUG OUTPUT FOLLOWS:\n$stderr_results"
51
+ fi
52
+ exit 1
53
+ }
54
+
55
+ capture_tmp_stderr() {
56
+ # spool up /tmp/stderr from all the commands we called
57
+ if test -f "/tmp/stderr"; then
58
+ output=`cat /tmp/stderr`
59
+ stderr_results="${stderr_results}\nSTDERR from $1:\n\n$output\n"
60
+ rm /tmp/stderr
61
+ fi
62
+ }
63
+
64
+ # do_wget URL FILENAME
65
+ do_wget() {
66
+ echo "trying wget..."
67
+ wget -O "$2" "$1" 2>/tmp/stderr
68
+ rc=$?
69
+ # check for 404
70
+ grep "ERROR 404" /tmp/stderr 2>&1 >/dev/null
71
+ if test $? -eq 0; then
72
+ echo "ERROR 404"
73
+ unable_to_retrieve_package
74
+ fi
75
+
76
+ # check for bad return status or empty output
77
+ if test $rc -ne 0 || test ! -s "$2"; then
78
+ capture_tmp_stderr "wget"
79
+ return 1
80
+ fi
81
+
82
+ return 0
83
+ }
84
+
85
+ # do_curl URL FILENAME
86
+ do_curl() {
87
+ echo "trying curl..."
88
+ curl -sL -D /tmp/stderr "$1" > "$2"
89
+ rc=$?
90
+ # check for 404
91
+ grep "404 Not Found" /tmp/stderr 2>&1 >/dev/null
92
+ if test $? -eq 0; then
93
+ echo "ERROR 404"
94
+ unable_to_retrieve_package
95
+ fi
96
+
97
+ # check for bad return status or empty output
98
+ if test $rc -ne 0 || test ! -s "$2"; then
99
+ capture_tmp_stderr "curl"
100
+ return 1
101
+ fi
102
+
103
+ return 0
104
+ }
105
+
106
+ # do_fetch URL FILENAME
107
+ do_fetch() {
108
+ echo "trying fetch..."
109
+ fetch -o "$2" "$1" 2>/tmp/stderr
110
+ # check for bad return status
111
+ test $? -ne 0 && return 1
112
+ return 0
113
+ }
114
+
115
+ # do_curl URL FILENAME
116
+ do_perl() {
117
+ echo "trying perl..."
118
+ perl -e 'use LWP::Simple; getprint($ARGV[0]);' "$1" > "$2" 2>/tmp/stderr
119
+ rc=$?
120
+ # check for 404
121
+ grep "404 Not Found" /tmp/stderr 2>&1 >/dev/null
122
+ if test $? -eq 0; then
123
+ echo "ERROR 404"
124
+ unable_to_retrieve_package
125
+ fi
126
+
127
+ # check for bad return status or empty output
128
+ if test $rc -ne 0 || test ! -s "$2"; then
129
+ capture_tmp_stderr "perl"
130
+ return 1
131
+ fi
132
+
133
+ return 0
134
+ }
135
+
136
+ # do_curl URL FILENAME
137
+ do_python() {
138
+ echo "trying python..."
139
+ python -c "import sys,urllib2 ; sys.stdout.write(urllib2.urlopen(sys.argv[1]).read())" "$1" > "$2" 2>/tmp/stderr
140
+ rc=$?
141
+ # check for 404
142
+ grep "HTTP Error 404" /tmp/stderr 2>&1 >/dev/null
143
+ if test $? -eq 0; then
144
+ echo "ERROR 404"
145
+ unable_to_retrieve_package
146
+ fi
147
+
148
+ # check for bad return status or empty output
149
+ if test $rc -ne 0 || test ! -s "$2"; then
150
+ capture_tmp_stderr "python"
151
+ return 1
152
+ fi
153
+ return 0
154
+ }
155
+
156
+ do_download() {
157
+ echo "downloading $1"
158
+ echo " to file $2"
159
+
160
+ # we try all of these until we get success.
161
+ # perl, in particular may be present but LWP::Simple may not be installed
162
+
163
+ if exists wget; then
164
+ do_wget $1 $2 && return 0
165
+ fi
166
+
167
+ if exists curl; then
168
+ do_curl $1 $2 && return 0
169
+ fi
170
+
171
+ if exists fetch; then
172
+ do_fetch $1 $2 && return 0
173
+ fi
174
+
175
+ if exists perl; then
176
+ do_perl $1 $2 && return 0
177
+ fi
178
+
179
+ if exists python; then
180
+ do_python $1 $2 && return 0
181
+ fi
182
+
183
+ unable_to_retrieve_package
184
+ }
185
+
186
+ if [ x$CHEF_VERSION != x'provisionerless' ]; then
187
+ do_download "$chef_installer_url" "$chef_installer"
188
+ chmod +x $chef_installer
189
+ if [ x$CHEF_VERSION == x'latest' ]; then
190
+ $chef_installer
191
+ elif [ x$CHEF_VERSION == x'prerelease' ]; then
192
+ $chef_installer -p
193
+ else
194
+ $chef_installer -v $CHEF_VERSION
195
+ fi
196
+ rm -f $chef_installer
197
+ else
198
+ echo "Building a box without Chef"
199
+ fi
@@ -0,0 +1,17 @@
1
+ #!/bin/bash -eux
2
+
3
+ # From: https://github.com/opscode/bento
4
+
5
+ # These were only needed for building VMware/Virtualbox extensions:
6
+ # yum -y remove gcc cpp kernel-devel kernel-headers perl
7
+ yum -y clean all
8
+ rm -rf VBoxGuestAdditions_*.iso VBoxGuestAdditions_*.iso.?
9
+ rm -f /tmp/chef*rpm
10
+
11
+ # clean up redhat interface persistence
12
+ rm -f /etc/udev/rules.d/70-persistent-net.rules
13
+ if [ -r /etc/sysconfig/network-scripts/ifcfg-eth0 ]; then
14
+ sed -i 's/^HWADDR.*$//' /etc/sysconfig/network-scripts/ifcfg-eth0
15
+ sed -i 's/^UUID.*$//' /etc/sysconfig/network-scripts/ifcfg-eth0
16
+ fi
17
+
@@ -0,0 +1,13 @@
1
+ #!/bin/bash -eux
2
+
3
+ # From: https://github.com/opscode/bento
4
+
5
+ if [[ "$PACKER_BUILDER_TYPE" == virtualbox* ]]; then
6
+ ## https://access.redhat.com/site/solutions/58625 (subscription required)
7
+ # add 'single-request-reopen' so it is included when /etc/resolv.conf is generated
8
+ echo 'RES_OPTIONS="single-request-reopen"' >> /etc/sysconfig/network
9
+ service network restart
10
+ echo 'Slow DNS fix applied (single-request-reopen)'
11
+ else
12
+ echo 'Slow DNS fix not required for this platform, skipping'
13
+ fi
@@ -0,0 +1,3 @@
1
+ #!/bin/bash -eux
2
+
3
+ echo 'Hello, world!'
@@ -0,0 +1,71 @@
1
+ install
2
+ cdrom
3
+ lang en_US.UTF-8
4
+ keyboard us
5
+ network --bootproto=dhcp
6
+ rootpw vagrant
7
+ firewall --disabled
8
+ selinux --permissive
9
+ timezone UTC
10
+ unsupported_hardware
11
+ bootloader --location=mbr
12
+ text
13
+ skipx
14
+ zerombr
15
+ clearpart --all --initlabel
16
+ autopart
17
+ auth --enableshadow --passalgo=sha512 --kickstart
18
+ firstboot --disabled
19
+ reboot
20
+ user --name=vagrant --plaintext --password vagrant
21
+
22
+ %packages --nobase --ignoremissing --excludedocs
23
+ # vagrant needs this to copy initial files via scp
24
+ openssh-clients
25
+ sudo
26
+ kernel-headers
27
+ kernel-devel
28
+ gcc
29
+ make
30
+ perl
31
+ curl
32
+ wget
33
+ nfs-utils
34
+ man
35
+ -fprintd-pam
36
+ -intltool
37
+
38
+ # unnecessary firmware
39
+ -aic94xx-firmware
40
+ -atmel-firmware
41
+ -b43-openfwwf
42
+ -bfa-firmware
43
+ -ipw2100-firmware
44
+ -ipw2200-firmware
45
+ -ivtv-firmware
46
+ -iwl100-firmware
47
+ -iwl1000-firmware
48
+ -iwl3945-firmware
49
+ -iwl4965-firmware
50
+ -iwl5000-firmware
51
+ -iwl5150-firmware
52
+ -iwl6000-firmware
53
+ -iwl6000g2a-firmware
54
+ -iwl6050-firmware
55
+ -libertas-usb8388-firmware
56
+ -ql2100-firmware
57
+ -ql2200-firmware
58
+ -ql23xx-firmware
59
+ -ql2400-firmware
60
+ -ql2500-firmware
61
+ -rt61pci-firmware
62
+ -rt73usb-firmware
63
+ -xorg-x11-drv-ati-firmware
64
+ -zd1211-firmware
65
+
66
+ %post
67
+ # update root certs
68
+ wget -O/etc/pki/tls/certs/ca-bundle.crt http://curl.haxx.se/ca/cacert.pem
69
+ # sudo
70
+ echo "%vagrant ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/vagrant
71
+ sed -i "s/^.*requiretty/#Defaults requiretty/" /etc/sudoers
@@ -0,0 +1,9 @@
1
+ #!/bin/bash -eux
2
+
3
+ # From: https://github.com/opscode/bento
4
+
5
+ dd if=/dev/zero of=/EMPTY bs=1M
6
+ rm -f /EMPTY
7
+ # Block until the empty file has been removed, otherwise, Packer
8
+ # will try to kill the box while the disk is still full and that's bad
9
+ sync
@@ -0,0 +1,6 @@
1
+ #!/bin/bash -eux
2
+
3
+ # From: https://github.com/opscode/bento
4
+
5
+ echo "UseDNS no" >> /etc/ssh/sshd_config
6
+ echo "GSSAPIAuthentication no" >> /etc/ssh/sshd_config
@@ -0,0 +1,10 @@
1
+ #!/bin/bash -eux
2
+
3
+ # From: https://github.com/opscode/bento
4
+
5
+ mkdir /home/vagrant/.ssh
6
+ wget --no-check-certificate \
7
+ 'https://raw.githubusercontent.com/mitchellh/vagrant/master/keys/vagrant.pub' \
8
+ -O /home/vagrant/.ssh/authorized_keys
9
+ chown -R vagrant /home/vagrant/.ssh
10
+ chmod -R go-rwsx /home/vagrant/.ssh
@@ -0,0 +1,39 @@
1
+ #!/bin/bash -eux
2
+
3
+ # From: https://github.com/opscode/bento
4
+
5
+ case "$PACKER_BUILDER_TYPE" in
6
+
7
+ virtualbox-iso|virtualbox-ovf)
8
+ mkdir /tmp/vbox
9
+ VER=$(cat /home/vagrant/.vbox_version)
10
+ if [ ! -f "/home/vagrant/VBoxGuestAdditions_$VER.iso" ]; then
11
+ wget "http://download.virtualbox.org/virtualbox/4.3.8/VBoxGuestAdditions_$VER.iso" --output-file="/home/vagrant/VBoxGuestAdditions_$VER.iso"
12
+ fi
13
+ mount -o loop /home/vagrant/VBoxGuestAdditions_$VER.iso /tmp/vbox
14
+ sh /tmp/vbox/VBoxLinuxAdditions.run
15
+ umount /tmp/vbox
16
+ rmdir /tmp/vbox
17
+ rm /home/vagrant/*.iso
18
+ chkconfig --add /etc/init.d/vboxadd
19
+ chkconfig --level 345 vboxadd on
20
+ ;;
21
+
22
+ vmware-iso|vmware-ovf)
23
+ mkdir /tmp/vmfusion
24
+ mkdir /tmp/vmfusion-archive
25
+ mount -o loop /home/vagrant/linux.iso /tmp/vmfusion
26
+ tar xzf /tmp/vmfusion/VMwareTools-*.tar.gz -C /tmp/vmfusion-archive
27
+ /tmp/vmfusion-archive/vmware-tools-distrib/vmware-install.pl --default
28
+ umount /tmp/vmfusion
29
+ rm -rf /tmp/vmfusion
30
+ rm -rf /tmp/vmfusion-archive
31
+ rm /home/vagrant/*.iso
32
+ ;;
33
+
34
+ *)
35
+ echo "Unknown Packer Builder Type >>$PACKER_BUILDER_TYPE<< selected."
36
+ echo "Known are virtualbox-iso|virtualbox-ovf|vmware-iso|vmware-ovf."
37
+ ;;
38
+
39
+ esac
@@ -0,0 +1,39 @@
1
+ # Encoding: utf-8
2
+ # Copyright 2014 Ian Chesal
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ require 'spec_helper'
16
+
17
+ RSpec.describe Packer::Builder do
18
+ VALID_BUILDER_TYPE = Packer::Builder::VIRTUALBOX_ISO
19
+
20
+ let(:builder) { Packer::Builder.new }
21
+
22
+ describe '.get_builder' do
23
+ it 'returns a builder' do
24
+ expect(Packer::Builder.get_builder(VALID_BUILDER_TYPE)).to be_a_kind_of(Packer::Builder)
25
+ end
26
+
27
+ it 'raises an error when the builder type is not recognized' do
28
+ expect { Packer::Builder.get_builder('unknown-type') }.to raise_error
29
+ end
30
+ end
31
+
32
+ describe '#name' do
33
+ it 'lets you set a custom name on the builder instance' do
34
+ builder.name('fancy name')
35
+ expect(builder.data['name']).to eq('fancy name')
36
+ builder.data.delete('name')
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,88 @@
1
+ # Encoding: utf-8
2
+ # Copyright 2014 Ian Chesal
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ require 'spec_helper'
16
+
17
+ RSpec.describe Packer::Builder::Amazon do
18
+ let(:builder) { Packer::Builder::Amazon.new }
19
+ let(:block_device_mappings) do
20
+ [{
21
+ "device_name" => "/dev/sdb",
22
+ "virtual_name" => "ephemeral0"
23
+ },
24
+ {
25
+ "device_name" => "/dev/sdc",
26
+ "virtual_name" => "ephemeral1"
27
+ }]
28
+ end
29
+
30
+ let(:tags) do
31
+ {
32
+ "a" => '1',
33
+ "b" => '2'
34
+ }
35
+ end
36
+
37
+ describe '#ami_block_device_mappings' do
38
+ it 'adds a block device mappings data structure' do
39
+ builder.ami_block_device_mappings(block_device_mappings)
40
+ expect(builder.data['ami_block_device_mappings']).to eq(block_device_mappings)
41
+ builder.data.delete('ami_block_device_mappings')
42
+ end
43
+ end
44
+
45
+ describe '#launch_block_device_mappings' do
46
+ it 'adds a block device mappings data structure' do
47
+ builder.launch_block_device_mappings(block_device_mappings)
48
+ expect(builder.data['launch_block_device_mappings']).to eq(block_device_mappings)
49
+ builder.data.delete('launch_block_device_mappings')
50
+ end
51
+ end
52
+
53
+ describe '#tags' do
54
+ it 'adds a hash of strings to the key' do
55
+ builder.tags(tags)
56
+ expect(builder.data['tags']).to eq(tags)
57
+ builder.data.delete('tags')
58
+ end
59
+ end
60
+
61
+ describe '#run_tags' do
62
+ it 'adds a hash of strings to the key' do
63
+ builder.run_tags(tags)
64
+ expect(builder.data['run_tags']).to eq(tags)
65
+ builder.data.delete('run_tags')
66
+ end
67
+ end
68
+ end
69
+
70
+ RSpec.describe Packer::Builder::Amazon::EBS do
71
+ let(:builder) { Packer::Builder.get_builder(Packer::Builder::AMAZON_EBS) }
72
+
73
+ describe '#initialize' do
74
+ it 'has a type of amazon-ebs' do
75
+ expect(builder.data['type']).to eq(Packer::Builder::AMAZON_EBS)
76
+ end
77
+ end
78
+ end
79
+
80
+ RSpec.describe Packer::Builder::Amazon::Instance do
81
+ let(:builder) { Packer::Builder.get_builder(Packer::Builder::AMAZON_INSTANCE) }
82
+
83
+ describe '#initialize' do
84
+ it 'has a type of amazon-instance' do
85
+ expect(builder.data['type']).to eq(Packer::Builder::AMAZON_INSTANCE)
86
+ end
87
+ end
88
+ end