OSDN Git Service

adds the Debian 9 (stretch) support.
[metasearch/grid-chef-repo.git] / cookbooks / docker-grid / recipes / engine.rb
1 #
2 # Cookbook Name:: docker-grid
3 # Recipe:: engine
4 #
5 # Copyright 2016-2017, whitestar
6 #
7 # Licensed under the Apache License, Version 2.0 (the "License");
8 # you may not use this file except in compliance with the License.
9 # You may obtain a copy of the License at
10 #
11 #     http://www.apache.org/licenses/LICENSE-2.0
12 #
13 # Unless required by applicable law or agreed to in writing, software
14 # distributed under the License is distributed on an "AS IS" BASIS,
15 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 # See the License for the specific language governing permissions and
17 # limitations under the License.
18 #
19
20 # https://dcos.io/docs/1.8/administration/installing/custom/system-requirements/
21
22 platform = node['platform']
23 platform_version = node['platform_version']
24
25 if node['docker-grid']['engine']['skip_setup']
26   log 'Skip the Docker Engine setup.'
27   return
28 end
29
30 ::Chef::Recipe.send(:include, PlatformUtils::Helper)
31 ::Chef::Recipe.send(:include, PlatformUtils::VirtUtils)
32
33 docker_ver = node['docker-grid']['engine']['version']
34 docker_ver = '' if docker_ver.nil?
35
36 [
37   'bridge-utils',
38 ].each {|pkg|
39   resources(package: pkg) rescue package pkg do
40     action :install
41   end
42 }
43
44 bash 'systemctl_daemon-reload' do
45   code <<-EOH
46     systemctl daemon-reload
47   EOH
48   action :nothing
49 end
50
51 # https://docs.docker.com/engine/userguide/storagedriver/selectadriver/
52 if shell_out("cat /etc/mtab | grep -E '\s+/\s+zfs\s+'").exitstatus == 0
53   if container_guest_node?
54     Chef::Log.warn('This node is running in the Linux container with ZFS, set the storage-driver to vfs as a fallback.')
55     node.override['docker-grid']['engine']['storage-driver'] = 'vfs'
56   else
57     Chef::Log.warn('This node is running on ZFS, set the storage-driver to zfs.')
58     node.override['docker-grid']['engine']['storage-driver'] = 'zfs'
59   end
60 end
61
62 storage_driver = node['docker-grid']['engine']['storage-driver']
63
64 if storage_driver == 'overlay2'
65   if !docker_ver.empty? && Gem::Version.create(docker_ver.tr('~', '-')) < Gem::Version.create('1.12')
66     # tr('~', '-') for Ubuntu.
67     Chef::Application.fatal!('Docker version must be 1.12 or later for overlay2 storage driver.')  # and exit.
68   end
69 end
70 load_kernel_module('overlay') if storage_driver =~ /overlay2?/
71
72 userns_remap = node['docker-grid']['engine']['userns-remap']
73 if !userns_remap.nil? && !userns_remap.empty?
74   if !docker_ver.empty? && Gem::Version.create(docker_ver.tr('~', '-')) < Gem::Version.create('1.10')
75     # tr('~', '-') for Ubuntu.
76     Chef::Application.fatal!('Docker version must be 1.10 or later for userns-remap.')  # and exit.
77   end
78
79   include_recipe 'platform_utils::kernel_user_namespace'
80
81   remap_user = userns_remap == 'default' ? 'dockremap' : userns_remap
82   notifies_conf = {
83     'action' => :restart,
84     'resource' => 'service[docker]',
85     'timer' => :delayed,
86   }
87   ::Chef::Recipe.send(:include, PlatformUtils::Helper)
88   append_subusers([remap_user], notifies_conf)
89 end
90
91 bash 'clean_up_docker0_bridge' do
92   code <<-"EOH"
93     if brctl show | grep docker0; then
94       ip link set docker0 down
95       brctl delbr docker0
96     fi
97     # https://github.com/docker/docker/issues/23630
98     if [ -d /var/lib/docker/network ]; then
99       rm -rf /var/lib/docker/network
100     fi
101   EOH
102   action :nothing
103 end
104
105 case node['platform_family']
106 when 'rhel'
107   if node['docker-grid']['install_flavor'] == 'dockerproject'
108     # https://dcos.io/docs/1.8/administration/installing/custom/system-requirements/install-docker-centos/
109     template '/etc/yum.repos.d/docker.repo' do
110       source  'etc/yum.repos.d/docker.repo'
111       owner 'root'
112       group 'root'
113       mode '0644'
114     end
115
116     [
117       'docker',
118       'container-selinux',
119       'docker-common',
120     ].each {|pkg|
121       resources(package: pkg) rescue package pkg do
122         action :remove
123         notifies :run, 'bash[clean_up_docker0_bridge]', :immediately
124       end
125     }
126
127     [
128       'docker-engine-selinux',
129       'docker-engine',
130     ].each {|pkg|
131       resources(yum_package: pkg) rescue yum_package pkg do
132         allow_downgrade true
133         action :install
134         version docker_ver unless docker_ver.empty?
135         # dockerrepo is disabled by default to prevent automatic update.
136         options '--enablerepo=dockerrepo'
137         notifies :run, 'bash[clean_up_docker0_bridge]', :before if pkg == 'docker-engine'
138       end
139     }
140   else
141     # OS distribution
142     [
143       'docker-engine-selinux',
144       'docker-engine',
145     ].each {|pkg|
146       resources(package: pkg) rescue package pkg do
147         action :remove
148         notifies :run, 'bash[clean_up_docker0_bridge]', :immediately
149       end
150     }
151
152     file '/etc/systemd/system/docker.service.d/override.conf' do
153       action :delete
154     end
155
156     [
157       'docker',
158     ].each {|pkg|
159       resources(yum_package: pkg) rescue yum_package pkg do
160         allow_downgrade true
161         action :install
162         version docker_ver unless docker_ver.empty?
163         notifies :run, 'bash[clean_up_docker0_bridge]', :before
164       end
165     }
166
167     template '/etc/sysconfig/docker' do
168       source  'etc/sysconfig/docker'
169       owner 'root'
170       group 'root'
171       mode '0644'
172       notifies :restart, 'service[docker]'
173     end
174   end
175 when 'debian'
176   # https://docs.docker.com/engine/installation/linux/debian/
177   # https://docs.docker.com/engine/installation/linux/ubuntulinux/
178   pkgs = [
179     'apt-transport-https',
180     'ca-certificates',
181     'curl',
182     'gnupg2',
183     'software-properties-common',
184   ]
185
186   if storage_driver == 'aufs' \
187     && !container_guest_node?
188     if platform == 'debian'
189       pkgs += [
190         'aufs-dkms',
191       ]
192     elsif platform == 'ubuntu'
193       pkgs += [
194         "linux-image-extra-#{node['os_version']}",
195         'linux-image-extra-virtual',
196       ]
197     end
198   end
199
200   pkgs.each {|pkg|
201     resources(package: pkg) rescue package pkg do
202       action :install
203     end
204   }
205
206   apt_get_update = 'apt-get_update'
207   resources(execute: apt_get_update) rescue execute apt_get_update do
208     command 'apt-get update'
209     action :nothing
210   end
211
212   if node['docker-grid']['install_flavor'] == 'dockerproject'
213     pkg_name_removed = 'docker.io'
214     pkg_name = node['docker-grid']['dockerproject']['package_name']
215
216     apt_repo_config = node['docker-grid']['apt_repo']
217     bash 'apt-key_adv_docker_tools_key' do
218       code <<-"EOH"
219         apt-key adv --keyserver #{apt_repo_config['keyserver']} --recv-keys #{apt_repo_config['recv-keys']}
220         #apt-get update
221       EOH
222       action :nothing
223       not_if 'apt-key list | grep -i docker'
224     end
225
226     template '/etc/apt/sources.list.d/docker.list' do
227       source  'etc/apt/sources.list.d/docker.list'
228       owner 'root'
229       group 'root'
230       mode '0644'
231       notifies :run, 'bash[apt-key_adv_docker_tools_key]', :before
232       notifies :run, "execute[#{apt_get_update}]", :immediately
233     end
234   else
235     # OS distribution
236     pkg_name_removed = node['docker-grid']['dockerproject']['package_name']
237     pkg_name = 'docker.io'
238   end
239
240   # Pinning Docker version
241   template '/etc/apt/preferences.d/docker.pref' do
242     source  'etc/apt/preferences.d/docker.pref'
243     owner 'root'
244     group 'root'
245     mode '0644'
246     action :delete if docker_ver.empty?
247     variables(
248       pkg_name: pkg_name
249     )
250   end
251
252   resources(package: pkg_name_removed) rescue package pkg_name_removed do
253     action :remove
254     notifies :run, 'bash[clean_up_docker0_bridge]', :immediately
255   end
256
257   resources(package: pkg_name) rescue package pkg_name do
258     action :install
259     options '--allow-downgrades' if platform == 'debian' || platform_version >= '16.04'  # LTS (xenial)
260     options '--force-yes' if platform_version == '14.04'  # LTS (trusty)
261     version docker_ver unless docker_ver.empty?
262     notifies :run, 'bash[clean_up_docker0_bridge]', :before
263   end
264 end
265
266 docker_opts = []
267
268 storage_driver = node['docker-grid']['engine']['storage-driver']
269 docker_opts.push("--storage-driver=#{storage_driver}") if !storage_driver.nil? && !storage_driver.empty?
270
271 userns_remap = node['docker-grid']['engine']['userns-remap']
272 docker_opts.push("--userns-remap=#{userns_remap}") if !userns_remap.nil? && !userns_remap.empty?
273
274 extra_options = node['docker-grid']['engine']['daemon_extra_options']
275 # for docker-engine package on RHEL: remove '-H fd://'
276 # https://github.com/docker/docker/issues/22847
277 if (node['platform_family'] == 'rhel' || platform == 'debian' || platform_version == '14.04') \
278   && !docker_ver.empty? && Gem::Version.create(docker_ver.tr('~', '-')) >= Gem::Version.create('1.12')
279   extra_options.gsub!(%r{-H\sfd://}, '')
280 end
281
282 docker_opts.push(extra_options) if !extra_options.nil? && !extra_options.empty?
283
284 init_package = node['init_package']
285 if init_package == 'systemd'
286   directory '/etc/systemd/system/docker.service.d' do
287     owner 'root'
288     group 'root'
289     mode '0755'
290     action :create
291   end
292
293   template '/etc/systemd/system/docker.service.d/override.conf' do
294     source  'etc/systemd/system/docker.service.d/override.conf'
295     owner 'root'
296     group 'root'
297     mode '0644'
298     variables(
299       docker_opts: docker_opts
300     )
301     not_if { node['docker-grid']['install_flavor'] == 'os-repository' && node['platform_family'] == 'rhel' }
302     notifies :run, 'bash[systemctl_daemon-reload]', :immediately
303     notifies :restart, 'service[docker]'
304   end
305 elsif init_package == 'init'  # for Ubuntu 14.04,...
306   template '/etc/default/docker' do
307     source  'etc/default/docker'
308     owner 'root'
309     group 'root'
310     mode '0644'
311     variables(
312       docker_opts: docker_opts
313     )
314     notifies :restart, 'service[docker]'
315   end
316 end
317
318 service 'docker' do
319   provider Chef::Provider::Service::Upstart if platform == 'ubuntu' && platform_version < '15.04'
320   action [:start, :enable]
321   subscribes :restart, 'execute[update-ca-certificates]', :delayed
322 end
323
324 users = node['docker-grid']['engine']['users_allow']
325 group 'docker' do
326   members users unless users.empty?
327   action :create
328   append true
329 end
330
331 template '/usr/local/bin/docker_images_cleanup' do
332   source  'usr/local/bin/docker_images_cleanup'
333   owner 'root'
334   group 'root'
335   mode '0755'
336   action :create
337 end