dopi 0.17.0 → 0.18.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a250c86a6a53a6e1d95ad9d7cc1c1a63e32732df
4
- data.tar.gz: 3032c907c32e61940080942da31597fa2bc193c8
3
+ metadata.gz: 76172f4760eaf3ed0a244457346f69b44901e51a
4
+ data.tar.gz: 22e167ba7260b906a39cd3114056b8b6b2f6c5c0
5
5
  SHA512:
6
- metadata.gz: 582a10a26ae4ccf6f342ea2c09a1e7fcbc0f4d191651f65c33660b73cf32fdfa71183a82916e8ddeedf848505ffb17f5d032cde86c6c21e4535c79191b7e9b36
7
- data.tar.gz: 26f061bea1eb6c87f1f04a65939218bf09353253b7e098f24d3fec55d708a642200067fa175194f806f594318b1f6049ef0b75eec6ac9ba4665f99ec07a7cbc3
6
+ metadata.gz: e3b32d4ab26d002dc7d6bf90ec174dd6ed39682000919e4d6cdf6024968cc419e6df7563e5cc9590cbc1cdc0680dcb7f697f720f2285e47cd859329f845e0742
7
+ data.tar.gz: d18f82635f8fe8097b5ef3cb6b7393d0054c12a01bc390ee5c84d4177d5deb2490f95fa83bb8224d5af78faeb5b7d9c50c808b73210e35b01668b7b68c544a0c
@@ -1,6 +1,19 @@
1
1
  # Change Log
2
2
  All notable changes to DOPi will be documented in this file.
3
3
 
4
+ ## [0.18.1] - 2017-05-24
5
+ ### Fixed
6
+ - Update dependencies
7
+
8
+ ## [0.18.0] - 2017-05-24
9
+ ### Changed
10
+ - Updated the winrm gem to version 2 and migrated the connector to use the new interface
11
+ - The puppet_agent_run plugin for ssh and winrm got an update. It is now possible to configure
12
+ reruns if there are changes or errors. For more details see the plugin documentation.
13
+
14
+ ### Fixed
15
+ - Winrm now closes the connections correctly.
16
+
4
17
  ## [0.17.0] - 2017-03-28
5
18
  ### Added
6
19
  - The log format of the trace output now uses the formatter from dopv which is now in dop_common
data/Gemfile CHANGED
@@ -1,7 +1,11 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
3
  # Use local path as source for dop_common for testing
4
- # gem 'dop_common', :path => '../dop_common'
4
+ #gem 'dop_common', :path => '../dop_common'
5
+
6
+ # There are problems with the hiera puppetlabs RPM, so we can't really
7
+ # depend on the hiera gem in the spec file. Make sure this is installed
8
+ gem 'hiera'
5
9
 
6
10
  # Specify your gem's dependencies in dopi.gemspec
7
11
  gemspec
@@ -1,90 +1,91 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- dopi (0.17.0)
4
+ dopi (0.18.0)
5
5
  curses (~> 1)
6
- dop_common (~> 0.13, >= 0.13.0)
6
+ dop_common (~> 0.15, >= 0.15.0)
7
7
  gli (~> 2)
8
8
  logger-colors (~> 1)
9
9
  mcollective-client (~> 2)
10
10
  parallel (~> 1)
11
- winrm (~> 1)
11
+ winrm (~> 2)
12
12
 
13
13
  GEM
14
14
  remote: https://rubygems.org/
15
15
  specs:
16
16
  builder (3.2.3)
17
- curses (1.2.1)
17
+ curses (1.2.2)
18
18
  diff-lcs (1.3)
19
19
  docile (1.1.5)
20
- dop_common (0.13.0)
20
+ dop_common (0.15.0)
21
21
  hashdiff (~> 0.3, >= 0.3.1)
22
- hiera (~> 3)
23
22
  lockfile (~> 2)
24
23
  rb-inotify (~> 0.9)
24
+ erubis (2.7.0)
25
25
  ffi (1.9.18)
26
26
  gli (2.16.0)
27
27
  gssapi (1.2.0)
28
28
  ffi (>= 1.0.1)
29
29
  gyoku (1.3.1)
30
30
  builder (>= 2.1.2)
31
- hashdiff (0.3.2)
31
+ hashdiff (0.3.4)
32
32
  hiera (3.3.1)
33
33
  httpclient (2.8.3)
34
- json (2.0.3)
34
+ json (2.1.0)
35
35
  little-plugger (1.1.4)
36
36
  lockfile (2.1.3)
37
37
  logger-colors (1.0.0)
38
- logging (2.2.0)
38
+ logging (2.2.2)
39
39
  little-plugger (~> 1.1)
40
40
  multi_json (~> 1.10)
41
- mcollective-client (2.10.2)
41
+ mcollective-client (2.10.4)
42
42
  json
43
43
  stomp
44
44
  systemu
45
45
  mixlib-shellout (2.2.7)
46
46
  multi_json (1.12.1)
47
47
  nori (2.6.0)
48
- parallel (1.11.1)
48
+ parallel (1.11.2)
49
49
  rake (12.0.0)
50
50
  rb-inotify (0.9.8)
51
51
  ffi (>= 0.5.0)
52
- rspec (3.5.0)
53
- rspec-core (~> 3.5.0)
54
- rspec-expectations (~> 3.5.0)
55
- rspec-mocks (~> 3.5.0)
56
- rspec-command (1.0.1)
52
+ rspec (3.6.0)
53
+ rspec-core (~> 3.6.0)
54
+ rspec-expectations (~> 3.6.0)
55
+ rspec-mocks (~> 3.6.0)
56
+ rspec-command (1.0.3)
57
57
  mixlib-shellout (~> 2.0)
58
58
  rspec (~> 3.2)
59
59
  rspec-its (~> 1.2)
60
- rspec-core (3.5.4)
61
- rspec-support (~> 3.5.0)
62
- rspec-expectations (3.5.0)
60
+ rspec-core (3.6.0)
61
+ rspec-support (~> 3.6.0)
62
+ rspec-expectations (3.6.0)
63
63
  diff-lcs (>= 1.2.0, < 2.0)
64
- rspec-support (~> 3.5.0)
64
+ rspec-support (~> 3.6.0)
65
65
  rspec-its (1.2.0)
66
66
  rspec-core (>= 3.0.0)
67
67
  rspec-expectations (>= 3.0.0)
68
- rspec-mocks (3.5.0)
68
+ rspec-mocks (3.6.0)
69
69
  diff-lcs (>= 1.2.0, < 2.0)
70
- rspec-support (~> 3.5.0)
71
- rspec-support (3.5.0)
72
- rubyntlm (0.6.1)
70
+ rspec-support (~> 3.6.0)
71
+ rspec-support (3.6.0)
72
+ rubyntlm (0.6.2)
73
73
  simplecov (0.14.1)
74
74
  docile (~> 1.1.0)
75
75
  json (>= 1.8, < 3)
76
76
  simplecov-html (~> 0.10.0)
77
- simplecov-html (0.10.0)
77
+ simplecov-html (0.10.1)
78
78
  stomp (1.4.3)
79
79
  systemu (2.6.5)
80
- winrm (1.8.1)
80
+ winrm (2.2.3)
81
81
  builder (>= 2.1.2)
82
+ erubis (~> 2.7)
82
83
  gssapi (~> 1.2)
83
84
  gyoku (~> 1.0)
84
85
  httpclient (~> 2.2, >= 2.2.0.2)
85
86
  logging (>= 1.6.1, < 3.0)
86
87
  nori (~> 2.0)
87
- rubyntlm (~> 0.6.0)
88
+ rubyntlm (~> 0.6.0, >= 0.6.1)
88
89
 
89
90
  PLATFORMS
90
91
  ruby
@@ -92,6 +93,7 @@ PLATFORMS
92
93
  DEPENDENCIES
93
94
  bundler (~> 1.3)
94
95
  dopi!
96
+ hiera
95
97
  rake
96
98
  rspec
97
99
  rspec-command
@@ -35,9 +35,9 @@ Vagrant.configure(2) do |config|
35
35
  # disable the default folder sync on the nodes
36
36
  # and rsync all the stuff to the puppetmaster
37
37
  if node.name == 'puppetmaster.example.com'
38
- config.vm.synced_folder ".", "/vagrant", type: "rsync", rsync__exclude: ".bundle/"
38
+ machine.vm.synced_folder ".", "/vagrant", type: "rsync", rsync__exclude: ".bundle/"
39
39
  else
40
- config.vm.synced_folder ".", "/vagrant", disabled: true
40
+ machine.vm.synced_folder ".", "/vagrant", disabled: true
41
41
  end
42
42
  end
43
43
  end
@@ -28,11 +28,11 @@ Gem::Specification.new do |spec|
28
28
  # Code quality
29
29
  spec.add_development_dependency 'simplecov'
30
30
 
31
- spec.add_runtime_dependency 'dop_common', '~> 0.13', '>= 0.13.0'
31
+ spec.add_runtime_dependency 'dop_common', '~> 0.15', '>= 0.15.0'
32
32
  spec.add_runtime_dependency 'gli', '~> 2'
33
33
  spec.add_runtime_dependency 'logger-colors', '~> 1'
34
34
  spec.add_runtime_dependency 'mcollective-client', '~> 2'
35
- spec.add_runtime_dependency 'winrm', '~> 1'
35
+ spec.add_runtime_dependency 'winrm', '~> 2'
36
36
  spec.add_runtime_dependency 'parallel', '~> 1'
37
37
 
38
38
  # curses was removed in ruby 2.1
@@ -10,6 +10,7 @@ require "dopi/command_parser/arguments"
10
10
  require "dopi/command_parser/credentials"
11
11
  require "dopi/command_parser/exit_code"
12
12
  require "dopi/command_parser/output"
13
+ require "dopi/command_parser/puppet_run"
13
14
  require "dopi/connector/local"
14
15
  require "dopi/connector/ssh"
15
16
  require "dopi/connector/winrm"
@@ -96,7 +96,13 @@ module Dopi
96
96
  log(:info, "#{name} [OK]") if state_done?
97
97
  else
98
98
  state_fail
99
- log(:info, "#{name} [FAILED]")
99
+ if @is_verify_command
100
+ log(:info, "#{name} [FAILED]")
101
+ else
102
+ log(:error, "#{name} [FAILED]")
103
+ log_file = @step.plan.context_logger.current_log_file
104
+ log(:error, "Check the log file #{log_file} for the full debug log of the node")
105
+ end
100
106
  end
101
107
  end
102
108
  end
@@ -110,10 +116,13 @@ module Dopi
110
116
  send_signal(:abort)
111
117
  rescue CommandExecutionError => e
112
118
  log(:error, "Command failed: #{e.message}", false)
119
+ log_file = @step.plan.context_logger.current_log_file
120
+ log(:error, "Check the log file #{log_file} for the full debug log of the node", false)
113
121
  Dopi.log.error(e) if DopCommon.config.trace
114
122
  state_fail unless noop
115
123
  rescue => e
116
124
  log(:error, "Unexpected error!!! This is a Bug", false)
125
+ Dopi.log.error(e.class)
117
126
  Dopi.log.error(e.message)
118
127
  Dopi.log.error(e.backtrace)
119
128
  state_fail unless noop
@@ -6,57 +6,33 @@ module Dopi
6
6
  class Ssh
7
7
  class PuppetAgentRun < Dopi::Command
8
8
  include Dopi::Connector::Ssh
9
- include Dopi::CommandParser::Env
10
- include Dopi::CommandParser::Arguments
11
- include Dopi::CommandParser::ExitCode
12
- include Dopi::CommandParser::Output
9
+ include Dopi::CommandParser::PuppetRun
13
10
 
14
11
  public
15
-
16
- def initialize(command_parser, step, node, is_verify_command)
17
- command_parser.overwrite_defaults = { :plugin_timeout => 1800 }
18
- super(command_parser, step, node, is_verify_command)
19
- end
20
-
21
12
  def validate
22
13
  validate_ssh
23
- validate_env
24
- validate_arguments
25
- validate_exit_code
26
- validate_output
14
+ validate_puppet_run
27
15
  end
28
16
 
29
- def run
30
- cmd_stdout, cmd_stderr, cmd_exit_code = ssh_command(env, command_string)
31
- check_output(cmd_stdout) &&
32
- check_output(cmd_stderr) &&
33
- check_exit_code(cmd_exit_code)
17
+ def initialize(command_parser, step, node, is_verify_command)
18
+ command_parser.overwrite_defaults = { :plugin_timeout => 1800 }
19
+ super(command_parser, step, node, is_verify_command)
34
20
  end
35
21
 
36
- def run_noop
37
- log(:info, "(NOOP) Executing '#{command_string}' for command #{name}")
22
+ def puppet_bin
23
+ '/usr/bin/puppet'
38
24
  end
39
25
 
40
- def expect_exit_codes_defaults
41
- [ 0, 2 ]
26
+ def check_run_lock
27
+ ssh_command(env, "test -f $(#{puppet_bin} config print statedir)/agent_catalog_run.lock")
42
28
  end
43
29
 
44
- def parse_output_defaults
45
- { :error => [
46
- '^Error:'
47
- ],
48
- :warning => [
49
- '^Warning:'
50
- ]
51
- }
30
+ def puppet_run
31
+ ssh_command(env, "#{puppet_bin} agent --test --color false #{arguments}")
52
32
  end
53
33
 
54
34
  private
55
35
 
56
- def command_string
57
- "puppet agent --test --color false #{arguments}"
58
- end
59
-
60
36
  end
61
37
  end
62
38
  end
@@ -1,60 +1,45 @@
1
1
  #
2
- # WinRM Puppet Agent Plugin
2
+ # SSH custom command
3
3
  #
4
4
  module Dopi
5
5
  class Command
6
6
  class Winrm
7
7
  class PuppetAgentRun < Dopi::Command
8
8
  include Dopi::Connector::Winrm
9
- include Dopi::CommandParser::Arguments
10
- include Dopi::CommandParser::ExitCode
11
- include Dopi::CommandParser::Output
9
+ include Dopi::CommandParser::PuppetRun
12
10
 
13
11
  public
12
+ def validate
13
+ validate_winrm
14
+ validate_puppet_run
15
+ end
14
16
 
15
17
  def initialize(command_parser, step, node, is_verify_command)
16
18
  command_parser.overwrite_defaults = { :plugin_timeout => 1800 }
17
19
  super(command_parser, step, node, is_verify_command)
18
20
  end
19
21
 
20
- def validate
21
- validate_winrm
22
- validate_arguments
23
- validate_exit_code
24
- validate_output
22
+ def puppet_bin
23
+ 'puppet'
25
24
  end
26
25
 
27
- def run
28
- cmd_stdout, cmd_stderr, cmd_exit_code = winrm_powershell_command(command_string)
29
- check_output(cmd_stdout) &&
30
- check_output(cmd_stderr) &&
31
- check_exit_code(cmd_exit_code)
26
+ def check_run_lock_b
27
+ false
32
28
  end
33
29
 
34
- def run_noop
35
- log(:info, "(NOOP) Executing '#{command_string}' for command #{name}")
30
+ def check_run_lock
31
+ winrm_powershell_command <<-cmd
32
+ $Statedir = #{puppet_bin} config print statedir
33
+ if(-not( Test-Path "$Statedir/agent_catalog_run.lock" )) { exit 1 }
34
+ cmd
36
35
  end
37
36
 
38
- def expect_exit_codes_defaults
39
- [ 0, 2 ]
40
- end
41
-
42
- def parse_output_defaults
43
- { :error => [
44
- '^Error:'
45
- ],
46
- :warning => [
47
- '^Warning:'
48
- ]
49
- }
37
+ def puppet_run
38
+ winrm_powershell_command("#{puppet_bin} agent --test --color false #{arguments}")
50
39
  end
51
40
 
52
41
  private
53
42
 
54
- def command_string
55
- "puppet agent --test --color false #{arguments}"
56
- end
57
-
58
43
  end
59
44
  end
60
45
  end
@@ -0,0 +1,149 @@
1
+ #
2
+ # This is a mixin for command plugins that need to parse puppet_run specific
3
+ # options and for some methods to wrap the rerun logic.
4
+ #
5
+ module Dopi
6
+ module CommandParser
7
+ module PuppetRun
8
+ include Dopi::CommandParser::Env
9
+ include Dopi::CommandParser::Arguments
10
+ include Dopi::CommandParser::Output
11
+
12
+ public
13
+
14
+ def validate_puppet_run
15
+ validate_env
16
+ validate_arguments
17
+ validate_output
18
+ log_validation_method('rerun_on_change_valid?', CommandParsingError)
19
+ log_validation_method('rerun_on_error_valid?', CommandParsingError)
20
+ log_validation_method('max_rerun_valid?', CommandParsingError)
21
+ log_validation_method('wait_if_already_running_valid?', CommandParsingError)
22
+ end
23
+
24
+ def rerun_on_change
25
+ @rerun_on_change ||= rerun_on_change_valid? ? hash[:rerun_on_change] : false
26
+ end
27
+
28
+ def rerun_on_error
29
+ @rerun_on_error ||= rerun_on_error_valid? ? hash[:rerun_on_error] : false
30
+ end
31
+
32
+ def max_rerun
33
+ @max_rerun ||= max_rerun_valid? ? hash[:max_rerun] : 1
34
+ end
35
+
36
+ def wait_if_already_running
37
+ @wait_if_already_running ||= wait_if_already_running_valid? ? hash[:wait_if_already_running] : true
38
+ end
39
+
40
+ def run
41
+ runs = 0
42
+ loop do
43
+ raise GracefulExit if signals[:stop]
44
+ if check_run_lock_wrapper
45
+ if wait_if_already_running
46
+ log(:info, "Puppet run already in progress, waiting 10s to check again if finished")
47
+ sleep(10)
48
+ else
49
+ log(:error, "Puppet run already in progress and wait_if_already_running = false")
50
+ return false
51
+ end
52
+ else
53
+ runs += 1
54
+ if runs < 2
55
+ log(:info, "Starting Puppet Run")
56
+ else
57
+ log(:info, "Starting Puppet Rerun #{runs - 1} of #{max_rerun}")
58
+ end
59
+ case puppet_run_wrapper
60
+ when :done then return true
61
+ when :change
62
+ if rerun_on_change
63
+ if runs < 2
64
+ log(:info, "Puppet had changes and rerun_on_change = true")
65
+ else
66
+ log(:warn, "Puppet had still changes after multiple reruns. Please fix your Puppet manifests")
67
+ end
68
+ return true if max_rerun < runs
69
+ else
70
+ return true
71
+ end
72
+ else
73
+ if rerun_on_error
74
+ log(:warn, "Puppet had ERRORS during the run and rerun_on_errors = true. Please fix your Puppet manifests")
75
+ if max_rerun < runs
76
+ log(:error, "Puppet had ERRORS during the run! max_reruns (#{max_rerun}) reached!")
77
+ return false
78
+ end
79
+ else
80
+ return false
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
86
+
87
+ def check_run_lock_wrapper
88
+ cmd_stdout, cmd_stderr, cmd_exitcode = check_run_lock
89
+ return true if cmd_exitcode == 0
90
+ return false
91
+ end
92
+
93
+ # puppet run wrapper method
94
+ # this will return :done, :change or :error
95
+ def puppet_run_wrapper
96
+ cmd_stdout, cmd_stderr, cmd_exitcode = puppet_run
97
+ return :error unless (check_output(cmd_stdout) && check_output(cmd_stderr))
98
+ case cmd_exitcode
99
+ when 0 then return :done
100
+ when 2 then return :change
101
+ else return :error
102
+ end
103
+ end
104
+
105
+ def parse_output_defaults
106
+ { :error => [
107
+ '^Error:'
108
+ ],
109
+ :warning => [
110
+ '^Warning:'
111
+ ]
112
+ }
113
+ end
114
+
115
+ private
116
+
117
+ def rerun_on_change_valid?
118
+ return false unless hash.kind_of?(Hash)
119
+ return false if hash[:rerun_on_change].nil? # is optional
120
+ hash[:rerun_on_change].kind_of?(TrueClass) or hash[:rerun_on_change].kind_of?(FalseClass) or
121
+ raise CommandParsingError, "Plugin #{name}: The value for 'rerun_on_change' must be boolean"
122
+ end
123
+
124
+ def rerun_on_error_valid?
125
+ return false unless hash.kind_of?(Hash)
126
+ return false if hash[:rerun_on_error].nil? # is optional
127
+ hash[:rerun_on_error].kind_of?(TrueClass) or hash[:rerun_on_error].kind_of?(FalseClass) or
128
+ raise CommandParsingError, "Plugin #{name}: The value for 'rerun_on_error' must be boolean"
129
+ end
130
+
131
+ def max_rerun_valid?
132
+ return false unless hash.kind_of?(Hash)
133
+ return false if hash[:max_rerun].nil? # is optional
134
+ hash[:max_rerun].kind_of?(Fixnum) or
135
+ raise CommandParsingError, "Plugin #{name}: The value for 'max_rerun' has to be a number"
136
+ hash[:max_rerun] > 0 or
137
+ raise CommandParsingError, "Plugin #{name}: The value for 'max_rerun' has to be > 0"
138
+ end
139
+
140
+ def wait_if_already_running_valid?
141
+ return false unless hash.kind_of?(Hash)
142
+ return false if hash[:wait_if_already_running].nil? # is optional
143
+ hash[:wait_if_already_running].kind_of?(TrueClass) or hash[:wait_if_already_running].kind_of?(FalseClass) or
144
+ raise CommandParsingError, "Plugin #{name}: The value for 'wait_if_already_running' must be boolean"
145
+ end
146
+
147
+ end
148
+ end
149
+ end
@@ -18,59 +18,63 @@ module Dopi
18
18
  validate_credentials
19
19
  end
20
20
 
21
- def winrm_command(command_string)
21
+ def winrm_command(command_string, use_shell = :cmd)
22
22
  cmd_stdout = ""
23
23
  cmd_stderr = ""
24
24
  log(:debug, "Executing '#{command_string}' for command #{name}")
25
- result = winrm.run_cmd(command_string) do |stdout, stderr|
26
- unless stdout.nil? or stdout.empty?
27
- cmd_stdout << stdout
28
- log(:debug, stdout)
29
- end
30
- unless stderr.nil? or stderr.empty?
31
- cmd_stderr << stderr
32
- log(:error, stderr)
25
+ winrm.shell(use_shell) do |shell|
26
+ result = shell.run(command_string) do |stdout, stderr|
27
+ unless stdout.nil? or stdout.empty?
28
+ cmd_stdout << stdout
29
+ log(:debug, stdout)
30
+ end
31
+ unless stderr.nil? or stderr.empty?
32
+ cmd_stderr << stderr
33
+ log(:error, stderr)
34
+ end
33
35
  end
36
+ return [cmd_stdout, cmd_stderr, result.exitcode]
34
37
  end
35
- winrm.close
36
- [cmd_stdout, cmd_stderr, result[:exitcode]]
37
38
  end
38
39
 
39
40
  def winrm_powershell_command(command_string)
40
- log(:debug, "Unencoded Powershell command '#{command_string}'")
41
- script = WinRM::PowershellScript.new(command_string)
42
- winrm_command("powershell -encodedCommand #{script.encoded()}")
41
+ winrm_command(command_string, :powershell)
43
42
  end
44
43
 
45
44
  def winrm
46
- working_command_executor = nil
45
+ working_winrm_connection = nil
47
46
  credentials.each do |credential|
48
47
  begin
49
- winrm_web_service = WinRM::WinRMWebService.new(
50
- endpoint,
51
- auth_method(credential),
52
- :realm => credential.realm,
53
- :service => credential.service,
54
- :keytab => credential.keytab,
55
- :user => credential.username,
56
- :pass => credential.password,
57
- :disable_sspi => disable_sspi,
58
- :basic_auth_only => basic_auth_only,
59
- :ca_trust_path => ca_trust_path
48
+ winrm_connection = WinRM::Connection.new(
49
+ :endpoint => endpoint,
50
+ :transport => auth_method(credential),
51
+ :realm => credential.realm,
52
+ :service => credential.service,
53
+ :keytab => credential.keytab,
54
+ :user => credential.username,
55
+ :password => credential.password,
56
+ :disable_sspi => disable_sspi,
57
+ :basic_auth_only => basic_auth_only,
58
+ :ca_trust_path => ca_trust_path,
59
+ :operation_timeout => operation_timeout,
60
60
  )
61
- winrm_web_service.set_timeout(operation_timeout)
62
- command_executor = WinRM::CommandExecutor.new(winrm_web_service)
63
- command_executor.open
64
- command_executor.run_cmd('exit') # test connection
61
+ winrm_connection.shell(:cmd) do |shell|
62
+ output = shell.run('exit') # test connection
63
+ if output.exitcode == 0
64
+ working_winrm_connection = winrm_connection
65
+ end
66
+ end
65
67
  rescue WinRM::WinRMAuthorizationError, GSSAPI::GssApiError => e
66
68
  log(:warn, "Unable to login with credential #{credential.name} : #{e.message}")
67
69
  rescue SocketError => e
68
70
  raise CommandConnectionError,
69
71
  "A problem occurred while trying to connect to node #{@node.name} : #{e.message}"
70
- else working_command_executor = command_executor
72
+ rescue WinRM::WinRMWMIError => e
73
+ raise CommandExecutionError,
74
+ "A problem occurred while trying to connect to node #{@node.name} : #{e.message}"
71
75
  end
72
76
  end
73
- working_command_executor or
77
+ working_winrm_connection or
74
78
  raise CommandExecutionError,
75
79
  "Unable to login with any of the given credentials: #{credentials.map{|c| c.name}.join(', ')}"
76
80
  end
@@ -1,3 +1,3 @@
1
1
  module Dopi
2
- VERSION = '0.17.0'
2
+ VERSION = '0.18.1'
3
3
  end
@@ -7,6 +7,11 @@ $role = hiera('role')
7
7
  class base {
8
8
  hiera_include('classes')
9
9
 
10
+ file{'/tmp/testfile':
11
+ ensure => present,
12
+ content => "testdata",
13
+ }
14
+
10
15
  file{'/usr/libexec/mcollective/': ensure => directory}
11
16
  file{'/usr/libexec/mcollective/mcollective': ensure => directory}
12
17
  }
@@ -34,7 +34,7 @@ steps:
34
34
  exec: 'rpm'
35
35
  arguments: '-ivh https://yum.puppetlabs.com/puppetlabs-release-el-7.noarch.rpm'
36
36
 
37
- - name: 'install puppet on all the nodes'
37
+ - name: 'install puppet on all the linux nodes'
38
38
  nodes_by_config: {os: 'linux'}
39
39
  command:
40
40
  verify_commands:
@@ -44,6 +44,41 @@ steps:
44
44
  exec: 'yum'
45
45
  arguments: 'install -y puppet'
46
46
 
47
+ - name: 'install puppet on all the linux nodes'
48
+ nodes_by_config: {os: 'linux'}
49
+ command:
50
+ verify_commands:
51
+ - plugin: 'ssh/file_exists'
52
+ file: '/usr/bin/puppet'
53
+ plugin: 'ssh/custom'
54
+ exec: 'yum'
55
+ arguments: 'install -y puppet'
56
+
57
+ - name: 'Install chocolatey on all the windows nodes'
58
+ nodes_by_config: {os: 'windows'}
59
+ command:
60
+ verify_commands:
61
+ - title: 'Check if chocolatey is installed'
62
+ plugin: 'winrm/powershell'
63
+ exec: 'choco -?'
64
+ plugin: 'winrm/powershell'
65
+ exec: |
66
+ $Policy = Get-ExecutionPolicy
67
+ If ($Policy -eq "Restricted") {
68
+ Set-ExecutionPolicy AllSigned
69
+ }
70
+ iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
71
+
72
+ - name: 'Install puppet on all the windows nodes'
73
+ nodes_by_config: {os: 'windows'}
74
+ command:
75
+ verify_commands:
76
+ - title: 'Check if puppet is installed'
77
+ plugin: 'winrm/powershell'
78
+ exec: 'puppet help'
79
+ plugin: 'winrm/powershell'
80
+ exec: 'choco install -y puppet'
81
+
47
82
  - name: 'copy the puppet configuration to the right place'
48
83
  roles: 'puppetmaster'
49
84
  command:
@@ -129,7 +164,7 @@ steps:
129
164
  exec: 'puppet'
130
165
  arguments: 'apply /etc/puppet/manifests/site.pp'
131
166
 
132
- - name: 'Add puppetmaster to all hosts files'
167
+ - name: 'Add puppetmaster to all hosts files on linux'
133
168
  nodes_by_config: {os: 'linux'}
134
169
  command:
135
170
  verify_commands:
@@ -140,6 +175,19 @@ steps:
140
175
  exec: "echo"
141
176
  arguments: '"192.168.56.101 puppetmaster.example.com puppetmaster" >> /etc/hosts'
142
177
 
178
+ - name: 'Add puppetmaster to all hosts files on windows'
179
+ nodes_by_config: {os: 'windows'}
180
+ command:
181
+ verify_commands:
182
+ - plugin: 'winrm/file_contains'
183
+ file: 'C:\Windows\System32\Drivers\etc\hosts'
184
+ pattern: 'puppetmaster.example.com'
185
+ plugin: 'winrm/powershell'
186
+ exec: "Add-Content"
187
+ arguments:
188
+ - 'C:\Windows\System32\Drivers\etc\hosts'
189
+ - '"`n192.168.56.101 puppetmaster.example.com puppetmaster"'
190
+
143
191
  - name: 'Add broker to all hosts files'
144
192
  nodes_by_config: {os: 'linux'}
145
193
  command:
@@ -157,3 +205,14 @@ steps:
157
205
  command:
158
206
  plugin: 'ssh/puppet_agent_run'
159
207
  arguments: '--server puppetmaster.example.com'
208
+
209
+ # There is an issue with the domain name which gets not set
210
+ # by Vagrant
211
+ # - name: "run puppet on the windows nodes"
212
+ # nodes_by_config: {os: 'windows'}
213
+ # command:
214
+ # - plugin: 'winrm/puppet_agent_run'
215
+ # arguments: '--server puppetmaster.example.com'
216
+ # rerun_on_change: true
217
+ # rerun_on_error: true
218
+ # max_rerun: 3
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dopi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.17.0
4
+ version: 0.18.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andreas Zuber
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2017-03-28 00:00:00.000000000 Z
12
+ date: 2017-05-31 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -101,20 +101,20 @@ dependencies:
101
101
  requirements:
102
102
  - - "~>"
103
103
  - !ruby/object:Gem::Version
104
- version: '0.13'
104
+ version: '0.15'
105
105
  - - ">="
106
106
  - !ruby/object:Gem::Version
107
- version: 0.13.0
107
+ version: 0.15.0
108
108
  type: :runtime
109
109
  prerelease: false
110
110
  version_requirements: !ruby/object:Gem::Requirement
111
111
  requirements:
112
112
  - - "~>"
113
113
  - !ruby/object:Gem::Version
114
- version: '0.13'
114
+ version: '0.15'
115
115
  - - ">="
116
116
  - !ruby/object:Gem::Version
117
- version: 0.13.0
117
+ version: 0.15.0
118
118
  - !ruby/object:Gem::Dependency
119
119
  name: gli
120
120
  requirement: !ruby/object:Gem::Requirement
@@ -163,14 +163,14 @@ dependencies:
163
163
  requirements:
164
164
  - - "~>"
165
165
  - !ruby/object:Gem::Version
166
- version: '1'
166
+ version: '2'
167
167
  type: :runtime
168
168
  prerelease: false
169
169
  version_requirements: !ruby/object:Gem::Requirement
170
170
  requirements:
171
171
  - - "~>"
172
172
  - !ruby/object:Gem::Version
173
- version: '1'
173
+ version: '2'
174
174
  - !ruby/object:Gem::Dependency
175
175
  name: parallel
176
176
  requirement: !ruby/object:Gem::Requirement
@@ -278,6 +278,7 @@ files:
278
278
  - lib/dopi/command_parser/exec.rb
279
279
  - lib/dopi/command_parser/exit_code.rb
280
280
  - lib/dopi/command_parser/output.rb
281
+ - lib/dopi/command_parser/puppet_run.rb
281
282
  - lib/dopi/command_set.rb
282
283
  - lib/dopi/connector/local.rb
283
284
  - lib/dopi/connector/ssh.rb