OSDN Git Service

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