From 2065943a7785175bf12555e4c9794d79d3fc2067 Mon Sep 17 00:00:00 2001 From: dave-q <24652224+dave-q@users.noreply.github.com> Date: Thu, 1 Apr 2021 12:01:44 +0100 Subject: [PATCH] [GH-476] Allow specifying install method for internal windows_feature resources - Introduces new attribute ['iis']['windows_feature_install_method'] if the node is present its value is passed into any windows_feature resources as the install_method property Signed-off-by: dave-q <24652224+dave-q@users.noreply.github.com> --- .github/workflows/ci.yml | 1 + README.md | 1 + kitchen.yml | 6 ++++++ recipes/default.rb | 1 + recipes/mod_application_initialization.rb | 5 ++++- recipes/mod_aspnet.rb | 3 +++ recipes/mod_aspnet45.rb | 6 +++++- recipes/mod_auth_basic.rb | 6 +++++- recipes/mod_auth_digest.rb | 6 +++++- recipes/mod_auth_windows.rb | 6 +++++- recipes/mod_cgi.rb | 6 +++++- recipes/mod_compress_dynamic.rb | 6 +++++- recipes/mod_compress_static.rb | 6 +++++- recipes/mod_ftp.rb | 6 +++++- recipes/mod_iis6_metabase_compat.rb | 6 +++++- recipes/mod_isapi.rb | 6 +++++- recipes/mod_logging.rb | 6 +++++- recipes/mod_management.rb | 3 +++ recipes/mod_security.rb | 6 +++++- recipes/mod_tracing.rb | 6 +++++- resources/install.rb | 2 ++ resources/manager.rb | 2 ++ spec/unit/recipes/default_spec.rb | 14 ++++++++++++++ 23 files changed, 102 insertions(+), 14 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4aad8ea8..5f830987 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -54,6 +54,7 @@ jobs: - 'section' - 'site' - 'vdir' + - 'default-windowsfeatures-powershell' fail-fast: false steps: diff --git a/README.md b/README.md index 8c7b2eb4..f58cb4e5 100644 --- a/README.md +++ b/README.md @@ -36,6 +36,7 @@ This cookbook is maintained by the Sous Chefs. The Sous Chefs are a community of - `node['iis']['pubroot']` - . default is `%SYSTEMDRIVE%\inetpub` - `node['iis']['docroot']` - IIS web site home directory. default is `%SYSTEMDRIVE%\inetpub\wwwroot` - `node['iis']['cache_dir']` - location of cached data. default is `%SYSTEMDRIVE%\inetpub\temp` +- `node['iis']['windows_feature_install_method']` - specify the install method that will be used by any windows_feature resources. If ommitted it will not be specified and will the windows_feature supply a default. Valid options are ':windows_feature_dism, :windows_feature_powershell, :windows_feature_servermanagercmd' ## Resources diff --git a/kitchen.yml b/kitchen.yml index 4afb88de..20a4c671 100644 --- a/kitchen.yml +++ b/kitchen.yml @@ -71,3 +71,9 @@ suites: - name: vdir run_list: - recipe[test::vdir] + - name: default-windowsfeatures-powershell + run_list: + -recipe[iis::default] + attributes: + iis: + windows_feature_install_method: :windows_feature_powershell diff --git a/recipes/default.rb b/recipes/default.rb index 4c2d7041..be18dad3 100644 --- a/recipes/default.rb +++ b/recipes/default.rb @@ -21,6 +21,7 @@ iis_install 'install IIS' do additional_components node['iis']['components'] source node['iis']['source'] + install_method node['iis']['windows_feature_install_method'] end service 'iis' do diff --git a/recipes/mod_application_initialization.rb b/recipes/mod_application_initialization.rb index c98e39de..371aff2e 100644 --- a/recipes/mod_application_initialization.rb +++ b/recipes/mod_application_initialization.rb @@ -20,4 +20,7 @@ include_recipe 'iis' -windows_feature 'IIS-ApplicationInit' +install_method = node['iis']['windows_feature_install_method'] +windows_feature 'IIS-ApplicationInit' do + install_method install_method unless install_method.nil? +end diff --git a/recipes/mod_aspnet.rb b/recipes/mod_aspnet.rb index f085bd18..3a1b5b81 100644 --- a/recipes/mod_aspnet.rb +++ b/recipes/mod_aspnet.rb @@ -21,8 +21,11 @@ include_recipe 'iis' include_recipe 'iis::mod_isapi' +install_method = node['iis']['windows_feature_install_method'] + windows_feature %w(IIS-NetFxExtensibility IIS-ASPNET) do action :install all !IISCookbook::Helper.older_than_windows2012? source node['iis']['source'] unless node['iis']['source'].nil? + install_method install_method unless install_method.nil? end diff --git a/recipes/mod_aspnet45.rb b/recipes/mod_aspnet45.rb index 6a3e7dbf..ffc5f6f6 100644 --- a/recipes/mod_aspnet45.rb +++ b/recipes/mod_aspnet45.rb @@ -21,4 +21,8 @@ include_recipe 'iis' include_recipe 'iis::mod_isapi' -windows_feature %w(NetFx4Extended-ASPNET45 IIS-NetFxExtensibility45 IIS-ASPNET45) +install_method = node['iis']['windows_feature_install_method'] + +windows_feature %w(NetFx4Extended-ASPNET45 IIS-NetFxExtensibility45 IIS-ASPNET45) do + install_method install_method unless install_method.nil? +end diff --git a/recipes/mod_auth_basic.rb b/recipes/mod_auth_basic.rb index 032aedbb..4917206b 100644 --- a/recipes/mod_auth_basic.rb +++ b/recipes/mod_auth_basic.rb @@ -20,7 +20,11 @@ include_recipe 'iis' -windows_feature 'IIS-BasicAuthentication' +install_method = node['iis']['windows_feature_install_method'] + +windows_feature 'IIS-BasicAuthentication' do + install_method install_method unless install_method.nil? +end iis_section 'unlocks basic authentication control in web.config' do section 'system.webServer/security/authentication/basicAuthentication' diff --git a/recipes/mod_auth_digest.rb b/recipes/mod_auth_digest.rb index 517a36e2..a1e89f1c 100644 --- a/recipes/mod_auth_digest.rb +++ b/recipes/mod_auth_digest.rb @@ -20,7 +20,11 @@ include_recipe 'iis' -windows_feature 'IIS-DigestAuthentication' +install_method = node['iis']['windows_feature_install_method'] + +windows_feature 'IIS-DigestAuthentication' do + install_method install_method unless install_method.nil? +end iis_section 'unlocks digest authentication control in web.config' do section 'system.webServer/security/authentication/digestAuthentication' diff --git a/recipes/mod_auth_windows.rb b/recipes/mod_auth_windows.rb index cba02fe9..51ea98e1 100644 --- a/recipes/mod_auth_windows.rb +++ b/recipes/mod_auth_windows.rb @@ -20,7 +20,11 @@ include_recipe 'iis' -windows_feature 'IIS-WindowsAuthentication' +install_method = node['iis']['windows_feature_install_method'] + +windows_feature 'IIS-WindowsAuthentication' do + install_method install_method unless install_method.nil? +end iis_section 'unlocks windows authentication control in web.config' do section 'system.webServer/security/authentication/windowsAuthentication' diff --git a/recipes/mod_cgi.rb b/recipes/mod_cgi.rb index a29b7628..d152a860 100644 --- a/recipes/mod_cgi.rb +++ b/recipes/mod_cgi.rb @@ -20,4 +20,8 @@ include_recipe 'iis' -windows_feature 'IIS-CGI' +install_method = node['iis']['windows_feature_install_method'] + +windows_feature 'IIS-CGI' do + install_method install_method unless install_method.nil? +end diff --git a/recipes/mod_compress_dynamic.rb b/recipes/mod_compress_dynamic.rb index 991e86aa..39723023 100644 --- a/recipes/mod_compress_dynamic.rb +++ b/recipes/mod_compress_dynamic.rb @@ -20,4 +20,8 @@ include_recipe 'iis' -windows_feature 'IIS-HttpCompressionDynamic' +install_method = node['iis']['windows_feature_install_method'] + +windows_feature 'IIS-HttpCompressionDynamic' do + install_method install_method unless install_method.nil? +end diff --git a/recipes/mod_compress_static.rb b/recipes/mod_compress_static.rb index 725fd17c..066ca45a 100644 --- a/recipes/mod_compress_static.rb +++ b/recipes/mod_compress_static.rb @@ -20,4 +20,8 @@ include_recipe 'iis' -windows_feature 'IIS-HttpCompressionStatic' +install_method = node['iis']['windows_feature_install_method'] + +windows_feature 'IIS-HttpCompressionStatic' do + install_method install_method unless install_method.nil? +end diff --git a/recipes/mod_ftp.rb b/recipes/mod_ftp.rb index 7c2161d2..5acd45b3 100644 --- a/recipes/mod_ftp.rb +++ b/recipes/mod_ftp.rb @@ -20,4 +20,8 @@ include_recipe 'iis' -windows_feature %w(IIS-FTPServer IIS-FTPSvc IIS-FTPExtensibility) +install_method = node['iis']['windows_feature_install_method'] + +windows_feature %w(IIS-FTPServer IIS-FTPSvc IIS-FTPExtensibility) do + install_method install_method unless install_method.nil? +end diff --git a/recipes/mod_iis6_metabase_compat.rb b/recipes/mod_iis6_metabase_compat.rb index b1df7e62..0c59c9d0 100644 --- a/recipes/mod_iis6_metabase_compat.rb +++ b/recipes/mod_iis6_metabase_compat.rb @@ -20,4 +20,8 @@ include_recipe 'iis' -windows_feature %w(IIS-IIS6ManagementCompatibility IIS-Metabase) +install_method = node['iis']['windows_feature_install_method'] + +windows_feature %w(IIS-IIS6ManagementCompatibility IIS-Metabase) do + install_method install_method unless install_method.nil? +end diff --git a/recipes/mod_isapi.rb b/recipes/mod_isapi.rb index bffffd4c..d7b4f263 100644 --- a/recipes/mod_isapi.rb +++ b/recipes/mod_isapi.rb @@ -20,4 +20,8 @@ include_recipe 'iis' -windows_feature %w(IIS-ISAPIFilter IIS-ISAPIExtensions) +install_method = node['iis']['windows_feature_install_method'] + +windows_feature %w(IIS-ISAPIFilter IIS-ISAPIExtensions) do + install_method install_method unless install_method.nil? +end diff --git a/recipes/mod_logging.rb b/recipes/mod_logging.rb index ba2d46c2..1e1f38b9 100644 --- a/recipes/mod_logging.rb +++ b/recipes/mod_logging.rb @@ -20,4 +20,8 @@ include_recipe 'iis' -windows_feature 'IIS-CustomLogging' +install_method = node['iis']['windows_feature_install_method'] + +windows_feature 'IIS-CustomLogging' do + install_method install_method unless install_method.nil? +end diff --git a/recipes/mod_management.rb b/recipes/mod_management.rb index 7bcc9f3f..64f539fd 100644 --- a/recipes/mod_management.rb +++ b/recipes/mod_management.rb @@ -20,7 +20,10 @@ include_recipe 'iis' +install_method = node['iis']['windows_feature_install_method'] + windows_feature %w(IIS-ManagementConsole IIS-ManagementService) do action :install all !IISCookbook::Helper.older_than_windows2012? + install_method install_method unless install_method.nil? end diff --git a/recipes/mod_security.rb b/recipes/mod_security.rb index 959a6c67..52f412fe 100644 --- a/recipes/mod_security.rb +++ b/recipes/mod_security.rb @@ -20,4 +20,8 @@ include_recipe 'iis' -windows_feature %w(IIS-URLAuthorization IIS-RequestFiltering IIS-IPSecurity) +install_method = node['iis']['windows_feature_install_method'] + +windows_feature %w(IIS-URLAuthorization IIS-RequestFiltering IIS-IPSecurity) do + install_method install_method unless install_method.nil? +end diff --git a/recipes/mod_tracing.rb b/recipes/mod_tracing.rb index 6d35b595..e8970bb5 100644 --- a/recipes/mod_tracing.rb +++ b/recipes/mod_tracing.rb @@ -20,4 +20,8 @@ include_recipe 'iis' -windows_feature 'IIS-HttpTracing' +install_method = node['iis']['windows_feature_install_method'] + +windows_feature 'IIS-HttpTracing' do + install_method install_method unless install_method.nil? +end diff --git a/resources/install.rb b/resources/install.rb index 7d6d071e..fffba71d 100644 --- a/resources/install.rb +++ b/resources/install.rb @@ -21,6 +21,7 @@ property :source, String property :additional_components, Array, default: [] +property :install_method, [:windows_feature_dism, :windows_feature_powershell, :windows_feature_servermanagercmd], required: false action :install do features_to_install = ['IIS-WebServerRole'].concat new_resource.additional_components @@ -30,5 +31,6 @@ action :install all !IISCookbook::Helper.older_than_windows2012? source new_resource.source unless new_resource.source.nil? + install_method new_resource.install_method unless new_resource.install_method.nil? end end diff --git a/resources/manager.rb b/resources/manager.rb index cddef217..522b7a3d 100644 --- a/resources/manager.rb +++ b/resources/manager.rb @@ -22,10 +22,12 @@ property :enable_remote_management, [true, false], default: true property :log_directory, String property :port, Integer, default: 8172 +property :install_method, [:windows_feature_dism, :windows_feature_powershell, :windows_feature_servermanagercmd], required: false action :config do iis_install 'Web-Mgmt-Service' do additional_components ['IIS-ManagementService'] + install_method new_resource.install_method end # properties stored in the registry diff --git a/spec/unit/recipes/default_spec.rb b/spec/unit/recipes/default_spec.rb index cf7cdd16..e1f24a58 100644 --- a/spec/unit/recipes/default_spec.rb +++ b/spec/unit/recipes/default_spec.rb @@ -55,4 +55,18 @@ expect(chef_run).to start_service('iis').with(service_name: 'W3SVC') end end + + [:windows_feature_dism, :windows_feature_powershell, :windows_feature_servermanagercmd].each do |method| + context "When iis windows feature install method is provided as #{method}, on a unspecified platform" do + let(:chef_run) do + ChefSpec::SoloRunner.new do |node| + node.override['iis']['windows_feature_install_method'] = method + end.converge(described_recipe) + end + + it "installs windows features using #{method}" do + expect(chef_run).to install_iis_install('install IIS').with(install_method: method) + end + end + end end