OSDN Git Service

adds docker service's handling of CA certificate update events.
[metasearch/grid-chef-repo.git] / cookbooks / docker-grid / recipes / engine.rb
1 #
2 # Cookbook Name:: docker-grid
3 # Recipe:: engine
4 #
5 # Copyright 2016, 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 bash 'systemctl_daemon-reload' do
23   code <<-EOH
24     systemctl daemon-reload
25   EOH
26   action :nothing
27 end
28
29 if node['docker-grid']['engine']['storage-driver'] == 'overlay'
30   bash 'load_overlayfs_kernel_module' do
31     code <<-EOH
32       modprobe overlay
33     EOH
34     not_if 'lsmod | grep overlay'
35   end
36
37   template '/etc/modules-load.d/overlay.conf' do
38     source  'etc/modules-load.d/overlay.conf'
39     owner 'root'
40     group 'root'
41     mode '0644'
42   end
43 end
44
45 log 'reboot_message' do
46   message 'Please reboot this machine because of kernel boot option modified.'
47   level :warn
48   action :nothing
49 end
50
51 userns_remap = node['docker-grid']['engine']['userns-remap']
52 if !userns_remap.nil? && !userns_remap.empty?
53   unless Gem::Version.create(node['docker-grid']['engine']['version'].tr('~', '-')) >= Gem::Version.create('1.10')
54     # tr('~', '-') for Ubuntu.
55     Chef::Application.fatal!('Docker version must be 1.10 or later for userns-remap.')  # and exit.
56   end
57   # By default user namespace feature is inactive in RHEL family (>= 7.2).
58   if node['platform_family'] == 'rhel'
59     unless Gem::Version.create(node['platform_version']) >= Gem::Version.create('7.2')
60       Chef::Application.fatal!('Platform version must be 7.2 or later for kernel user namespace feature.')  # and exit.
61     end
62
63     bash 'enable_user_namespace_feature_of_kernerl' do
64       code <<-"EOH"
65         grubby --args='user_namespace.enable=1' --update-kernel=/boot/vmlinuz-#{node['kernel']['release']}
66       EOH
67       not_if "grubby --info=/boot/vmlinuz-#{node['kernel']['release']} | grep 'user_namespace.enable=1'"
68       notifies :write, 'log[reboot_message]'
69     end
70   end
71
72   subid_files = [
73     '/etc/subuid',
74     '/etc/subgid',
75   ]
76
77   subid_files.each {|subid_file|
78     file subid_file do
79       owner 'root'
80       group 'root'
81       mode '0644'
82       action :touch
83       not_if { File.exist?(subid_file) }
84     end
85   }
86
87   this_recipe = self
88   remap_user = userns_remap == 'default' ? 'dockremap' : userns_remap
89   ruby_block 'adds_subid_entries' do
90     action :run
91     not_if "cat /etc/subuid | grep #{remap_user}"
92     not_if "cat /etc/subgid | grep #{remap_user}"
93     notifies :restart, 'service[docker]'
94     block do
95       subid_files.each {|subid_file|
96         max_start_id = 100_000
97         offset = 0
98         already_exist = false
99
100         begin
101           File.open(subid_file) {|file|
102             file.each_line {|line|
103               entry = line.split(':')
104               if entry[0] == remap_user
105                 already_exist = true
106                 break
107               end
108               if entry[1].to_i >= max_start_id
109                 max_start_id = entry[1].to_i
110                 offset = entry[2].to_i
111               end
112             }
113           }
114
115           if already_exist
116             this_recipe.log "#{remap_user} already exists in #{subid_file}"
117           else
118             File.open(subid_file, 'a') {|file|
119               entry_str = "#{remap_user}:#{max_start_id + offset}:65536"
120               this_recipe.log "#{remap_user} (#{entry_str}) is added in #{subid_file}"
121               file.puts entry_str
122             }
123           end
124         rescue IOError => e
125           puts e
126         end
127       }
128     end
129   end
130 end
131
132 directory '/etc/systemd/system/docker.service.d' do
133   owner 'root'
134   group 'root'
135   mode '0755'
136   action :create
137 end
138
139 template '/etc/systemd/system/docker.service.d/override.conf' do
140   source  'etc/systemd/system/docker.service.d/override.conf'
141   owner 'root'
142   group 'root'
143   mode '0644'
144   notifies :run, 'bash[systemctl_daemon-reload]'
145   notifies :restart, 'service[docker]'
146 end
147
148 case node['platform_family']
149 when 'rhel'
150   # https://dcos.io/docs/1.8/administration/installing/custom/system-requirements/install-docker-centos/
151   template '/etc/yum.repos.d/docker.repo' do
152     source  'etc/yum.repos.d/docker.repo'
153     owner 'root'
154     group 'root'
155     mode '0644'
156   end
157
158   [
159     'docker-engine-selinux',
160     'docker-engine',
161   ].each {|pkg|
162     resources(package: pkg) rescue package pkg do
163       action :install
164       version node['docker-grid']['engine']['version']
165       # dockerrepo is disabled by default to prevent automatic update.
166       options '--enablerepo=dockerrepo'
167     end
168   }
169 when 'debian'
170   # https://docs.docker.com/engine/installation/linux/ubuntulinux/
171   pkgs = [
172     'apt-transport-https',
173     'ca-certificates',
174   ]
175
176   if node['docker-grid']['engine']['storage-driver'] == 'aufs'
177     pkgs += [
178       "linux-image-extra-#{node['os_version']}",
179       'linux-image-extra-virtual',
180     ]
181   end
182
183   pkgs.each {|pkg|
184     resources(package: pkg) rescue package pkg do
185       action :install
186     end
187   }
188
189   template '/etc/apt/sources.list.d/docker.list' do
190     source  'etc/apt/sources.list.d/docker.list'
191     owner 'root'
192     group 'root'
193     mode '0644'
194   end
195
196   apt_repo_config = node['docker-grid']['apt_repo']
197   bash 'apt-key_adv_docker_tools_key' do
198     code <<-"EOH"
199       apt-key adv --keyserver #{apt_repo_config['keyserver']} --recv-keys #{apt_repo_config['recv-keys']}
200       apt-get update
201     EOH
202     not_if 'apt-key list | grep -i docker'
203   end
204
205   # Pinning Docker version
206   template '/etc/apt/preferences.d/docker.pref' do
207     source  'etc/apt/preferences.d/docker.pref'
208     owner 'root'
209     group 'root'
210     mode '0644'
211   end
212
213   [
214     'docker-engine',
215   ].each {|pkg|
216     resources(package: pkg) rescue package pkg do
217       action :install
218       version node['docker-grid']['engine']['version']
219     end
220   }
221 end
222
223 service 'docker' do
224   action [:start, :enable]
225   subscribes :restart, 'execute[update-ca-certificates]', :delayed
226 end
227
228 users = node['docker-grid']['engine']['users_allow']
229 group 'docker' do
230   members users unless users.empty?
231   action :create
232   append true
233 end