OSDN Git Service

adds OS distributed Docker Engine package 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 ::Chef::Recipe.send(:include, PlatformUtils::Helper)
23 ::Chef::Recipe.send(:include, PlatformUtils::VirtUtils)
24
25 docker_ver = node['docker-grid']['engine']['version']
26
27 [
28   'bridge-utils',
29 ].each {|pkg|
30   resources(package: pkg) rescue package pkg do
31     action :install
32   end
33 }
34
35 bash 'systemctl_daemon-reload' do
36   code <<-EOH
37     systemctl daemon-reload
38   EOH
39   action :nothing
40 end
41
42 # https://docs.docker.com/engine/userguide/storagedriver/selectadriver/
43 if shell_out("cat /etc/mtab | grep -E '\s+/\s+zfs\s+'").exitstatus == 0
44   if container_guest_node?
45     Chef::Log.warn('This node is running in the Linux container with ZFS, set the storage-driver to vfs as a fallback.')
46     node.override['docker-grid']['engine']['storage-driver'] = 'vfs'
47   else
48     Chef::Log.warn('This node is running on ZFS, set the storage-driver to zfs.')
49     node.override['docker-grid']['engine']['storage-driver'] = 'zfs'
50   end
51 end
52
53 storage_driver = node['docker-grid']['engine']['storage-driver']
54
55 if storage_driver == 'overlay2'
56   unless Gem::Version.create(docker_ver.tr('~', '-')) >= Gem::Version.create('1.12')
57     # tr('~', '-') for Ubuntu.
58     Chef::Application.fatal!('Docker version must be 1.12 or later for overlay2 storage driver.')  # and exit.
59   end
60 end
61 load_kernel_module('overlay') if storage_driver =~ /overlay2?/
62
63 userns_remap = node['docker-grid']['engine']['userns-remap']
64 if !userns_remap.nil? && !userns_remap.empty?
65   unless Gem::Version.create(docker_ver.tr('~', '-')) >= Gem::Version.create('1.10')
66     # tr('~', '-') for Ubuntu.
67     Chef::Application.fatal!('Docker version must be 1.10 or later for userns-remap.')  # and exit.
68   end
69
70   include_recipe 'platform_utils::kernel_user_namespace'
71
72   remap_user = userns_remap == 'default' ? 'dockremap' : userns_remap
73   notifies_conf = {
74     'action' => :restart,
75     'resource' => 'service[docker]',
76     'timer' => :delayed,
77   }
78   ::Chef::Recipe.send(:include, PlatformUtils::Helper)
79   append_subusers([remap_user], notifies_conf)
80 end
81
82 bash 'clean_up_docker0_bridge' do
83   code <<-"EOH"
84     if brctl show | grep docker0; then
85       ip link set docker0 down
86       brctl delbr docker0
87     fi
88     # https://github.com/docker/docker/issues/23630
89     if [ -d /var/lib/docker/network ]; then
90       rm -rf /var/lib/docker/network
91     fi
92   EOH
93   action :nothing
94 end
95
96 directory '/etc/systemd/system/docker.service.d' do
97   owner 'root'
98   group 'root'
99   mode '0755'
100   action :create
101 end
102
103 template '/etc/systemd/system/docker.service.d/override.conf' do
104   source  'etc/systemd/system/docker.service.d/override.conf'
105   owner 'root'
106   group 'root'
107   mode '0644'
108   not_if { node['docker-grid']['install_flavor'] == 'os-repository' && node['platform_family'] == 'rhel' }
109   notifies :run, 'bash[systemctl_daemon-reload]', :immediately
110   notifies :restart, 'service[docker]'
111 end
112
113 case node['platform_family']
114 when 'rhel'
115   if node['docker-grid']['install_flavor'] == 'dockerproject'
116     # https://dcos.io/docs/1.8/administration/installing/custom/system-requirements/install-docker-centos/
117     template '/etc/yum.repos.d/docker.repo' do
118       source  'etc/yum.repos.d/docker.repo'
119       owner 'root'
120       group 'root'
121       mode '0644'
122     end
123
124     [
125       'docker',
126       'container-selinux',
127       'docker-common',
128     ].each {|pkg|
129       resources(package: pkg) rescue package pkg do
130         action :remove
131         notifies :run, 'bash[clean_up_docker0_bridge]', :immediately
132       end
133     }
134
135     [
136       'docker-engine-selinux',
137       'docker-engine',
138     ].each {|pkg|
139       resources(yum_package: pkg) rescue yum_package pkg do
140         allow_downgrade true
141         action :install
142         version docker_ver
143         # dockerrepo is disabled by default to prevent automatic update.
144         options '--enablerepo=dockerrepo'
145         notifies :run, 'bash[clean_up_docker0_bridge]', :before if pkg == 'docker-engine'
146       end
147     }
148   else
149     # OS distribution
150     [
151       'docker-engine-selinux',
152       'docker-engine',
153     ].each {|pkg|
154       resources(package: pkg) rescue package pkg do
155         action :remove
156         notifies :run, 'bash[clean_up_docker0_bridge]', :immediately
157       end
158     }
159
160     file '/etc/systemd/system/docker.service.d/override.conf' do
161       action :delete
162     end
163
164     [
165       'docker',
166     ].each {|pkg|
167       resources(yum_package: pkg) rescue yum_package pkg do
168         allow_downgrade true
169         action :install
170         version docker_ver
171         notifies :run, 'bash[clean_up_docker0_bridge]', :before
172       end
173     }
174
175     template '/etc/sysconfig/docker' do
176       source  'etc/sysconfig/docker'
177       owner 'root'
178       group 'root'
179       mode '0644'
180       notifies :restart, 'service[docker]'
181     end
182   end
183 when 'debian'
184   # https://docs.docker.com/engine/installation/linux/ubuntulinux/
185   pkgs = [
186     'apt-transport-https',
187     'ca-certificates',
188   ]
189
190   if storage_driver == 'aufs' \
191     && !container_guest_node?
192     pkgs += [
193       "linux-image-extra-#{node['os_version']}",
194       'linux-image-extra-virtual',
195     ]
196   end
197
198   pkgs.each {|pkg|
199     resources(package: pkg) rescue package pkg do
200       action :install
201     end
202   }
203
204   apt_get_update = 'apt-get_update'
205   resources(execute: apt_get_update) rescue execute apt_get_update do
206     command 'apt-get update'
207     action :nothing
208   end
209
210   if node['docker-grid']['install_flavor'] == 'dockerproject'
211     pkg_name_removed = 'docker.io'
212     pkg_name = 'docker-engine'
213
214     apt_repo_config = node['docker-grid']['apt_repo']
215     bash 'apt-key_adv_docker_tools_key' do
216       code <<-"EOH"
217         apt-key adv --keyserver #{apt_repo_config['keyserver']} --recv-keys #{apt_repo_config['recv-keys']}
218         #apt-get update
219       EOH
220       action :nothing
221       not_if 'apt-key list | grep -i docker'
222     end
223
224     template '/etc/apt/sources.list.d/docker.list' do
225       source  'etc/apt/sources.list.d/docker.list'
226       owner 'root'
227       group 'root'
228       mode '0644'
229       notifies :run, 'bash[apt-key_adv_docker_tools_key]', :before
230       notifies :run, "execute[#{apt_get_update}]", :immediately
231     end
232   else
233     # OS distribution
234     pkg_name_removed = 'docker-engine'
235     pkg_name = 'docker.io'
236   end
237
238   # Pinning Docker version
239   template '/etc/apt/preferences.d/docker.pref' do
240     source  'etc/apt/preferences.d/docker.pref'
241     owner 'root'
242     group 'root'
243     mode '0644'
244     variables(
245       pkg_name: pkg_name
246     )
247   end
248
249   resources(package: pkg_name_removed) rescue package pkg_name_removed do
250     action :remove
251     notifies :run, 'bash[clean_up_docker0_bridge]', :immediately
252   end
253
254   resources(package: pkg_name) rescue package pkg_name do
255     action :install
256     options '--allow-downgrades'
257     version docker_ver
258     notifies :run, 'bash[clean_up_docker0_bridge]', :before
259   end
260 end
261
262 service 'docker' do
263   action [:start, :enable]
264   subscribes :restart, 'execute[update-ca-certificates]', :delayed
265 end
266
267 users = node['docker-grid']['engine']['users_allow']
268 group 'docker' do
269   members users unless users.empty?
270   action :create
271   append true
272 end