ridley-connectors 2.0.0 → 2.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ec5f842e1868650e1d3b96151cdf19bce5e14b3b
4
- data.tar.gz: 4222c806d597445c86f262e12939b2c656e017ff
3
+ metadata.gz: 7cc8a35d12c2f0a211941000d82e951c738d1f0b
4
+ data.tar.gz: 8793248c34607319be63abfbab2f0b5831f6ef2a
5
5
  SHA512:
6
- metadata.gz: 652cd749bfc96324c766e62742b2c58c80d7256958de9a8a1005834b5365c8ea0159139305f7b53e5dfe0ff283095432555b791001f48e4e05361712e4041943
7
- data.tar.gz: 53b528565d08da8ef009f60aad90083020bcf13ce81dfe0c6f48bb402c34782f92d144bf373f01b8d682e53e5f8f5931fc5de099bb3bf44ab09125ce4b1e5ea5
6
+ metadata.gz: b6c08b024e392d443a050676e690e591342973c6fb105b4961f904cf2b1937eff4f2516751d6a2ad9d292ae58bbb2afc1456c675dc8d736e8d7b75aeae9813ac
7
+ data.tar.gz: 74a3bba5e041055a7b2cfc02c38aff93132feeed3cbe4144d29f19f6c43c1897e9b9576f1a629339379aa01550d10d86673c5c3137a1a48d438dacde9f3a3919
data/CHANGELOG.md CHANGED
@@ -1,3 +1,13 @@
1
+ ## v.2.0.1
2
+
3
+ * [#18](https://github.com/RiotGames/ridley-connectors/pull/18) Move more connector-specific code out of ridley and into ridley-connectors
4
+ * [#19](https://github.com/RiotGames/ridley-connectors/pull/19) Add some extra logging to retrying connections to choose an appropriate connector
5
+ * [#20](https://github.com/RiotGames/ridley-connectors/pull/20) Handle HostCommander, WinRM, and SSH actor crashes better
6
+
7
+ ## v.2.0.0
8
+
9
+ * [#17](https://github.com/RiotGames/ridley-connectors/pull/17) Bump ridley dependency to 3.0.0
10
+
1
11
  ## v.1.7.1
2
12
 
3
13
  * [#16](https://github.com/RiotGames/ridley-connectors/pull/16) JRuby throws different exceptions when it can't connect to a node
@@ -0,0 +1,91 @@
1
+ bash -c '
2
+ <%= "export http_proxy=\"#{bootstrap_proxy}\"" if bootstrap_proxy -%>
3
+
4
+ exists() {
5
+ if command -v $1 &>/dev/null
6
+ then
7
+ return 0
8
+ else
9
+ return 1
10
+ fi
11
+ }
12
+
13
+ install_chef() {
14
+ install_sh="http://opscode.com/chef/install.sh"
15
+ proxy_string="<%= "--proxy=on " if bootstrap_proxy %>"
16
+
17
+ if [[ $requested_chef_version != "" ]]; then
18
+ version_string="-v $requested_chef_version"
19
+ else
20
+ version_string=""
21
+ fi
22
+
23
+ if exists wget; then
24
+ bash <(wget ${proxy_string} ${install_sh} -O -) ${version_string}
25
+ else
26
+ if exists curl; then
27
+ bash <(curl -L ${proxy_string} ${install_sh}) ${version_string}
28
+ fi
29
+ fi
30
+ }
31
+
32
+ requested_chef_version="<%= chef_version %>"
33
+ installed_chef_version="$(which chef-client &>/dev/null && chef-client -v | cut -f 2 -d " ")"
34
+
35
+ if [[ ! $installed_chef_version ]]; then
36
+ install_chef
37
+ elif [[ ($requested_chef_version != "") && ($installed_chef_version != $requested_chef_version) ]]; then
38
+ install_chef
39
+ fi
40
+
41
+ mkdir -p /etc/chef
42
+
43
+ (
44
+ cat <<'EOP'
45
+ <%= validation_key %>
46
+ EOP
47
+ ) > /tmp/validation.pem
48
+ awk NF /tmp/validation.pem > /etc/chef/validation.pem
49
+ rm /tmp/validation.pem
50
+ chmod 0600 /etc/chef/validation.pem
51
+
52
+ <% if encrypted_data_bag_secret -%>
53
+ (
54
+ cat <<'EOP'
55
+ <%= encrypted_data_bag_secret %>
56
+ EOP
57
+ ) > /tmp/encrypted_data_bag_secret
58
+ awk NF /tmp/encrypted_data_bag_secret > /etc/chef/encrypted_data_bag_secret
59
+ rm /tmp/encrypted_data_bag_secret
60
+ chmod 0600 /etc/chef/encrypted_data_bag_secret
61
+ <% end -%>
62
+
63
+ <%# Generate Ohai Hints -%>
64
+ <% unless hints.empty? -%>
65
+ mkdir -p /etc/chef/ohai/hints
66
+
67
+ <% hints.each do |name, hash| -%>
68
+ (
69
+ cat <<'EOP'
70
+ <%= hash.to_json %>
71
+ EOP
72
+ ) > /etc/chef/ohai/hints/<%= name %>.json
73
+ <% end -%>
74
+ <% end -%>
75
+
76
+ (
77
+ cat <<'EOP'
78
+ <%= chef_config %>
79
+ EOP
80
+ ) > /etc/chef/client.rb
81
+
82
+ <%# Remove client pem if it already exists -%>
83
+ rm /etc/chef/client.pem
84
+
85
+ (
86
+ cat <<'EOP'
87
+ <%= first_boot %>
88
+ EOP
89
+ ) > /etc/chef/first-boot.json
90
+
91
+ <%= chef_run %>'
@@ -0,0 +1,113 @@
1
+ @echo off
2
+
3
+ rem Author:: Kyle Allan (<kallan@riotgames.com>)
4
+ rem Original Author:
5
+ rem
6
+ rem Author:: Seth Chisamore (<schisam@oopscode.com>)
7
+ rem Copyright:: Copyright (c) 2011 Opscode, Inc.
8
+ rem License:: Apache License, Version 2.0
9
+ rem
10
+ rem Licensed under the Apache License, Version 2.0 (the "License");
11
+ rem you may not use this file except in compliance with the License.
12
+ rem You may obtain a copy of the License at
13
+ rem
14
+ rem http://www.apache.org/licenses/LICENSE-2.0
15
+ rem
16
+ rem Unless required by applicable law or agreed to in writing, software
17
+ rem distributed under the License is distributed on an "AS IS" BASIS,
18
+ rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19
+ rem See the License for the specific language governing permissions and
20
+ rem limitations under the License.
21
+ rem
22
+
23
+ setlocal
24
+
25
+ <%= "SETX HTTP_PROXY \"#{bootstrap_proxy}\"" if bootstrap_proxy %>
26
+ mkdir <%= bootstrap_directory %>
27
+
28
+ > <%= bootstrap_directory %>\wget.ps1 (
29
+ <%= windows_wget_powershell %>
30
+ )
31
+
32
+ rem Determine the version and the architecture
33
+
34
+ FOR /F "tokens=1-8 delims=.[] " %%A IN ('ver') DO (
35
+ set WinMajor=%%D
36
+ set WinMinor=%%E
37
+ set WinBuild=%%F
38
+ )
39
+
40
+ goto Version%WinMajor%.%WinMinor%
41
+
42
+ rem If this is an unknown version of windows set the default
43
+ set MACHINE_OS=2008r2
44
+ goto architecture
45
+
46
+ :Version6.0
47
+ set MACHINE_OS=2008
48
+ goto architecture
49
+
50
+ :Version5.2
51
+ set MACHINE_OS=2003r2
52
+ goto architecture
53
+
54
+ :Version6.1
55
+ set MACHINE_OS=2008r2
56
+ goto architecture
57
+
58
+ :Version6.2
59
+ set MACHINE_OS=2012
60
+ goto architecture
61
+
62
+ :architecture
63
+
64
+ goto Architecture%PROCESSOR_ARCHITECTURE%
65
+
66
+ rem If this is an unknown architecture set the default
67
+ set MACHINE_ARCH=i686
68
+ goto install
69
+
70
+ :Architecturex86
71
+ set MACHINE_ARCH=i686
72
+ goto install
73
+
74
+ :Architectureamd64
75
+ set MACHINE_ARCH=x86_64
76
+ goto install
77
+
78
+ :install
79
+ rem Install Chef using chef-client MSI installer
80
+
81
+ set "VERSION_STRING=<%= chef_version %>"
82
+ set "REMOTE_SOURCE_MSI_URL=https://www.opscode.com/chef/download?p=windows&pv=%MACHINE_OS%&m=%MACHINE_ARCH%&v=%VERSION_STRING%"
83
+ set "LOCAL_DESTINATION_MSI_PATH=<%= local_download_path %>"
84
+ set "FALLBACK_QUERY_STRING=&DownloadContext=PowerShell"
85
+
86
+ powershell -ExecutionPolicy Unrestricted -NoProfile -NonInteractive "& '<%= bootstrap_directory %>\wget.ps1' '%REMOTE_SOURCE_MSI_URL%%FALLBACK_QUERY_STRING%' '%LOCAL_DESTINATION_MSI_PATH%'"
87
+
88
+ <%= install_chef %>
89
+
90
+ endlocal
91
+
92
+ > <%= bootstrap_directory %>\validation.pem (
93
+ <%= validation_key %>
94
+ )
95
+
96
+ <% if encrypted_data_bag_secret -%>
97
+ > <%= bootstrap_directory %>\encrypted_data_bag_secret (
98
+ <%= encrypted_data_bag_secret %>
99
+ )
100
+ <% end -%>
101
+
102
+ > <%= bootstrap_directory %>\client.rb (
103
+ <%= chef_config %>
104
+ )
105
+
106
+ > <%= bootstrap_directory %>\first-boot.json (
107
+ <%= first_boot %>
108
+ )
109
+
110
+ SET "PATH=%PATH%;<%= env_path %>"
111
+ SETX PATH "%PATH;<%= env_path %>"
112
+
113
+ <%= chef_run %>
@@ -3,9 +3,19 @@ require 'celluloid/io'
3
3
  require 'ridley'
4
4
 
5
5
  module Ridley
6
+ class << self
7
+ # @return [Pathname]
8
+ def scripts
9
+ root.join('scripts')
10
+ end
11
+ end
12
+
6
13
  require_relative 'ridley-connectors/client'
14
+ require_relative 'ridley-connectors/bootstrap_context'
15
+ require_relative 'ridley-connectors/command_context'
7
16
  require_relative 'ridley-connectors/host_commander'
8
17
  require_relative 'ridley-connectors/host_connector'
9
18
  require_relative 'ridley-connectors/chef_objects/node_object'
10
19
  require_relative 'ridley-connectors/resources/node_resource'
20
+ require_relative 'ridley-connectors/errors'
11
21
  end
@@ -0,0 +1,100 @@
1
+ require 'erubis'
2
+
3
+ module Ridley
4
+ module BootstrapContext
5
+ class Base
6
+ class << self
7
+ def validate_options(options = {})
8
+ if options[:server_url].nil?
9
+ raise Errors::ArgumentError, "A server_url is required for bootstrapping"
10
+ end
11
+
12
+ if options[:validator_path].nil?
13
+ raise Errors::ArgumentError, "A path to a validator is required for bootstrapping"
14
+ end
15
+ end
16
+ end
17
+
18
+ attr_reader :template_file
19
+ attr_reader :bootstrap_proxy
20
+ attr_reader :chef_version
21
+ attr_reader :validator_path
22
+ attr_reader :encrypted_data_bag_secret
23
+ attr_reader :server_url
24
+ attr_reader :validator_client
25
+ attr_reader :node_name
26
+ attr_reader :attributes
27
+ attr_reader :run_list
28
+ attr_reader :environment
29
+ attr_reader :hints
30
+
31
+ def initialize(options = {})
32
+ options = options.reverse_merge(
33
+ validator_client: "chef-validator",
34
+ attributes: Hash.new,
35
+ run_list: Array.new,
36
+ environment: "_default",
37
+ sudo: true,
38
+ hints: Hash.new,
39
+ chef_version: "latest"
40
+ )
41
+ options[:template] ||= default_template
42
+ self.class.validate_options(options)
43
+
44
+ @template_file = options[:template]
45
+ @bootstrap_proxy = options[:bootstrap_proxy]
46
+ @chef_version = options[:chef_version]
47
+ @sudo = options[:sudo]
48
+ @validator_path = options[:validator_path]
49
+ @encrypted_data_bag_secret = options[:encrypted_data_bag_secret]
50
+ @hints = options[:hints]
51
+ @server_url = options[:server_url]
52
+ @validator_client = options[:validator_client]
53
+ @node_name = options[:node_name]
54
+ @attributes = options[:attributes]
55
+ @run_list = options[:run_list]
56
+ @environment = options[:environment]
57
+ end
58
+
59
+ # @return [String]
60
+ def bootstrap_command
61
+ raise RuntimeError, "abstract function: must be implemented on includer"
62
+ end
63
+
64
+ # @return [String]
65
+ def default_template
66
+ raise RuntimeError, "abstract function: must be implemented on includer"
67
+ end
68
+
69
+ # @return [Pathname]
70
+ def templates_path
71
+ Ridley.root.join('bootstrappers')
72
+ end
73
+
74
+ # @return [String]
75
+ def first_boot
76
+ JSON.fast_generate(attributes.merge(run_list: run_list))
77
+ end
78
+
79
+ # The validation key to create a new client for the node
80
+ #
81
+ # @raise [Ridley::Errors::ValidatorNotFound]
82
+ #
83
+ # @return [String]
84
+ def validation_key
85
+ IO.read(File.expand_path(validator_path)).chomp
86
+ rescue Errno::ENOENT
87
+ raise Errors::ValidatorNotFound, "Error bootstrapping: Validator not found at '#{validator_path}'"
88
+ end
89
+
90
+ # @return [Erubis::Eruby]
91
+ def template
92
+ Erubis::Eruby.new(IO.read(template_file).chomp)
93
+ end
94
+ end
95
+ end
96
+ end
97
+
98
+ Dir["#{File.dirname(__FILE__)}/bootstrap_context/*.rb"].sort.each do |path|
99
+ require_relative "bootstrap_context/#{File.basename(path, '.rb')}"
100
+ end
@@ -0,0 +1,66 @@
1
+ module Ridley
2
+ module BootstrapContext
3
+ # Represents a binding that will be evaluated as an ERB template. When bootstrapping
4
+ # nodes, an instance of this class represents the customizable and necessary configurations
5
+ # needed by the Host in order to install and connect to Chef. By default, this class will be used
6
+ # when SSH is the best way to connect to the node.
7
+ class Unix < BootstrapContext::Base
8
+ attr_reader :sudo
9
+
10
+ # @option options [Boolean] :sudo (true)
11
+ # bootstrap with sudo (default: true)
12
+ def initialize(options = {})
13
+ options = options.reverse_merge(sudo: true)
14
+ @sudo = options[:sudo]
15
+ super(options)
16
+ end
17
+
18
+ # @return [String]
19
+ def boot_command
20
+ template.evaluate(self)
21
+ end
22
+
23
+ # @return [String]
24
+ def chef_config
25
+ body = <<-CONFIG
26
+ log_level :info
27
+ log_location STDOUT
28
+ chef_server_url "#{server_url}"
29
+ validation_client_name "#{validator_client}"
30
+ CONFIG
31
+
32
+ if node_name.present?
33
+ body << %Q{node_name "#{node_name}"\n}
34
+ else
35
+ body << "# Using default node name (fqdn)\n"
36
+ end
37
+
38
+ if bootstrap_proxy.present?
39
+ body << %Q{http_proxy "#{bootstrap_proxy}"\n}
40
+ body << %Q{https_proxy "#{bootstrap_proxy}"\n}
41
+ end
42
+
43
+ if encrypted_data_bag_secret.present?
44
+ body << %Q{encrypted_data_bag_secret "#{bootstrap_directory}/encrypted_data_bag_secret"\n}
45
+ end
46
+
47
+ body
48
+ end
49
+
50
+ # @return [String]
51
+ def bootstrap_directory
52
+ "/etc/chef"
53
+ end
54
+
55
+ # @return [String]
56
+ def chef_run
57
+ "chef-client -j #{bootstrap_directory}/first-boot.json -E #{environment}"
58
+ end
59
+
60
+ # @return [String]
61
+ def default_template
62
+ templates_path.join('unix_omnibus.erb').to_s
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,118 @@
1
+ module Ridley
2
+ module BootstrapContext
3
+ # Represents a binding that will be evaluated as an ERB template. When bootstrapping
4
+ # nodes, an instance of this class represents the customizable and necessary configurations
5
+ # needed by the Host in order to install and connect to Chef. By default, this class will be used
6
+ # when WinRM is the best way to connect to the node.
7
+ #
8
+ # Windows Specific code written by Seth Chisamore (<schisamo@opscode.com>) in knife-windows
9
+ # https://github.com/opscode/knife-windows/blob/3b8886ddcfb928ca0958cd05b22f8c3d78bee86e/lib/chef/knife/bootstrap/windows-chef-client-msi.erb
10
+ # https://github.com/opscode/knife-windows/blob/78d38bbed358ac20107fc2b5b427f4b5e52e5cb2/lib/chef/knife/core/windows_bootstrap_context.rb
11
+ class Windows < BootstrapContext::Base
12
+ # @return [String]
13
+ def boot_command
14
+ template.evaluate(self)
15
+ end
16
+
17
+ # @return [String]
18
+ def chef_config
19
+ body = <<-CONFIG
20
+ log_level :info
21
+ log_location STDOUT
22
+ chef_server_url "#{server_url}"
23
+ validation_client_name "#{validator_client}"
24
+ CONFIG
25
+
26
+ if node_name.present?
27
+ body << %Q{node_name "#{node_name}"\n}
28
+ else
29
+ body << "# Using default node name (fqdn)\n"
30
+ end
31
+
32
+ if bootstrap_proxy.present?
33
+ body << %Q{http_proxy "#{bootstrap_proxy}"\n}
34
+ body << %Q{https_proxy "#{bootstrap_proxy}"\n}
35
+ end
36
+
37
+ if encrypted_data_bag_secret.present?
38
+ body << %Q{encrypted_data_bag_secret '#{bootstrap_directory}\\encrypted_data_bag_secret'\n}
39
+ end
40
+
41
+ escape_and_echo(body)
42
+ end
43
+
44
+ # @return [String]
45
+ def bootstrap_directory
46
+ "C:\\chef"
47
+ end
48
+
49
+ # @return [String]
50
+ def validation_key
51
+ escape_and_echo(super)
52
+ end
53
+
54
+ # @return [String]
55
+ def chef_run
56
+ "chef-client -j #{bootstrap_directory}\\first-boot.json -E #{environment}"
57
+ end
58
+
59
+ # @return [String]
60
+ def default_template
61
+ templates_path.join('windows_omnibus.erb').to_s
62
+ end
63
+
64
+ # @return [String]
65
+ def encrypted_data_bag_secret
66
+ return unless @encrypted_data_bag_secret
67
+
68
+ escape_and_echo(@encrypted_data_bag_secret)
69
+ end
70
+
71
+ # Implements a Powershell script that attempts a simple
72
+ # 'wget' to download the Chef msi
73
+ #
74
+ # @return [String]
75
+ def windows_wget_powershell
76
+ win_wget_ps = <<-WGET_PS
77
+ param(
78
+ [String] $remoteUrl,
79
+ [String] $localPath
80
+ )
81
+
82
+ $webClient = new-object System.Net.WebClient;
83
+
84
+ $webClient.DownloadFile($remoteUrl, $localPath);
85
+ WGET_PS
86
+
87
+ escape_and_echo(win_wget_ps)
88
+ end
89
+
90
+ # @return [String]
91
+ def install_chef
92
+ 'msiexec /qb /i "%LOCAL_DESTINATION_MSI_PATH%"'
93
+ end
94
+
95
+ # @return [String]
96
+ def first_boot
97
+ escape_and_echo(super)
98
+ end
99
+
100
+ # @return [String]
101
+ def env_path
102
+ "C:\\opscode\\chef\\bin;C:\\opscode\\chef\\embedded\\bin"
103
+ end
104
+
105
+ # @return [String]
106
+ def local_download_path
107
+ "%TEMP%\\chef-client-#{chef_version}.msi"
108
+ end
109
+
110
+ # escape WIN BATCH special chars
111
+ # and prefixes each line with an
112
+ # echo
113
+ def escape_and_echo(file_contents)
114
+ file_contents.gsub(/^(.*)$/, 'echo.\1').gsub(/([(<|>)^])/, '^\1')
115
+ end
116
+ end
117
+ end
118
+ end