From ff97203798719b7369f4d237f2d7e79a65c701b6 Mon Sep 17 00:00:00 2001 From: Max Lincoln Date: Thu, 31 Oct 2013 17:36:26 -0300 Subject: [PATCH 01/14] add config to enable tty workaround --- lib/vagrant-rackspace/config.rb | 8 ++++++++ spec/vagrant-rackspace/config_spec.rb | 5 +++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/lib/vagrant-rackspace/config.rb b/lib/vagrant-rackspace/config.rb index e1aa526..fe39048 100644 --- a/lib/vagrant-rackspace/config.rb +++ b/lib/vagrant-rackspace/config.rb @@ -107,6 +107,7 @@ class Config < Vagrant.plugin("2", :config) # @return [Array] attr_accessor :networks +<<<<<<< HEAD # Opt files/directories in to the rsync operation performed by this provider # # @return [Array] @@ -118,6 +119,11 @@ class Config < Vagrant.plugin("2", :config) # # @return [String] attr_accessor :admin_password +======= + # Whether to apply a workaround to disable the requiretty sudoer option. + # + # @return [Boolean] + attr_accessor :use_tty_workaround # Default Rackspace Cloud Network IDs SERVICE_NET_ID = '11111111-1111-1111-1111-111111111111' @@ -139,6 +145,7 @@ def initialize @disk_config = UNSET_VALUE @networks = [] @rsync_includes = [] + @use_tty_workaround = UNSET_VALUE end def finalize! @@ -157,6 +164,7 @@ def finalize! @disk_config = nil if @disk_config == UNSET_VALUE @networks = nil if @networks.empty? @rsync_includes = nil if @rsync_includes.empty? + @use_tty_workaround = nil if @requiretty == UNSET_VALUE if @public_key_path == UNSET_VALUE @public_key_path = Vagrant.source_root.join("keys/vagrant.pub") diff --git a/spec/vagrant-rackspace/config_spec.rb b/spec/vagrant-rackspace/config_spec.rb index a5f3239..0f9cf43 100644 --- a/spec/vagrant-rackspace/config_spec.rb +++ b/spec/vagrant-rackspace/config_spec.rb @@ -39,7 +39,8 @@ :server_name, :disk_config, :username, - :admin_password].each do |attribute| + :admin_password, + :use_tty_workaround].each do |attribute| it "should not default #{attribute} if overridden" do subject.send("#{attribute}=".to_sym, "foo") subject.finalize! @@ -56,7 +57,7 @@ subject.send(:networks).should include(VagrantPlugins::Rackspace::Config::SERVICE_NET_ID) end - it "should not default rsync_includes if overridden" do + it "should not default rsync_includes if overridden" do inc = "core" subject.send(:rsync_include, inc) subject.finalize! From 8eaa9a65e629bd2fba68647bd0f9421156b2ba1a Mon Sep 17 00:00:00 2001 From: Max Lincoln Date: Thu, 31 Oct 2013 17:38:00 -0300 Subject: [PATCH 02/14] add tty workaround middleware --- lib/vagrant-rackspace/action.rb | 8 +++++ .../action/tty_workaround.rb | 33 +++++++++++++++++++ locales/en.yml | 5 +++ resources/require_tty_workaround.sh | 12 +++++++ 4 files changed, 58 insertions(+) create mode 100644 lib/vagrant-rackspace/action/tty_workaround.rb create mode 100644 resources/require_tty_workaround.sh diff --git a/lib/vagrant-rackspace/action.rb b/lib/vagrant-rackspace/action.rb index 04f71da..8a2d898 100644 --- a/lib/vagrant-rackspace/action.rb +++ b/lib/vagrant-rackspace/action.rb @@ -43,6 +43,9 @@ def self.action_provision end b2.use Provision + + b2.use TTYWorkaround if env[:machine].provider_config.use_tty_workaround + if defined?(SyncedFolders) b2.use SyncedFolders else @@ -113,11 +116,14 @@ def self.action_up b2.use ConnectRackspace b2.use Provision + + b2.use TTYWorkaround if env[:machine].provider_config.use_tty_workaround if defined?(SyncedFolders) b2.use SyncedFolders else b2.use SyncFolders end + b2.use WarnNetworks b2.use CreateServer end end @@ -181,6 +187,8 @@ def self.action_list_keypairs autoload :ListKeyPairs, action_root.join("list_keypairs") autoload :ListNetworks, action_root.join("list_networks") autoload :ListServers, action_root.join("list_servers") + autoload :WarnNetworks, action_root.join("warn_networks") + autoload :TTYWorkaround, action_root.join("tty_workaround") end end end diff --git a/lib/vagrant-rackspace/action/tty_workaround.rb b/lib/vagrant-rackspace/action/tty_workaround.rb new file mode 100644 index 0000000..d2e547b --- /dev/null +++ b/lib/vagrant-rackspace/action/tty_workaround.rb @@ -0,0 +1,33 @@ +require "log4r" +require 'rbconfig' +require "vagrant/util/subprocess" + +module VagrantPlugins + module Rackspace + module Action + # This middleware fixes the sudoers file so it allows sudo without a tty. + class TTYWorkaround + def initialize(app, env) + @app = app + @logger = Log4r::Logger.new("vagrant_rackspace::action::sync_folders") + @host_os = RbConfig::CONFIG['host_os'] + end + + def call(env) + @app.call(env) + ssh_info = env[:machine].ssh_info + + env[:ui].info(I18n.t("vagrant_rackspace.requiretty_workaround")) + fog_ssh = Fog::SSH.new(ssh_info[:host], ssh_info[:username], {:keys => [ssh_info[:private_key_path]]}) + fog_scp = Fog::SCP.new(ssh_info[:host], ssh_info[:username], {:keys => [ssh_info[:private_key_path]]}) + + workaround_script = VagrantPlugins::Rackspace.source_root.join("resources/require_tty_workaround.sh") + + fog_scp.upload(workaround_script.to_s, '/tmp/require_tty_workaround.sh') + results = fog_ssh.run("sudo bash /tmp/require_tty_workaround.sh") + env[:ui].info(results.map(&:stdout)) + end + end + end + end +end diff --git a/locales/en.yml b/locales/en.yml index bbf114f..a61d500 100644 --- a/locales/en.yml +++ b/locales/en.yml @@ -36,11 +36,16 @@ en: Warning! The Rackspace provider doesn't support any of the Vagrant high-level network configurations (`config.vm.network`). They will be silently ignored. +<<<<<<< HEAD will_not_destroy: |- The server will not be deleted. sync_folders: |- Rackspace support for Vagrant 1.3 has been deprecated. Please upgrade to the latest version of vagrant for continued support. +======= + requiretty_workaround: |- + Applying requiretty workaround... +>>>>>>> add tty workaround middleware config: api_key_required: |- diff --git a/resources/require_tty_workaround.sh b/resources/require_tty_workaround.sh new file mode 100644 index 0000000..516ef21 --- /dev/null +++ b/resources/require_tty_workaround.sh @@ -0,0 +1,12 @@ +#!/bin/bash -e + +if grep -q '!requiretty' "/etc/sudoers"; then + echo 'requiretty workaround already applied' +else + cp /etc/sudoers /etc/sudoers.tmp + cp /etc/sudoers /etc/sudoers.orig + echo 'Defaults !requiretty' >> /etc/sudoers.tmp + visudo -c -s -f /etc/sudoers.tmp + cp /etc/sudoers.tmp /etc/sudoers + echo 'requiretty workaround applied' +fi From 94ba99b447751daaa09829b4dc7d0593800d62c3 Mon Sep 17 00:00:00 2001 From: Max Lincoln Date: Thu, 31 Oct 2013 18:03:32 -0300 Subject: [PATCH 03/14] use CentOS as default test --- Vagrantfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Vagrantfile b/Vagrantfile index 5edc089..411776e 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -17,10 +17,11 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| rs.admin_password = ENV['VAGRANT_ADMIN_PASSWORD'] rs.api_key = ENV['RAX_API_KEY'] rs.flavor = /1 GB Performance/ - rs.image = /Ubuntu/ + rs.image = "CentOS 6.4" rs.rackspace_region = :iad # rs.rsync_include 'PATTERN' # per man page for rsync + rs.use_tty_workaround = true end # The url from where the 'config.vm.box' box will be fetched if it # doesn't already exist on the user's system. From a6798ecf00f7d820900c12c8c3dd2d3db82e3631 Mon Sep 17 00:00:00 2001 From: Max Lincoln Date: Thu, 31 Oct 2013 18:11:14 -0300 Subject: [PATCH 04/14] checking for true looks redundant, but right now UNSET_VALUE is causing it to run --- lib/vagrant-rackspace/action.rb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/vagrant-rackspace/action.rb b/lib/vagrant-rackspace/action.rb index 8a2d898..096dea1 100644 --- a/lib/vagrant-rackspace/action.rb +++ b/lib/vagrant-rackspace/action.rb @@ -44,13 +44,15 @@ def self.action_provision b2.use Provision - b2.use TTYWorkaround if env[:machine].provider_config.use_tty_workaround + b2.use TTYWorkaround if env[:machine].provider_config.use_tty_workaround == true if defined?(SyncedFolders) b2.use SyncedFolders else b2.use SyncFolders end + b2.use SyncFolders + end end end @@ -117,7 +119,7 @@ def self.action_up b2.use ConnectRackspace b2.use Provision - b2.use TTYWorkaround if env[:machine].provider_config.use_tty_workaround + b2.use TTYWorkaround if env[:machine].provider_config.use_tty_workaround == true if defined?(SyncedFolders) b2.use SyncedFolders else From 3bfea839c20b40eb80131713027752b7bc5b137f Mon Sep 17 00:00:00 2001 From: Max Lincoln Date: Mon, 11 Nov 2013 14:46:01 -0300 Subject: [PATCH 05/14] Update with @hawknewton's suggestion --- lib/vagrant-rackspace/action/tty_workaround.rb | 5 ++++- resources/require_tty_workaround.sh | 11 +---------- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/lib/vagrant-rackspace/action/tty_workaround.rb b/lib/vagrant-rackspace/action/tty_workaround.rb index d2e547b..981891f 100644 --- a/lib/vagrant-rackspace/action/tty_workaround.rb +++ b/lib/vagrant-rackspace/action/tty_workaround.rb @@ -25,7 +25,10 @@ def call(env) fog_scp.upload(workaround_script.to_s, '/tmp/require_tty_workaround.sh') results = fog_ssh.run("sudo bash /tmp/require_tty_workaround.sh") - env[:ui].info(results.map(&:stdout)) + stdout = results.map(&:stdout).join("\n") + stderr = results.map(&:stderr).join("\n") + env[:ui].info(stdout) unless stdout.empty? + env[:ui].error(stderr) unless stderr.empty? end end end diff --git a/resources/require_tty_workaround.sh b/resources/require_tty_workaround.sh index 516ef21..6333912 100644 --- a/resources/require_tty_workaround.sh +++ b/resources/require_tty_workaround.sh @@ -1,12 +1,3 @@ #!/bin/bash -e -if grep -q '!requiretty' "/etc/sudoers"; then - echo 'requiretty workaround already applied' -else - cp /etc/sudoers /etc/sudoers.tmp - cp /etc/sudoers /etc/sudoers.orig - echo 'Defaults !requiretty' >> /etc/sudoers.tmp - visudo -c -s -f /etc/sudoers.tmp - cp /etc/sudoers.tmp /etc/sudoers - echo 'requiretty workaround applied' -fi +sed -i'.bk' -e 's/^\(Defaults\s\+requiretty\)/# \1/' /etc/sudoers From 1fd6fb60ac4741cc1187b1323582ecc8bbfc446a Mon Sep 17 00:00:00 2001 From: Peter Souter Date: Fri, 25 Jul 2014 00:14:15 +0100 Subject: [PATCH 06/14] Removing merge commit issues --- lib/vagrant-rackspace/config.rb | 4 ++-- locales/en.yml | 5 +---- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/lib/vagrant-rackspace/config.rb b/lib/vagrant-rackspace/config.rb index fe39048..19fa2b2 100644 --- a/lib/vagrant-rackspace/config.rb +++ b/lib/vagrant-rackspace/config.rb @@ -107,7 +107,7 @@ class Config < Vagrant.plugin("2", :config) # @return [Array] attr_accessor :networks -<<<<<<< HEAD + # Opt files/directories in to the rsync operation performed by this provider # # @return [Array] @@ -119,7 +119,7 @@ class Config < Vagrant.plugin("2", :config) # # @return [String] attr_accessor :admin_password -======= + # Whether to apply a workaround to disable the requiretty sudoer option. # # @return [Boolean] diff --git a/locales/en.yml b/locales/en.yml index a61d500..8152cef 100644 --- a/locales/en.yml +++ b/locales/en.yml @@ -36,16 +36,13 @@ en: Warning! The Rackspace provider doesn't support any of the Vagrant high-level network configurations (`config.vm.network`). They will be silently ignored. -<<<<<<< HEAD will_not_destroy: |- The server will not be deleted. sync_folders: |- Rackspace support for Vagrant 1.3 has been deprecated. Please - upgrade to the latest version of vagrant for continued support. -======= + upgrade to the latest version of vagrant for continued support. requiretty_workaround: |- Applying requiretty workaround... ->>>>>>> add tty workaround middleware config: api_key_required: |- From fce6ee517522979a46d7ba407cc2ea4f0efccb70 Mon Sep 17 00:00:00 2001 From: Peter Souter Date: Fri, 25 Jul 2014 00:25:28 +0100 Subject: [PATCH 07/14] Fog SSH settings have changed since committed... Kept getting ``` /Users/peterso/Projects/vagrant-rackspace/lib/vagrant-rackspace/action/pre_provision_script.rb:25:in `read': no implicit conversion of Array into String (TypeError) from /Users/peterso/Projects/vagrant-rackspace/lib/vagrant-rackspace/action/pre_provision_script.rb:25:in `call' from /opt/rubies/2.0.0-p451/lib/ruby/gems/2.0.0/bundler/gems/vagrant-efd1d5e11bfc/lib/vagrant/action/warden.rb:34:in `call' ``` --- lib/vagrant-rackspace/action/tty_workaround.rb | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/vagrant-rackspace/action/tty_workaround.rb b/lib/vagrant-rackspace/action/tty_workaround.rb index 981891f..eee03c7 100644 --- a/lib/vagrant-rackspace/action/tty_workaround.rb +++ b/lib/vagrant-rackspace/action/tty_workaround.rb @@ -18,8 +18,11 @@ def call(env) ssh_info = env[:machine].ssh_info env[:ui].info(I18n.t("vagrant_rackspace.requiretty_workaround")) - fog_ssh = Fog::SSH.new(ssh_info[:host], ssh_info[:username], {:keys => [ssh_info[:private_key_path]]}) - fog_scp = Fog::SCP.new(ssh_info[:host], ssh_info[:username], {:keys => [ssh_info[:private_key_path]]}) + + key_options = {} + key_options[:key_data] = IO.read(ssh_info[:private_key_path].first) + fog_ssh = Fog::SSH.new(ssh_info[:host], ssh_info[:username], key_options) + fog_scp = Fog::SCP.new(ssh_info[:host], ssh_info[:username], key_options) workaround_script = VagrantPlugins::Rackspace.source_root.join("resources/require_tty_workaround.sh") From e30e546b38e238545dd2682c4475a813a92d2e3c Mon Sep 17 00:00:00 2001 From: Peter Souter Date: Fri, 25 Jul 2014 00:27:29 +0100 Subject: [PATCH 08/14] Removing merge commit accidental commits --- lib/vagrant-rackspace/action.rb | 3 --- 1 file changed, 3 deletions(-) diff --git a/lib/vagrant-rackspace/action.rb b/lib/vagrant-rackspace/action.rb index 096dea1..84adbbe 100644 --- a/lib/vagrant-rackspace/action.rb +++ b/lib/vagrant-rackspace/action.rb @@ -51,7 +51,6 @@ def self.action_provision else b2.use SyncFolders end - b2.use SyncFolders end end @@ -125,7 +124,6 @@ def self.action_up else b2.use SyncFolders end - b2.use WarnNetworks b2.use CreateServer end end @@ -189,7 +187,6 @@ def self.action_list_keypairs autoload :ListKeyPairs, action_root.join("list_keypairs") autoload :ListNetworks, action_root.join("list_networks") autoload :ListServers, action_root.join("list_servers") - autoload :WarnNetworks, action_root.join("warn_networks") autoload :TTYWorkaround, action_root.join("tty_workaround") end end From 114683cc48fa75badcb077035a64671ccf690713 Mon Sep 17 00:00:00 2001 From: Peter Souter Date: Wed, 30 Jul 2014 15:58:36 +0100 Subject: [PATCH 09/14] Now switched to using standard machine communicate As Vagrant now uses tty for it's sudo commands, we don't have to fudge it with fog! :+1: --- lib/vagrant-rackspace/action/tty_workaround.rb | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/lib/vagrant-rackspace/action/tty_workaround.rb b/lib/vagrant-rackspace/action/tty_workaround.rb index eee03c7..3be3eac 100644 --- a/lib/vagrant-rackspace/action/tty_workaround.rb +++ b/lib/vagrant-rackspace/action/tty_workaround.rb @@ -15,23 +15,7 @@ def initialize(app, env) def call(env) @app.call(env) - ssh_info = env[:machine].ssh_info - - env[:ui].info(I18n.t("vagrant_rackspace.requiretty_workaround")) - - key_options = {} - key_options[:key_data] = IO.read(ssh_info[:private_key_path].first) - fog_ssh = Fog::SSH.new(ssh_info[:host], ssh_info[:username], key_options) - fog_scp = Fog::SCP.new(ssh_info[:host], ssh_info[:username], key_options) - - workaround_script = VagrantPlugins::Rackspace.source_root.join("resources/require_tty_workaround.sh") - - fog_scp.upload(workaround_script.to_s, '/tmp/require_tty_workaround.sh') - results = fog_ssh.run("sudo bash /tmp/require_tty_workaround.sh") - stdout = results.map(&:stdout).join("\n") - stderr = results.map(&:stderr).join("\n") - env[:ui].info(stdout) unless stdout.empty? - env[:ui].error(stderr) unless stderr.empty? + env[:machine].communicate.sudo "sed -i'.bk' -e 's/^\(Defaults\s\+requiretty\)/# \1/' /etc/sudoers" end end end From 71c4844f0e29b8ea34685ca03cee1243b2da7972 Mon Sep 17 00:00:00 2001 From: Peter Souter Date: Wed, 30 Jul 2014 16:49:00 +0100 Subject: [PATCH 10/14] No longer need the defined shell script --- resources/require_tty_workaround.sh | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 resources/require_tty_workaround.sh diff --git a/resources/require_tty_workaround.sh b/resources/require_tty_workaround.sh deleted file mode 100644 index 6333912..0000000 --- a/resources/require_tty_workaround.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -e - -sed -i'.bk' -e 's/^\(Defaults\s\+requiretty\)/# \1/' /etc/sudoers From 10e948ac5ea8438e01e9bb65e0656e68dad49918 Mon Sep 17 00:00:00 2001 From: Peter Souter Date: Wed, 30 Jul 2014 16:51:20 +0100 Subject: [PATCH 11/14] Change double to single quotes --- lib/vagrant-rackspace/action/tty_workaround.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/vagrant-rackspace/action/tty_workaround.rb b/lib/vagrant-rackspace/action/tty_workaround.rb index 3be3eac..5ae9a28 100644 --- a/lib/vagrant-rackspace/action/tty_workaround.rb +++ b/lib/vagrant-rackspace/action/tty_workaround.rb @@ -1,6 +1,6 @@ -require "log4r" +require 'log4r' require 'rbconfig' -require "vagrant/util/subprocess" +require 'vagrant/util/subprocess' module VagrantPlugins module Rackspace From 657b388f6f4cf3a6399520c1666cb28195ffa048 Mon Sep 17 00:00:00 2001 From: Peter Souter Date: Wed, 30 Jul 2014 16:51:52 +0100 Subject: [PATCH 12/14] Changed to single quotes for command Issues with double quotes creating weird escapes --- lib/vagrant-rackspace/action/tty_workaround.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/vagrant-rackspace/action/tty_workaround.rb b/lib/vagrant-rackspace/action/tty_workaround.rb index 5ae9a28..d43520b 100644 --- a/lib/vagrant-rackspace/action/tty_workaround.rb +++ b/lib/vagrant-rackspace/action/tty_workaround.rb @@ -15,7 +15,7 @@ def initialize(app, env) def call(env) @app.call(env) - env[:machine].communicate.sudo "sed -i'.bk' -e 's/^\(Defaults\s\+requiretty\)/# \1/' /etc/sudoers" + env[:machine].communicate.sudo 'sed -i\'.bk\' -e \'s/^\(Defaults\s\+requiretty\)/# \1/\' /etc/sudoers' end end end From e20fdea14cbe2b2d45d36e5fa1d7e073c83f6165 Mon Sep 17 00:00:00 2001 From: Peter Souter Date: Wed, 30 Jul 2014 16:52:07 +0100 Subject: [PATCH 13/14] Adding log output for provisioner run --- lib/vagrant-rackspace/action/tty_workaround.rb | 4 +++- locales/en.yml | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/vagrant-rackspace/action/tty_workaround.rb b/lib/vagrant-rackspace/action/tty_workaround.rb index d43520b..56816b9 100644 --- a/lib/vagrant-rackspace/action/tty_workaround.rb +++ b/lib/vagrant-rackspace/action/tty_workaround.rb @@ -9,13 +9,15 @@ module Action class TTYWorkaround def initialize(app, env) @app = app - @logger = Log4r::Logger.new("vagrant_rackspace::action::sync_folders") + @logger = Log4r::Logger.new("vagrant_rackspace::action::requiretty_workaround_start") @host_os = RbConfig::CONFIG['host_os'] end def call(env) @app.call(env) + env[:ui].info(I18n.t("vagrant_rackspace.requiretty_workaround_start")) env[:machine].communicate.sudo 'sed -i\'.bk\' -e \'s/^\(Defaults\s\+requiretty\)/# \1/\' /etc/sudoers' + env[:ui].info(I18n.t("vagrant_rackspace.requiretty_workaround_end")) end end end diff --git a/locales/en.yml b/locales/en.yml index 8152cef..06dc49e 100644 --- a/locales/en.yml +++ b/locales/en.yml @@ -41,8 +41,10 @@ en: sync_folders: |- Rackspace support for Vagrant 1.3 has been deprecated. Please upgrade to the latest version of vagrant for continued support. - requiretty_workaround: |- + requiretty_workaround_start: |- Applying requiretty workaround... + requiretty_workaround_end: |- + requiretty workaround complete! config: api_key_required: |- From 34a1c0264d5e263b462ae8841fe5ca2fe393b7da Mon Sep 17 00:00:00 2001 From: Peter Souter Date: Wed, 30 Jul 2014 17:08:18 +0100 Subject: [PATCH 14/14] Make sure requiretty fix happens before rsync Otherwise rsync will fail! --- lib/vagrant-rackspace/plugin.rb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/vagrant-rackspace/plugin.rb b/lib/vagrant-rackspace/plugin.rb index e40b6b3..383b5ed 100644 --- a/lib/vagrant-rackspace/plugin.rb +++ b/lib/vagrant-rackspace/plugin.rb @@ -18,6 +18,11 @@ class Plugin < Vagrant.plugin("2") This plugin enables Vagrant to manage machines in RackSpace Cloud. DESC + action_hook(:tty_workaround, Plugin::ALL_ACTIONS) do |hook| + require_relative 'action/tty_workaround' + hook.after(Vagrant::Action::Builtin::SyncedFolders, Action::TTYWorkaround) + end + config(:rackspace, :provider) do require_relative "config" Config