toft 0.0.3 → 0.0.4

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 (39) hide show
  1. data/Gemfile.lock +6 -1
  2. data/Rakefile +93 -4
  3. data/features/checker.feature +2 -2
  4. data/features/chef.feature +23 -5
  5. data/features/command.feature +4 -3
  6. data/features/node.feature +21 -6
  7. data/features/step_definitions/chef.rb +11 -3
  8. data/features/step_definitions/command.rb +1 -3
  9. data/features/step_definitions/node.rb +19 -3
  10. data/features/support/env.rb +6 -3
  11. data/fixtures/chef/attributes.json +9 -0
  12. data/lib/toft/chef/chef_attributes.rb +2 -2
  13. data/lib/toft/chef/chef_runner.rb +17 -4
  14. data/lib/toft/node.rb +64 -20
  15. data/lib/toft/node_controller.rb +2 -2
  16. data/lib/toft/version.rb +1 -1
  17. data/lib/toft.rb +5 -2
  18. data/scripts/bin/centos/lxc-prepare-host +175 -0
  19. data/scripts/{ubuntu/bin → bin/share}/install-chef-ubuntu.sh +0 -0
  20. data/scripts/{ubuntu/bin → bin/share}/install-rvm.sh +0 -0
  21. data/scripts/{ubuntu/bin → bin/share}/lxc-create-centos-image +6 -5
  22. data/scripts/{ubuntu/bin → bin/ubuntu}/lxc-create-ubuntu-image +3 -3
  23. data/scripts/bin/ubuntu/lxc-prepare-host +190 -0
  24. data/scripts/cookbooks/lxc/recipes/default.rb +8 -14
  25. data/scripts/{ubuntu/lxc-templates → cookbooks/lxc/templates/default}/lxc-centos-6 +7 -3
  26. data/scripts/cookbooks/lxc/templates/default/{lxc-lucid-chef → lxc-lucid} +2 -2
  27. data/scripts/cookbooks/lxc/templates/default/{lxc-natty-chef → lxc-natty} +2 -2
  28. data/scripts/lxc-templates/files/rc.local +38 -0
  29. data/scripts/lxc-templates/lxc-centos-6 +279 -0
  30. data/scripts/{ubuntu/lxc-templates → lxc-templates}/lxc-lucid +3 -12
  31. data/scripts/{ubuntu/lxc-templates → lxc-templates}/lxc-natty +51 -61
  32. data/spec/fixtures/illegal_syntax.json +1 -0
  33. data/spec/spec_helper.rb +3 -1
  34. data/spec/tuft/chef_attributes_spec.rb +6 -0
  35. data/spec/tuft/chef_runner_spec.rb +34 -0
  36. metadata +55 -21
  37. data/scripts/centos/bin/lxc-prepare-host +0 -39
  38. data/scripts/cookbooks/lxc/files/default/lxc-create-ubuntu-image +0 -75
  39. data/scripts/ubuntu/bin/lxc-prepare-host +0 -24
@@ -0,0 +1,175 @@
1
+ #!/bin/bash
2
+
3
+ username=`id -nu`
4
+ if [ ! "$username" = "root" ]; then
5
+ echo "This command has to be run as root!"
6
+ exit 1
7
+ fi
8
+
9
+ gateway_ip="192.168.20.1"
10
+ subnet="192.168.20.0"
11
+ netmask="255.255.255.0"
12
+ range="192.168.20.2 192.168.20.254"
13
+ domain=foo
14
+
15
+
16
+ # intsall lxc
17
+ if [[ ! -f /usr/bin/lxc-ls ]]; then
18
+ (cd /tmp && \
19
+ wget http://lxc.sourceforge.net/download/lxc/lxc-0.7.4.tar.gz && \
20
+ tar zxf lxc-0.7.4.tar.gz && \
21
+ cd lxc-0.7.4 && \
22
+ ./configure --prefix=/usr && \
23
+ make && \
24
+ make install)
25
+ fi
26
+
27
+ # setup bridge interface
28
+ if [[ ! `ip link ls dev br0` ]]; then
29
+ brctl addbr br0
30
+ ifconfig br0 $gateway_ip netmask $netmask up
31
+ sysctl -w net.ipv4.ip_forward=1
32
+ fi
33
+
34
+ cat <<EOF > /etc/sysconfig/network-scripts/ifcfg-br0
35
+ DEVICE=br0
36
+ ONBOOT=yes
37
+ BOOTPROTO=static
38
+ DELAY=0
39
+ TYPE=Bridge
40
+ IPADDR=$gateway_ip
41
+ NETWORK=$subnet
42
+ NETMASK=$netmask
43
+ GATEWAY=$gateway_ip
44
+ MTU=1500
45
+ IPV6INIT=no
46
+ USERCTL=no
47
+ EOF
48
+
49
+ # reset iptables
50
+ cat <<EOF > /etc/sysconfig/iptables
51
+ *nat
52
+ :PREROUTING ACCEPT [0:0]
53
+ :POSTROUTING ACCEPT [28:2070]
54
+ :OUTPUT ACCEPT [106:10068]
55
+ -A POSTROUTING -o eth0 -j MASQUERADE
56
+ COMMIT
57
+ EOF
58
+
59
+ service iptables restart
60
+
61
+ # mount cgroup
62
+ if [[ ! -d /cgroup ]]; then
63
+ mkdir -p /cgroup
64
+ fi
65
+
66
+ if [[ ! `mount | grep cgroup` ]]; then
67
+ mount none -t cgroup /cgroup
68
+ fi
69
+
70
+ if [[ ! `grep "/cgroup" /etc/fstab` ]]; then
71
+ cat <<EOF >> /etc/fstab
72
+ none /cgroup cgroup defaults 0 0
73
+ EOF
74
+ fi
75
+
76
+ # setup nameserver
77
+ cat <<EOF > /var/named/named.foo
78
+ \$ORIGIN $domain.
79
+ \$TTL 7200 ; 2 hours
80
+ @ IN SOA ns1.$domain. hostmaster.$domain. (
81
+ 3641625943 ; serial
82
+ 36000 ; refresh (10 hours)
83
+ 900 ; retry (15 minutes)
84
+ 36000 ; expire (10 hours)
85
+ 7200 ; minimum (2 hours)
86
+ )
87
+ NS ns1.$domain.
88
+ ns1 A $gateway_ip
89
+ EOF
90
+
91
+ ## set bind to forward original nameservers
92
+ original_nameservers=`grep nameserver /etc/resolv.conf | cut -d " " -f2 | sed s/$gateway_ip//`
93
+ bind_forward_options=''
94
+ if [[ -n `echo $original_nameservers | tr -d ' \n\t\r'` ]]; then
95
+ bind_forward_options="forwarders {
96
+ `echo $original_nameservers | xargs -n 1 | awk '{ print $1";" }'`
97
+ };
98
+ forward first;"
99
+ fi
100
+
101
+ mv /etc/named.conf /etc/named.conf.old
102
+ cat <<EOF > /etc/named.conf
103
+ options {
104
+ directory "/var/named";
105
+ dump-file "/var/named/data/cache_dump.db";
106
+ statistics-file "/var/named/data/named_stats.txt";
107
+ memstatistics-file "/var/named/data/named_mem_stats.txt";
108
+ $bind_forward_options
109
+ };
110
+
111
+ logging {
112
+ channel default_debug {
113
+ file "data/named.run";
114
+ severity dynamic;
115
+ };
116
+ };
117
+
118
+ zone "." IN {
119
+ type hint;
120
+ file "named.ca";
121
+ };
122
+
123
+ include "/etc/named.rfc1912.zones";
124
+
125
+ zone "$domain" in {
126
+ type master;
127
+ file "named.foo";
128
+ allow-update {any;};
129
+ };
130
+ EOF
131
+
132
+ # disable selinux to make it happy for bind to creating jnl file
133
+ echo 0 >/selinux/enforce
134
+
135
+ # fix the dir owner to grant bind to generate jnl
136
+ chown named:named /var/named
137
+
138
+ service named restart
139
+
140
+ # add our nameserver into /etc/resolv.conf
141
+ if [[ ! `grep "nameserver $gateway_ip" /etc/resolv.conf` ]]; then
142
+ cp /etc/resolv.conf /etc/resolv.conf.old
143
+ cat <<EOF > /etc/resolv.conf
144
+ nameserver $gateway_ip
145
+ `cat /etc/resolv.conf`
146
+ EOF
147
+ fi
148
+
149
+ # setup dhcp3 server
150
+ cat <<EOF > /etc/dhcp/dhcpd.conf
151
+ ddns-updates on;
152
+ ddns-update-style interim;
153
+
154
+ ddns-domainname "$domain.";
155
+ option domain-name "$domain.";
156
+ option domain-name-servers $gateway_ip;
157
+
158
+ option ntp-servers $gateway_ip;
159
+ default-lease-time 600;
160
+ max-lease-time 7200;
161
+
162
+ authoritative;
163
+ log-facility local7;
164
+
165
+ zone $domain. {
166
+ primary localhost;
167
+ }
168
+
169
+ subnet $subnet netmask $netmask {
170
+ range $range;
171
+ option routers $gateway_ip;
172
+ }
173
+ EOF
174
+ service dhcpd restart
175
+
File without changes
@@ -11,10 +11,14 @@ if [ ! "$username" = "root" ]; then
11
11
  exit 1
12
12
  fi
13
13
 
14
- cache="/var/cache/lxc/centos"
14
+ cache="/var/cache/lxc"
15
15
  suite=$1
16
16
 
17
17
  arch=$(arch)
18
+ if [ "$arch" == "x86_64" ]; then
19
+ arch=amd64
20
+ fi
21
+
18
22
  if [ "$arch" == "i686" ]; then
19
23
  arch=i386
20
24
  fi
@@ -34,13 +38,10 @@ if [[ ! `type rinse` ]]; then
34
38
  make install)
35
39
  fi
36
40
 
37
- # install rpm
38
- apt-get install -y rpm
39
-
40
41
  # create centos image using rinse
41
42
  cat <<EOF > /tmp/after_post_install
42
43
  chroot $cache/$suite-$arch rpm -Uvh http://rbel.co/rbel6
43
- chroot $cache/$suite-$arch yum -y install man sudo openssh-server openssh-clients rubygem-chef
44
+ chroot $cache/$suite-$arch yum -y install tar man sudo bind-utils openssh-server openssh-clients rubygem-chef
44
45
  EOF
45
46
  chmod +x /tmp/after_post_install
46
47
 
@@ -11,7 +11,7 @@ if [ ! "$username" = "root" ]; then
11
11
  exit 1
12
12
  fi
13
13
 
14
- cache="/var/cache/lxc/ubuntu"
14
+ cache="/var/cache/lxc"
15
15
  suite=$1
16
16
 
17
17
  arch=$(arch)
@@ -28,8 +28,8 @@ if [ -e "$cache/$suite-$arch.tar.gz" ]; then
28
28
  exit 0
29
29
  fi
30
30
 
31
- lucid_packages=dialog,apt,apt-utils,resolvconf,iproute,inetutils-ping,dhcp3-client,ssh,lsb-release,wget,gpgv,gnupg,sudo,ruby,rubygems1.8,ruby-dev,libopenssl-ruby,build-essential,ssl-cert
32
- natty_packages=dialog,apt,apt-utils,resolvconf,iproute,inetutils-ping,isc-dhcp-client,isc-dhcp-common,ssh,lsb-release,gnupg,netbase,lxcguest,sudo,ruby,rubygems1.8,ruby-dev,libruby,build-essential,wget,ssl-cert
31
+ lucid_packages=dialog,apt,apt-utils,resolvconf,iproute,inetutils-ping,dnsutils,dhcp3-client,ssh,lsb-release,wget,gpgv,gnupg,sudo,ruby,rubygems1.8,ruby-dev,libopenssl-ruby,build-essential,ssl-cert
32
+ natty_packages=dialog,apt,apt-utils,resolvconf,iproute,inetutils-ping,dnsutils,isc-dhcp-client,isc-dhcp-common,ssh,lsb-release,gnupg,netbase,lxcguest,sudo,ruby,rubygems1.8,ruby-dev,libruby,build-essential,wget,ssl-cert
33
33
  # check the mini ubuntu was not already downloaded
34
34
  rm -rf "$cache/$suite-$arch"
35
35
  mkdir -p "$cache/$suite-$arch"
@@ -0,0 +1,190 @@
1
+ #!/bin/bash
2
+
3
+ username=`id -nu`
4
+ if [ ! "$username" = "root" ]; then
5
+ echo "This command has to be run as root!"
6
+ exit 1
7
+ fi
8
+
9
+ OS=`cat /etc/issue | cut -f 1 -d " " -s`
10
+
11
+
12
+ gateway_ip="192.168.20.1"
13
+ subnet="192.168.20.0"
14
+ netmask="255.255.255.0"
15
+ range="192.168.20.2 192.168.20.254"
16
+ domain=foo
17
+
18
+ # setup bridge and nat
19
+ if [[ ! `ip link ls dev br0` ]]; then
20
+ brctl addbr br0
21
+ ifconfig br0 $gateway_ip netmask $netmask up
22
+ iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
23
+ sysctl -w net.ipv4.ip_forward=1
24
+ fi
25
+
26
+ if [[ ! `grep "auto br0" /etc/network/interfaces` ]]; then
27
+ cat <<EOF >> /etc/network/interfaces
28
+ auto br0
29
+ iface br0 inet static
30
+ address $gateway_ip
31
+ netmask $netmask
32
+ bridge_stp off
33
+ bridge_maxwait 5
34
+ pre-up brctl addbr br0
35
+ post-up /usr/sbin/brctl setfd br0 0
36
+ EOF
37
+ fi
38
+
39
+ iptables-save > /etc/firewall.conf
40
+ echo "#!/bin/sh" > /etc/network/if-up.d/iptables
41
+ echo "iptables-restore < /etc/firewall.conf" >> /etc/network/if-up.d/iptables
42
+ chmod +x /etc/network/if-up.d/iptables
43
+
44
+ # setup cgroup
45
+ if [[ ! -d /cgroup ]]; then
46
+ mkdir -p /cgroup
47
+ fi
48
+
49
+ if [[ ! `mount | grep cgroup` ]]; then
50
+ mount none -t cgroup /cgroup
51
+ fi
52
+
53
+ if [[ ! `grep "/cgroup" /etc/fstab` ]]; then
54
+ cat <<EOF >> /etc/fstab
55
+ none /cgroup cgroup defaults 0 0
56
+ EOF
57
+ fi
58
+
59
+ # setup nameserver
60
+ cat <<EOF > /etc/bind/db.foo
61
+ \$ORIGIN $domain.
62
+ \$TTL 7200 ; 2 hours
63
+ @ IN SOA ns1.$domain. hostmaster.$domain. (
64
+ 3641625943 ; serial
65
+ 36000 ; refresh (10 hours)
66
+ 900 ; retry (15 minutes)
67
+ 36000 ; expire (10 hours)
68
+ 7200 ; minimum (2 hours)
69
+ )
70
+ NS ns1.$domain.
71
+ ns1 A $gateway_ip
72
+ EOF
73
+
74
+ cat <<EOF > /etc/bind/named.conf.$domain
75
+ zone "$domain" in{
76
+ type master;
77
+ file "/etc/bind/db.$domain";
78
+ allow-update {any;};
79
+ };
80
+ EOF
81
+
82
+ ## set bind to forward original nameservers
83
+ original_nameservers=`grep nameserver /etc/resolv.conf | cut -d " " -f2 | sed s/$gateway_ip//`
84
+ bind_forward_options=''
85
+ if [[ -n `echo $original_nameservers | tr -d ' \n\t\r'` ]]; then
86
+ bind_forward_options="forwarders {
87
+ `echo $original_nameservers | xargs -n 1 | awk '{ print $1";" }'`
88
+ };
89
+ forward first;"
90
+ fi
91
+
92
+ cat <<EOF > /etc/bind/named.conf.options.foo
93
+ options {
94
+ directory "/var/cache/bind";
95
+ $bind_forward_options
96
+ auth-nxdomain no; # conform to RFC1035
97
+ listen-on-v6 { any; };
98
+ };
99
+ EOF
100
+
101
+ # debian bind9 package does not have this default-zones file
102
+ # add this file to make it consistent between debian and ubuntu
103
+ cat <<EOF > /etc/bind/named.conf.default-zones
104
+ // prime the server with knowledge of the root servers
105
+ zone "." {
106
+ type hint;
107
+ file "/etc/bind/db.root";
108
+ };
109
+
110
+ // be authoritative for the localhost forward and reverse zones, and for
111
+ // broadcast zones as per RFC 1912
112
+
113
+ zone "localhost" {
114
+ type master;
115
+ file "/etc/bind/db.local";
116
+ };
117
+
118
+ zone "127.in-addr.arpa" {
119
+ type master;
120
+ file "/etc/bind/db.127";
121
+ };
122
+
123
+ zone "0.in-addr.arpa" {
124
+ type master;
125
+ file "/etc/bind/db.0";
126
+ };
127
+
128
+ zone "255.in-addr.arpa" {
129
+ type master;
130
+ file "/etc/bind/db.255";
131
+ };
132
+ EOF
133
+
134
+ mv /etc/bind/named.conf /etc/bind/named.conf.old
135
+ cat <<EOF > /etc/bind/named.conf
136
+ include "/etc/bind/named.conf.options.foo";
137
+ include "/etc/bind/named.conf.local";
138
+ include "/etc/bind/named.conf.default-zones";
139
+ include "/etc/bind/named.conf.$domain";
140
+ EOF
141
+
142
+ sudo chmod 775 /etc/bind
143
+
144
+ /etc/init.d/bind9 restart
145
+
146
+ # add our nameserver into /etc/resolv.conf
147
+ if [[ ! `grep "nameserver $gateway_ip" /etc/resolv.conf` ]]; then
148
+ cp /etc/resolv.conf /etc/resolv.conf.old
149
+ cat <<EOF > /etc/resolv.conf
150
+ nameserver $gateway_ip
151
+ `cat /etc/resolv.conf`
152
+ EOF
153
+ fi
154
+
155
+ # setup dhcp server
156
+ if [[ $OS = "Ubuntu" ]]; then
157
+ dhcp_conf_dir=dhcp
158
+ dhcp_daemon=isc-dhcp-server
159
+ else
160
+ dhcp_conf_dir=dhcp3
161
+ dhcp_daemon=dhcp3-server
162
+ fi
163
+
164
+ mv /etc/$dhcp_conf_dir/dhcpd.conf /etc/$dhcp_conf_dir/dhcpd.conf.old
165
+ cat <<EOF > /etc/$dhcp_conf_dir/dhcpd.conf
166
+ ddns-updates on;
167
+ ddns-update-style interim;
168
+
169
+ ddns-domainname "$domain.";
170
+ option domain-name "$domain.";
171
+ option domain-name-servers $gateway_ip;
172
+
173
+ option ntp-servers $gateway_ip;
174
+ default-lease-time 600;
175
+ max-lease-time 7200;
176
+
177
+ authoritative;
178
+ log-facility local7;
179
+
180
+ zone $domain. {
181
+ primary localhost;
182
+ }
183
+
184
+ subnet $subnet netmask $netmask {
185
+ range $range;
186
+ option routers $gateway_ip;
187
+ }
188
+ EOF
189
+ sudo /etc/init.d/$dhcp_daemon restart
190
+
@@ -23,26 +23,20 @@ mount "/cgroup" do
23
23
  action [:mount, :enable]
24
24
  end
25
25
 
26
- template "/usr/lib/lxc/templates/lxc-lucid-chef" do
27
- source "lxc-lucid-chef"
26
+ template "/usr/lib/lxc/templates/lxc-lucid" do
27
+ source "lxc-lucid"
28
28
  mode "0755"
29
29
  action :create
30
30
  end
31
31
 
32
- template "/usr/lib/lxc/templates/lxc-natty-chef" do
33
- source "lxc-natty-chef"
32
+ template "/usr/lib/lxc/templates/lxc-natty" do
33
+ source "lxc-natty"
34
34
  mode "0755"
35
35
  action :create
36
36
  end
37
37
 
38
- cookbook_file "/usr/local/bin/lxc-create-ubuntu-image" do
39
- source "lxc-create-ubuntu-image"
38
+ template "/usr/lib/lxc/templates/lxc-centos-6" do
39
+ source "lxc-centos-6"
40
40
  mode "0755"
41
- end
42
-
43
- bash "create ubuntu rootfs image ... this will take a while" do
44
- code <<-EOH
45
- /usr/local/bin/lxc-create-ubuntu-image natty
46
- EOH
47
- end
48
-
41
+ action :create
42
+ end
@@ -24,7 +24,7 @@ ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDCguB7XL3ARzLZYLsIMZe4UUO371m+H5C6V8MhtmSl
24
24
  # add default route to host
25
25
  cat <<EOF > $rootfs/etc/rc.local
26
26
  #!/bin/sh -e
27
- route add default gw 192.168.20.1
27
+ route add default gw <%= node.network.gateway_ip %>
28
28
  exit 0
29
29
  EOF
30
30
 
@@ -97,7 +97,7 @@ copy_centos()
97
97
 
98
98
  install_centos()
99
99
  {
100
- cache="/var/cache/lxc/centos"
100
+ cache="/var/cache/lxc"
101
101
  rootfs=$1
102
102
  mkdir -p /var/lock/subsys/
103
103
  (
@@ -108,6 +108,10 @@ install_centos()
108
108
  fi
109
109
 
110
110
  arch=$(arch)
111
+ if [ "$arch" == "x86_64" ]; then
112
+ arch=amd64
113
+ fi
114
+
111
115
  if [ "$arch" == "i686" ]; then
112
116
  arch=i386
113
117
  fi
@@ -194,7 +198,7 @@ EOF
194
198
 
195
199
  clean()
196
200
  {
197
- cache="/var/cache/lxc/centos"
201
+ cache="/var/cache/lxc"
198
202
 
199
203
  if [ ! -e $cache ]; then
200
204
  exit 0
@@ -149,7 +149,7 @@ copy_ubuntu()
149
149
 
150
150
  install_ubuntu()
151
151
  {
152
- cache="/var/cache/lxc/ubuntu"
152
+ cache="/var/cache/lxc"
153
153
  rootfs=$1
154
154
  mkdir -p /var/lock/subsys/
155
155
  (
@@ -237,7 +237,7 @@ EOF
237
237
 
238
238
  clean()
239
239
  {
240
- cache="/var/cache/lxc/ubuntu"
240
+ cache="/var/cache/lxc"
241
241
 
242
242
  if [ ! -e $cache ]; then
243
243
  exit 0
@@ -70,7 +70,7 @@ copy_ubuntu()
70
70
 
71
71
  install_ubuntu()
72
72
  {
73
- cache="/var/cache/lxc/ubuntu"
73
+ cache="/var/cache/lxc"
74
74
  rootfs=$1
75
75
  mkdir -p /var/lock/subsys/
76
76
  (
@@ -158,7 +158,7 @@ EOF
158
158
 
159
159
  clean()
160
160
  {
161
- cache="/var/cache/lxc/ubuntu"
161
+ cache="/var/cache/lxc"
162
162
 
163
163
  if [ ! -e $cache ]; then
164
164
  exit 0
@@ -0,0 +1,38 @@
1
+ #!/bin/bash
2
+
3
+ hostname=`hostname`
4
+ gateway_ip="192.168.20.1"
5
+ domain=foo
6
+
7
+ function get_ip {
8
+ echo `ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'`
9
+ }
10
+
11
+ function update_ns {
12
+ ip=`get_ip`
13
+ # add default route to host and update ns
14
+ cat <<END > /tmp/nsupdate.txt
15
+ server $gateway_ip
16
+ update delete ${hostname}.$domain
17
+ update add ${hostname}.$domain 86400 A $ip
18
+ send
19
+ END
20
+
21
+ route add default gw $gateway_ip
22
+ nsupdate /tmp/nsupdate.txt
23
+ }
24
+
25
+ if [[ -n `get_ip` ]] ; then # if manually set ip address
26
+ # use host dns server
27
+ rm /etc/resolv.conf
28
+ cat <<END > /etc/resolv.conf
29
+ nameserver $gateway_ip
30
+ domain $domain
31
+ search $domain
32
+ END
33
+ else # if ip not set, use dhcp
34
+ /sbin/dhclient eth0
35
+ fi
36
+
37
+ update_ns
38
+ exit 0