OSDN Git Service

adds `Docker in LXD` 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::VirtUtils)
23
24 bash 'systemctl_daemon-reload' do
25   code <<-EOH
26     systemctl daemon-reload
27   EOH
28   action :nothing
29 end
30
31 if container_guest_node? && shell_out("cat /etc/mtab | grep -E '\s+/\s+zfs\s+'").exitstatus == 0
32   Chef::Log.warn('This node is running in the Linux container with ZFS, set the storage-driver to vfs as a fallback.')
33   node.override['docker-grid']['engine']['storage-driver'] = 'vfs'
34 end
35
36 if node['docker-grid']['engine']['storage-driver'] == 'overlay'
37   bash 'load_overlayfs_kernel_module' do
38     code <<-EOH
39       modprobe overlay
40     EOH
41     not_if 'lsmod | grep overlay'
42   end
43
44   template '/etc/modules-load.d/overlay.conf' do
45     source  'etc/modules-load.d/overlay.conf'
46     owner 'root'
47     group 'root'
48     mode '0644'
49   end
50 end
51
52 log 'reboot_message' do
53   message 'Please reboot this machine because of kernel boot option modified.'
54   level :warn
55   action :nothing
56 end
57
58 userns_remap = node['docker-grid']['engine']['userns-remap']
59 if !userns_remap.nil? && !userns_remap.empty?
60   unless Gem::Version.create(node['docker-grid']['engine']['version'].tr('~', '-')) >= Gem::Version.create('1.10')
61     # tr('~', '-') for Ubuntu.
62     Chef::Application.fatal!('Docker version must be 1.10 or later for userns-remap.')  # and exit.
63   end
64   # By default user namespace feature is inactive in RHEL family (>= 7.2).
65   if node['platform_family'] == 'rhel' && !container_guest_node?
66     unless Gem::Version.create(node['platform_version']) >= Gem::Version.create('7.2')
67       Chef::Application.fatal!('Platform version must be 7.2 or later for kernel user namespace feature.')  # and exit.
68     end
69
70     bash 'enable_user_namespace_feature_of_kernerl' do
71       code <<-"EOH"
72         grubby --args='user_namespace.enable=1' --update-kernel=/boot/vmlinuz-#{node['kernel']['release']}
73       EOH
74       not_if "grubby --info=/boot/vmlinuz-#{node['kernel']['release']} | grep 'user_namespace.enable=1'"
75       notifies :write, 'log[reboot_message]'
76     end
77   end
78
79   remap_user = userns_remap == 'default' ? 'dockremap' : userns_remap
80   notifies_conf = {
81     'action' => :restart,
82     'resource' => 'service[docker]',
83     'timer' => :delayed,
84   }
85   ::Chef::Recipe.send(:include, PlatformUtils::Helper)
86   append_subusers([remap_user], notifies_conf)
87 end
88
89 directory '/etc/systemd/system/docker.service.d' do
90   owner 'root'
91   group 'root'
92   mode '0755'
93   action :create
94 end
95
96 template '/etc/systemd/system/docker.service.d/override.conf' do
97   source  'etc/systemd/system/docker.service.d/override.conf'
98   owner 'root'
99   group 'root'
100   mode '0644'
101   notifies :run, 'bash[systemctl_daemon-reload]'
102   notifies :restart, 'service[docker]'
103 end
104
105 case node['platform_family']
106 when 'rhel'
107   # https://dcos.io/docs/1.8/administration/installing/custom/system-requirements/install-docker-centos/
108   template '/etc/yum.repos.d/docker.repo' do
109     source  'etc/yum.repos.d/docker.repo'
110     owner 'root'
111     group 'root'
112     mode '0644'
113   end
114
115   [
116     'docker-engine-selinux',
117     'docker-engine',
118   ].each {|pkg|
119     resources(package: pkg) rescue package pkg do
120       action :install
121       version node['docker-grid']['engine']['version']
122       # dockerrepo is disabled by default to prevent automatic update.
123       options '--enablerepo=dockerrepo'
124     end
125   }
126 when 'debian'
127   # https://docs.docker.com/engine/installation/linux/ubuntulinux/
128   pkgs = [
129     'apt-transport-https',
130     'ca-certificates',
131   ]
132
133   if node['docker-grid']['engine']['storage-driver'] == 'aufs' \
134     && !container_guest_node?
135     pkgs += [
136       "linux-image-extra-#{node['os_version']}",
137       'linux-image-extra-virtual',
138     ]
139   end
140
141   pkgs.each {|pkg|
142     resources(package: pkg) rescue package pkg do
143       action :install
144     end
145   }
146
147   apt_get_update = 'apt-get_update'
148   resources(execute: apt_get_update) rescue execute apt_get_update do
149     command 'apt-get update'
150     action :nothing
151   end
152
153   apt_repo_config = node['docker-grid']['apt_repo']
154   bash 'apt-key_adv_docker_tools_key' do
155     code <<-"EOH"
156       apt-key adv --keyserver #{apt_repo_config['keyserver']} --recv-keys #{apt_repo_config['recv-keys']}
157       #apt-get update
158     EOH
159     action :nothing
160     not_if 'apt-key list | grep -i docker'
161   end
162
163   template '/etc/apt/sources.list.d/docker.list' do
164     source  'etc/apt/sources.list.d/docker.list'
165     owner 'root'
166     group 'root'
167     mode '0644'
168     notifies :run, 'bash[apt-key_adv_docker_tools_key]', :before
169     notifies :run, "execute[#{apt_get_update}]", :immediately
170   end
171
172   # Pinning Docker version
173   template '/etc/apt/preferences.d/docker.pref' do
174     source  'etc/apt/preferences.d/docker.pref'
175     owner 'root'
176     group 'root'
177     mode '0644'
178   end
179
180   [
181     'docker-engine',
182   ].each {|pkg|
183     resources(package: pkg) rescue package pkg do
184       action :install
185       version node['docker-grid']['engine']['version']
186     end
187   }
188 end
189
190 service 'docker' do
191   action [:start, :enable]
192   subscribes :restart, 'execute[update-ca-certificates]', :delayed
193 end
194
195 users = node['docker-grid']['engine']['users_allow']
196 group 'docker' do
197   members users unless users.empty?
198   action :create
199   append true
200 end