OSDN Git Service

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