OSDN Git Service

adds the Docker project new repository support.
[metasearch/grid-chef-repo.git] / cookbooks / docker-grid / recipes / engine.rb
index df0a3e2..473180f 100644 (file)
 
 # https://dcos.io/docs/1.8/administration/installing/custom/system-requirements/
 
-install_flavor = node['docker-grid']['install_flavor']
 platform = node['platform']
 platform_family = node['platform_family']
 platform_version = node['platform_version']
 
+install_flavor = node['docker-grid']['install_flavor']
+override_apt_line = node['docker-grid']['apt_repo']['override_apt_line']
+if !override_apt_line.nil? && !override_apt_line.empty? \
+  && override_apt_line.include?(node['docker-grid']['dockerproject']['apt_new_repo_url'])
+  Chef::Log.warn('This docker-grid::engine recipe uses the Docker new repository by the `override_apt_line` attribute.')
+  node.force_override['docker-grid']['dockerproject']['enable_new_repo'] = true
+end
+enable_new_repo = node['docker-grid']['dockerproject']['enable_new_repo']
+docker_ver = node['docker-grid']['engine']['version']
+docker_ver = '' if docker_ver.nil?
+storage_driver = node['docker-grid']['engine']['storage-driver']
+userns_remap = node['docker-grid']['engine']['userns-remap']
+
 if node['docker-grid']['engine']['skip_setup']
   log 'Skip the Docker Engine setup.'
   return
@@ -32,9 +44,6 @@ end
 ::Chef::Recipe.send(:include, PlatformUtils::Helper)
 ::Chef::Recipe.send(:include, PlatformUtils::VirtUtils)
 
-docker_ver = node['docker-grid']['engine']['version']
-docker_ver = '' if docker_ver.nil?
-
 [
   'bridge-utils',
 ].each {|pkg|
@@ -61,8 +70,6 @@ if shell_out("cat /etc/mtab | grep -E '\s+/\s+zfs\s+'").exitstatus.zero?
   end
 end
 
-storage_driver = node['docker-grid']['engine']['storage-driver']
-
 if storage_driver == 'overlay2'
   if !docker_ver.empty? && Gem::Version.create(docker_ver.tr('~', '-')) < Gem::Version.create('1.12')
     # tr('~', '-') for Ubuntu.
@@ -71,7 +78,6 @@ if storage_driver == 'overlay2'
 end
 load_kernel_module('overlay') if storage_driver =~ /overlay2?/
 
-userns_remap = node['docker-grid']['engine']['userns-remap']
 if !userns_remap.nil? && !userns_remap.empty?
   if !docker_ver.empty? && Gem::Version.create(docker_ver.tr('~', '-')) < Gem::Version.create('1.10')
     # tr('~', '-') for Ubuntu.
@@ -106,37 +112,71 @@ end
 
 case platform_family
 when 'rhel'
+  if storage_driver == 'devicemapper'
+    [
+      #'yum-utils',
+      'device-mapper-persistent-data',
+      'lvm2',
+    ].each {|pkg|
+      resources(package: pkg) rescue package pkg do
+        action :install
+      end
+    }
+  end
+
   if install_flavor == 'dockerproject'
     # https://dcos.io/docs/1.8/administration/installing/custom/system-requirements/install-docker-centos/
-    template '/etc/yum.repos.d/docker.repo' do
-      source  'etc/yum.repos.d/docker.repo'
-      owner 'root'
-      group 'root'
-      mode '0644'
+    old_repo_action = nil
+    new_repo_action = nil
+    pkgs = nil
+    if enable_new_repo
+      old_repo_action = :delete
+      new_repo_action = :create
+      pkgs = [
+        'docker-ce',
+      ]
+    else
+      old_repo_action = :create
+      new_repo_action = :delete
+      pkgs = [
+        'docker-engine-selinux',
+        'docker-engine',
+      ]
     end
 
     [
+      'docker.repo',
+      'docker-ce.repo',
+    ].each {|repo_file|
+      template "/etc/yum.repos.d/#{repo_file}" do
+        source  "etc/yum.repos.d/#{repo_file}"
+        owner 'root'
+        group 'root'
+        mode '0644'
+        action repo_file == 'docker.repo' ? old_repo_action : new_repo_action
+      end
+    }
+
+    [
       'docker',
-      'container-selinux',
       'docker-common',
+      #'container-selinux',
+      'docker-selinux',
     ].each {|pkg|
       resources(package: pkg) rescue package pkg do
-        action :remove
+        action platform_family == 'debian' ? :purge : :remove
         notifies :run, 'bash[clean_up_docker0_bridge]', :immediately
       end
     }
 
-    [
-      'docker-engine-selinux',
-      'docker-engine',
-    ].each {|pkg|
+    pkgs.each {|pkg|
       resources(yum_package: pkg) rescue yum_package pkg do
         allow_downgrade true
         action :install
         version docker_ver unless docker_ver.empty?
         # dockerrepo is disabled by default to prevent automatic update.
-        options '--enablerepo=dockerrepo'
-        notifies :run, 'bash[clean_up_docker0_bridge]', :before if pkg == 'docker-engine'
+        options '--enablerepo=dockerrepo' unless enable_new_repo
+        notifies :run, 'bash[clean_up_docker0_bridge]', :before if pkg == 'docker-engine' || pkg == 'docker-ce'
       end
     }
   else
@@ -146,7 +186,7 @@ when 'rhel'
       'docker-engine',
     ].each {|pkg|
       resources(package: pkg) rescue package pkg do
-        action :remove
+        action platform_family == 'debian' ? :purge : :remove
         notifies :run, 'bash[clean_up_docker0_bridge]', :immediately
       end
     }
@@ -216,13 +256,21 @@ when 'debian'
     pkg_name = node['docker-grid']['dockerproject']['package_name']
 
     apt_repo_config = node['docker-grid']['apt_repo']
+    apt_key_add_cmd = nil
+    apt_key_name = nil
+    if enable_new_repo
+      apt_key_add_cmd = "curl -fsSL https://download.docker.com/linux/#{platform}/gpg | apt-key add -"
+      apt_key_name = 'Docker Release (CE deb)'
+    else
+      apt_key_add_cmd = "apt-key adv --keyserver #{apt_repo_config['keyserver']} --recv-keys #{apt_repo_config['recv-keys']}"
+      apt_key_name = 'Docker Release Tool (releasedocker)'
+    end
     bash 'apt-key_adv_docker_tools_key' do
       code <<-"EOH"
-        apt-key adv --keyserver #{apt_repo_config['keyserver']} --recv-keys #{apt_repo_config['recv-keys']}
-        #apt-get update
+        #{apt_key_add_cmd}
       EOH
       action :nothing
-      not_if 'apt-key list | grep -i docker'
+      not_if "apt-key list 2>&1 | grep '#{apt_key_name}'"
     end
 
     template '/etc/apt/sources.list.d/docker.list' do
@@ -252,25 +300,24 @@ when 'debian'
   end
 
   resources(package: pkg_name_removed) rescue package pkg_name_removed do
-    action :remove
+    action platform_family == 'debian' ? :purge : :remove
     notifies :run, 'bash[clean_up_docker0_bridge]', :immediately
   end
 
   resources(package: pkg_name) rescue package pkg_name do
     action :install
+    options "-o Dpkg::Options::='--force-confnew'" if platform_family == 'debian'
     options '--allow-downgrades' if platform == 'debian' || platform_version >= '16.04'  # LTS (xenial)
     options '--force-yes' if platform_version == '14.04'  # LTS (trusty)
     version docker_ver unless docker_ver.empty?
     notifies :run, 'bash[clean_up_docker0_bridge]', :before
+    notifies :run, 'bash[apt-key_adv_docker_tools_key]', :before
+    notifies :run, "execute[#{apt_get_update}]", :before
   end
 end
 
 docker_opts = []
-
-storage_driver = node['docker-grid']['engine']['storage-driver']
 docker_opts.push("--storage-driver=#{storage_driver}") if !storage_driver.nil? && !storage_driver.empty?
-
-userns_remap = node['docker-grid']['engine']['userns-remap']
 docker_opts.push("--userns-remap=#{userns_remap}") if !userns_remap.nil? && !userns_remap.empty?
 
 extra_options = node['docker-grid']['engine']['daemon_extra_options']
@@ -335,6 +382,7 @@ end
 
 # utility scripts
 [
+  'docker_containers_cleanup',
   'docker_images_cleanup',
   'docker_volumes_cleanup',
 ].each {|script|