dopi 0.17.0
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 +7 -0
- data/.gitignore +20 -0
- data/.rspec +2 -0
- data/.ruby-version +1 -0
- data/CHANGELOG.md +322 -0
- data/Gemfile +7 -0
- data/Gemfile.lock +102 -0
- data/LICENSE.txt +177 -0
- data/README.md +309 -0
- data/Rakefile +44 -0
- data/Vagrantfile +64 -0
- data/bin/dopi +4 -0
- data/doc/getting_started.md +247 -0
- data/doc/getting_started_examples/001_hello_world.yaml +17 -0
- data/doc/getting_started_examples/002_connecting_over_ssh.yaml +35 -0
- data/doc/plugins/custom.md +88 -0
- data/doc/plugins/mco/rpc.md +82 -0
- data/doc/plugins/ssh/custom.md +141 -0
- data/doc/plugins/ssh/file_contains.md +37 -0
- data/doc/plugins/ssh/file_deploy.md +52 -0
- data/doc/plugins/ssh/file_exists.md +31 -0
- data/doc/plugins/ssh/file_replace.md +37 -0
- data/doc/plugins/ssh/puppet_agent_run.md +50 -0
- data/doc/plugins/ssh/reboot.md +22 -0
- data/doc/plugins/ssh/wait_for_login.md +53 -0
- data/doc/plugins/winrm/cmd.md +161 -0
- data/doc/plugins/winrm/file_contains.md +39 -0
- data/doc/plugins/winrm/file_exists.md +31 -0
- data/doc/plugins/winrm/powershell.md +27 -0
- data/doc/plugins/winrm/puppet_agent_run.md +49 -0
- data/doc/plugins/winrm/reboot.md +17 -0
- data/doc/plugins/winrm/wait_for_login.md +55 -0
- data/dopi.gemspec +42 -0
- data/lib/dopi/cli/command_add.rb +35 -0
- data/lib/dopi/cli/command_list.rb +19 -0
- data/lib/dopi/cli/command_remove.rb +31 -0
- data/lib/dopi/cli/command_reset.rb +27 -0
- data/lib/dopi/cli/command_run.rb +68 -0
- data/lib/dopi/cli/command_show.rb +109 -0
- data/lib/dopi/cli/command_update.rb +37 -0
- data/lib/dopi/cli/command_validate.rb +27 -0
- data/lib/dopi/cli/global_options.rb +55 -0
- data/lib/dopi/cli/log.rb +33 -0
- data/lib/dopi/cli.rb +57 -0
- data/lib/dopi/command/custom.rb +52 -0
- data/lib/dopi/command/dummy.rb +27 -0
- data/lib/dopi/command/mco/rpc.rb +158 -0
- data/lib/dopi/command/ssh/custom.rb +48 -0
- data/lib/dopi/command/ssh/file_contains.rb +70 -0
- data/lib/dopi/command/ssh/file_deploy.rb +71 -0
- data/lib/dopi/command/ssh/file_exists.rb +54 -0
- data/lib/dopi/command/ssh/file_replace.rb +96 -0
- data/lib/dopi/command/ssh/puppet_agent_run.rb +63 -0
- data/lib/dopi/command/ssh/reboot.rb +50 -0
- data/lib/dopi/command/ssh/wait_for_login.rb +68 -0
- data/lib/dopi/command/winrm/cmd.rb +44 -0
- data/lib/dopi/command/winrm/file_contains.rb +66 -0
- data/lib/dopi/command/winrm/file_exists.rb +51 -0
- data/lib/dopi/command/winrm/powershell.rb +16 -0
- data/lib/dopi/command/winrm/puppet_agent_run.rb +61 -0
- data/lib/dopi/command/winrm/reboot.rb +33 -0
- data/lib/dopi/command/winrm/wait_for_login.rb +49 -0
- data/lib/dopi/command.rb +239 -0
- data/lib/dopi/command_parser/arguments.rb +38 -0
- data/lib/dopi/command_parser/credentials.rb +59 -0
- data/lib/dopi/command_parser/env.rb +37 -0
- data/lib/dopi/command_parser/exec.rb +27 -0
- data/lib/dopi/command_parser/exit_code.rb +73 -0
- data/lib/dopi/command_parser/output.rb +126 -0
- data/lib/dopi/command_set.rb +66 -0
- data/lib/dopi/connector/local.rb +77 -0
- data/lib/dopi/connector/ssh.rb +170 -0
- data/lib/dopi/connector/winrm.rb +167 -0
- data/lib/dopi/error.rb +43 -0
- data/lib/dopi/log.rb +18 -0
- data/lib/dopi/node.rb +70 -0
- data/lib/dopi/plan.rb +99 -0
- data/lib/dopi/pluginmanager.rb +62 -0
- data/lib/dopi/state.rb +226 -0
- data/lib/dopi/state_store.rb +155 -0
- data/lib/dopi/step.rb +227 -0
- data/lib/dopi/step_set.rb +70 -0
- data/lib/dopi/version.rb +3 -0
- data/lib/dopi.rb +165 -0
- data/spec/command_helper.rb +11 -0
- data/spec/fixtures/mco_client.cfg +26 -0
- data/spec/fixtures/plans/fail_on_timeout.yaml +20 -0
- data/spec/fixtures/plans/hello_world.yaml +34 -0
- data/spec/fixtures/plans/non_existing_node.yaml +26 -0
- data/spec/fixtures/plans/test_role_variable.yaml +29 -0
- data/spec/fixtures/puppet/Puppetfile +8 -0
- data/spec/fixtures/puppet/Puppetfile.lock +57 -0
- data/spec/fixtures/puppet/hiera.yaml +6 -0
- data/spec/fixtures/puppet/manifests/site.pp +52 -0
- data/spec/fixtures/test_configuration.yaml +54 -0
- data/spec/fixtures/test_credentials.yaml +11 -0
- data/spec/fixtures/test_deloyed_file.txt +5 -0
- data/spec/fixtures/test_infrastructure.yaml +12 -0
- data/spec/fixtures/test_nodes.yaml +45 -0
- data/spec/fixtures/testenv_plan.yaml +159 -0
- data/spec/integration/dopi/addrun_spec.rb +31 -0
- data/spec/integration/dopi/cli/command_run_spec.rb +38 -0
- data/spec/integration/dopi/cli/global_options_spec.rb +128 -0
- data/spec/integration/dopi/command_spec.rb +66 -0
- data/spec/integration/dopi/fail_check_plans/file_exists_fails.yaml +38 -0
- data/spec/integration/dopi/fail_check_plans/output_parser.yaml +39 -0
- data/spec/integration/dopi/fail_check_plans/powershell_fail.yaml +25 -0
- data/spec/integration/dopi/fail_check_plans/timeout.yaml +29 -0
- data/spec/integration/dopi/fail_check_plans/verify_commands.yaml +33 -0
- data/spec/integration/dopi/failplan.rb +27 -0
- data/spec/integration/dopi/plan.rb +27 -0
- data/spec/integration/dopi/plans/dummy.yaml +29 -0
- data/spec/integration/dopi/plans/max_per_role.yaml +55 -0
- data/spec/integration/dopi/plans/no_timeout.yaml +29 -0
- data/spec/integration/dopi/plans/node_and_role_patterns.yaml +58 -0
- data/spec/integration/dopi/plans/node_by_config.yaml +116 -0
- data/spec/integration/dopi/plans/plugin_defaults.yaml +86 -0
- data/spec/integration/dopi/plans/plugins/mco/rpc.yaml +33 -0
- data/spec/integration/dopi/plans/plugins/ssh/custom.yaml +97 -0
- data/spec/integration/dopi/plans/plugins/ssh/file_contains.yaml +51 -0
- data/spec/integration/dopi/plans/plugins/ssh/file_deploy.yaml +82 -0
- data/spec/integration/dopi/plans/plugins/ssh/file_exists.yaml +69 -0
- data/spec/integration/dopi/plans/plugins/ssh/file_replace.yaml +55 -0
- data/spec/integration/dopi/plans/plugins/ssh/puppet_agent_run.yaml +45 -0
- data/spec/integration/dopi/plans/plugins/ssh/reboot.yaml +43 -0
- data/spec/integration/dopi/plans/plugins/ssh/wait_for_login.yaml +45 -0
- data/spec/integration/dopi/plans/plugins/winrm/cmd.yaml +39 -0
- data/spec/integration/dopi/plans/plugins/winrm/file_contains.yaml +51 -0
- data/spec/integration/dopi/plans/plugins/winrm/file_exists.yaml +69 -0
- data/spec/integration/dopi/plans/plugins/winrm/reboot.yaml +31 -0
- data/spec/integration/dopi/plans/resolve_roles_on_validate.yaml +23 -0
- data/spec/integration/dopi/plans/ssh_parallel.yaml +37 -0
- data/spec/integration/dopi/plans/verify_commands.yaml +49 -0
- data/spec/spec_helper.rb +104 -0
- data/spec/unit/dopi/command/custom_spec.rb +58 -0
- data/spec/unit/dopi/command/mco/rpc_spec.rb +157 -0
- data/spec/unit/dopi/command/ssh/custom_spec.rb +30 -0
- data/spec/unit/dopi/command/ssh/file_deploy_spec.rb +42 -0
- data/spec/unit/dopi/command/ssh/file_replace_spec.rb +35 -0
- data/spec/unit/dopi/command_parser/credentials_spec.rb +53 -0
- data/spec/unit/dopi/command_parser/exit_code_spec.rb +63 -0
- data/spec/unit/dopi/command_parser/output_spec.rb +129 -0
- data/spec/unit/dopi/command_spec.rb +14 -0
- data/spec/unit/dopi/connector/winrm_spec.rb +111 -0
- data/spec/unit/dopi/node_spec.rb +24 -0
- data/spec/unit/dopi/plan_spec.rb +31 -0
- data/spec/unit/dopi/state_spec.rb +109 -0
- data/spec/unit/dopi/step_spec.rb +13 -0
- metadata +448 -0
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
# DOPi Command Plugin: WinRM Command executor
|
|
2
|
+
|
|
3
|
+
This DOPi Plugin will execute a command on Windows with WinRM.
|
|
4
|
+
|
|
5
|
+
## Plugin Settings:
|
|
6
|
+
|
|
7
|
+
### credentials (optional)
|
|
8
|
+
|
|
9
|
+
`default: []`
|
|
10
|
+
|
|
11
|
+
The winrm plugin and all the plugins that inherit from it can use
|
|
12
|
+
credentials from the credentials hash in the plan to login.
|
|
13
|
+
|
|
14
|
+
credentials:
|
|
15
|
+
'windows_staging_login':
|
|
16
|
+
type: :username_password
|
|
17
|
+
username: 'administrator'
|
|
18
|
+
password: 'foo'
|
|
19
|
+
|
|
20
|
+
steps:
|
|
21
|
+
- name: 'set winrm login credentials'
|
|
22
|
+
command:
|
|
23
|
+
plugin: 'winrm/cmd'
|
|
24
|
+
credentials: 'windows_staging_login'
|
|
25
|
+
exec: 'somecommand'
|
|
26
|
+
|
|
27
|
+
You can also specify multiple credentials and the winrm plugin will try each one
|
|
28
|
+
of them in turn to login to the node.
|
|
29
|
+
|
|
30
|
+
credentials:
|
|
31
|
+
'windows_staging_login':
|
|
32
|
+
type: :username_password
|
|
33
|
+
username: 'administrator'
|
|
34
|
+
password: 'foo'
|
|
35
|
+
'windows_prod_login':
|
|
36
|
+
type: :kerberos
|
|
37
|
+
realm: 'FOOO'
|
|
38
|
+
|
|
39
|
+
steps:
|
|
40
|
+
- name: 'set winrm login credentials'
|
|
41
|
+
command:
|
|
42
|
+
plugin: 'winrm/cmd'
|
|
43
|
+
credentials:
|
|
44
|
+
- 'windows_staging_login'
|
|
45
|
+
- 'windows_prod_login'
|
|
46
|
+
exec: 'somecommand'
|
|
47
|
+
|
|
48
|
+
This can be set in each plugin (don't forget the validator plugins) or via
|
|
49
|
+
the set_plugin_defaults hash. The plugin defaults will be preserved for
|
|
50
|
+
subsequent steps until it is altered or deleted.
|
|
51
|
+
|
|
52
|
+
credentials:
|
|
53
|
+
'windows_staging_login':
|
|
54
|
+
type: :username_password
|
|
55
|
+
username: 'administrator'
|
|
56
|
+
password: 'foo'
|
|
57
|
+
'windows_prod_login':
|
|
58
|
+
type: :kerberos
|
|
59
|
+
realm: 'FOOO'
|
|
60
|
+
|
|
61
|
+
steps:
|
|
62
|
+
- name: 'set winrm login credentials'
|
|
63
|
+
set_plugin_defaults:
|
|
64
|
+
- plugins: '/^ssh/'
|
|
65
|
+
:credentials:
|
|
66
|
+
- 'windows_staging_login'
|
|
67
|
+
- 'windows_prod_login'
|
|
68
|
+
command:
|
|
69
|
+
plugin: 'winrm/cmd'
|
|
70
|
+
exec: 'somecommand'
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
(See dop_common plan format for more options)
|
|
74
|
+
|
|
75
|
+
### exec (required)
|
|
76
|
+
|
|
77
|
+
The command the plugin should execute for every node.
|
|
78
|
+
|
|
79
|
+
### arguments (optional)
|
|
80
|
+
|
|
81
|
+
`default: ""`
|
|
82
|
+
|
|
83
|
+
The arguments for the command. This can be set by a string as an array or
|
|
84
|
+
as a hash. All the elements of the hash and the array will be flattened
|
|
85
|
+
and joined with a space.
|
|
86
|
+
|
|
87
|
+
### port (optional)
|
|
88
|
+
|
|
89
|
+
`default: 5985`
|
|
90
|
+
|
|
91
|
+
The port where the service is listening on the remote machines.
|
|
92
|
+
|
|
93
|
+
### ssl (optional)
|
|
94
|
+
|
|
95
|
+
`default: true`
|
|
96
|
+
|
|
97
|
+
Communicate with the node over ssl
|
|
98
|
+
|
|
99
|
+
### ca_trust_path (optional)
|
|
100
|
+
|
|
101
|
+
`default: nil`
|
|
102
|
+
|
|
103
|
+
Point to another CA trust ca trust path
|
|
104
|
+
|
|
105
|
+
### disable_sspi (optional)
|
|
106
|
+
|
|
107
|
+
`default: false`
|
|
108
|
+
|
|
109
|
+
Disable the security support provider interface.
|
|
110
|
+
|
|
111
|
+
### basic_auth_only (optional)
|
|
112
|
+
|
|
113
|
+
`default: false`
|
|
114
|
+
|
|
115
|
+
Use basic auth only
|
|
116
|
+
|
|
117
|
+
### operation_timeout (optional)
|
|
118
|
+
|
|
119
|
+
`default: plugin_timeout - 5s`
|
|
120
|
+
|
|
121
|
+
Timeout for the winrm command to respond. This will default to the plugin_timeout - 5s
|
|
122
|
+
|
|
123
|
+
### expect_exit_codes (optional)
|
|
124
|
+
|
|
125
|
+
`default: 0`
|
|
126
|
+
|
|
127
|
+
The exit codes DOPi should expect if the program terminates. It the program
|
|
128
|
+
exits with an exit code not listed here, DOPi will mark the run as failed.
|
|
129
|
+
The values can be a number, an array of numbers or :all for all possible exit
|
|
130
|
+
codes. Will replace the current default.
|
|
131
|
+
|
|
132
|
+
### parse_output (optional)
|
|
133
|
+
|
|
134
|
+
`default: {}`
|
|
135
|
+
|
|
136
|
+
Here you can define patterns that match against the output of the command plugin
|
|
137
|
+
and flag certain lines as errors or warnings. The parse_output key should contain
|
|
138
|
+
a hash with two keys, 'error' and 'warning' which each can contain an array of
|
|
139
|
+
patterns.
|
|
140
|
+
|
|
141
|
+
## Example:
|
|
142
|
+
|
|
143
|
+
credentials:
|
|
144
|
+
'windows_kerberos':
|
|
145
|
+
type: 'kerberos'
|
|
146
|
+
realm: 'EXAMPLE.COM'
|
|
147
|
+
'windows_login':
|
|
148
|
+
type: 'username_password'
|
|
149
|
+
username: 'Administrator'
|
|
150
|
+
password: 'vagrant'
|
|
151
|
+
|
|
152
|
+
steps:
|
|
153
|
+
- name: 'execute a simple cmd command'
|
|
154
|
+
nodes: 'all'
|
|
155
|
+
command:
|
|
156
|
+
plugin: 'winrm/cmd'
|
|
157
|
+
credentials:
|
|
158
|
+
- 'windows_kerberos'
|
|
159
|
+
- 'windows_login'
|
|
160
|
+
exec: 'ipconfig'
|
|
161
|
+
arguments: '/all'
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# DOPi Command Plugin: File Contains WinRM Command
|
|
2
|
+
|
|
3
|
+
This DOPi Plugin will check if the specified file on the node contains a
|
|
4
|
+
specific pattern. This plugin is usually used as a verify command to check
|
|
5
|
+
if a command has to be executed on a node.
|
|
6
|
+
|
|
7
|
+
## Plugin Settings:
|
|
8
|
+
|
|
9
|
+
The winrm/file_contains command plugin is based on the
|
|
10
|
+
[winrm powershell command plugin](doc/plugins/winrm/powershell.md) and the
|
|
11
|
+
[winrm cmd command plugin](doc/plugins/winrm/cdm.md) and inherits all their
|
|
12
|
+
parameters.
|
|
13
|
+
|
|
14
|
+
It will however overwrite the **exec** parameter, so it is not possible to
|
|
15
|
+
set a custom command in this plugin.
|
|
16
|
+
|
|
17
|
+
### file (required)
|
|
18
|
+
|
|
19
|
+
The file to check
|
|
20
|
+
|
|
21
|
+
### pattern (required)
|
|
22
|
+
|
|
23
|
+
The regular expression to check against
|
|
24
|
+
|
|
25
|
+
## Example:
|
|
26
|
+
|
|
27
|
+
- name "Run puppet on a node"
|
|
28
|
+
nodes:
|
|
29
|
+
- 'web01.example.com'
|
|
30
|
+
command:
|
|
31
|
+
plugin: 'winrm/cmd'
|
|
32
|
+
verify_commands:
|
|
33
|
+
- plugin: 'winrm/file_contains'
|
|
34
|
+
file: 'C:\puppet\puppet.conf'
|
|
35
|
+
pattern: 'puppetmaster.example.com'
|
|
36
|
+
exec: 'puppet'
|
|
37
|
+
arguments:
|
|
38
|
+
'agent': '--test'
|
|
39
|
+
'--server': 'puppetmaster.example.com'
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# DOPi Command Plugin: File Contains WinRM Command
|
|
2
|
+
|
|
3
|
+
This DOPi Plugin will check if the specified file on the node exists.
|
|
4
|
+
This plugin is usually used as a verify command to check if a command
|
|
5
|
+
has to be executed on a node.
|
|
6
|
+
|
|
7
|
+
## Plugin Settings:
|
|
8
|
+
|
|
9
|
+
The winrm/file_exists command plugin is based on the
|
|
10
|
+
[winrm powershell command plugin](doc/plugins/winrm/powershell.md) and the
|
|
11
|
+
[winrm cmd plugin](doc/plugins/winrm/cmd.md) and inherits all their
|
|
12
|
+
parameters.
|
|
13
|
+
|
|
14
|
+
It will however overwrite the **exec** parameter, so it is not possible to
|
|
15
|
+
set a custom command in this plugin.
|
|
16
|
+
|
|
17
|
+
### file (required)
|
|
18
|
+
|
|
19
|
+
The file to check
|
|
20
|
+
|
|
21
|
+
## Example:
|
|
22
|
+
|
|
23
|
+
- name: 'Say hello'
|
|
24
|
+
nodes: all
|
|
25
|
+
command:
|
|
26
|
+
verify_commands:
|
|
27
|
+
- plugin: 'winrm/file_exists'
|
|
28
|
+
file: 'C:\some\file.txt'
|
|
29
|
+
plugin: 'winrm/cmd'
|
|
30
|
+
exec: 'echo'
|
|
31
|
+
arguments: '"Hello"'
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# DOPi Command Plugin: WinRM Command executor
|
|
2
|
+
|
|
3
|
+
This DOPi Plugin will execute a powershell command on Windows with WinRM.
|
|
4
|
+
|
|
5
|
+
This Plugin is identical to the 'winrm/cmd' plugin and shares the same options.
|
|
6
|
+
The only difference is that it will execute powershell commands.
|
|
7
|
+
|
|
8
|
+
## Example:
|
|
9
|
+
|
|
10
|
+
credentials:
|
|
11
|
+
'windows_kerberos':
|
|
12
|
+
type: 'kerberos'
|
|
13
|
+
realm: 'EXAMPLE.COM'
|
|
14
|
+
'windows_login':
|
|
15
|
+
type: 'username_password'
|
|
16
|
+
username: 'Administrator'
|
|
17
|
+
password: 'vagrant'
|
|
18
|
+
|
|
19
|
+
steps:
|
|
20
|
+
- name: 'execute a simple powershell command'
|
|
21
|
+
nodes: 'all'
|
|
22
|
+
command:
|
|
23
|
+
plugin: 'winrm/powershell'
|
|
24
|
+
credentials:
|
|
25
|
+
- 'windows_kerberos'
|
|
26
|
+
- 'windows_login'
|
|
27
|
+
exec: 'Get-NetAdapter'
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# DOPi Command Plugin: WinRM Puppet Agent run Command
|
|
2
|
+
|
|
3
|
+
This DOPi Plugin will run puppet on the nodes in the step.
|
|
4
|
+
|
|
5
|
+
## Plugin Settings:
|
|
6
|
+
|
|
7
|
+
The winrm/puppet_agent_run command plugin is based on the
|
|
8
|
+
[winrm custom command plugin](doc/plugins/winrm/powershell.md) and
|
|
9
|
+
inherits all it's parameters.
|
|
10
|
+
|
|
11
|
+
It will however overwrite the **exec** parameter, so it is not possible to
|
|
12
|
+
set a custom command in this plugin.
|
|
13
|
+
|
|
14
|
+
You may want to set a high **plugin_timeout** here to make sure it waits
|
|
15
|
+
long enough for all the nodes to come up if you provision the nodes while
|
|
16
|
+
waiting.
|
|
17
|
+
|
|
18
|
+
This plugin overwrites the defaults for the **expect_exit_codes** parameter.
|
|
19
|
+
Puppet will return an exit code of 2 if there where changes. Since this will
|
|
20
|
+
be what we are looking we have to expect this and mark it as success
|
|
21
|
+
|
|
22
|
+
`default overwrite for expect_exit_codes : [ 0, 2 ]`
|
|
23
|
+
|
|
24
|
+
If you are sure that there will be changes you should overwrite this with 2
|
|
25
|
+
to make sure there where changes. This may help you catching problems where
|
|
26
|
+
nodes don't actually get a configuration or are in the wrong environment.
|
|
27
|
+
|
|
28
|
+
The winrm/puppet_agent_run plugin has no additional parameters.
|
|
29
|
+
|
|
30
|
+
## Examples:
|
|
31
|
+
|
|
32
|
+
### Simple Example
|
|
33
|
+
|
|
34
|
+
- name "Run puppet on a node"
|
|
35
|
+
nodes:
|
|
36
|
+
- 'web01.example.com'
|
|
37
|
+
command: 'winrm/puppet_agent_run'
|
|
38
|
+
|
|
39
|
+
### Complete Example
|
|
40
|
+
|
|
41
|
+
- name "Run puppet with parameters on a node"
|
|
42
|
+
nodes:
|
|
43
|
+
- 'web01.example.com'
|
|
44
|
+
command:
|
|
45
|
+
plugin: 'winrm/puppet_agent_run'
|
|
46
|
+
plugin_timeout: 300
|
|
47
|
+
arguments:
|
|
48
|
+
'--server': 'puppetmaster.example.com'
|
|
49
|
+
'--environment': 'development'
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# DOPi Command Plugin: Reboot
|
|
2
|
+
|
|
3
|
+
This plugin will send the reboot command to a node. Then it will check if the
|
|
4
|
+
node actually rebooted by checking until it is unavailable and then available
|
|
5
|
+
again. The command will finish if DOPi is again able to login after the reboot.
|
|
6
|
+
|
|
7
|
+
## Plugin Settings:
|
|
8
|
+
|
|
9
|
+
There are currently no settings for this plugin
|
|
10
|
+
|
|
11
|
+
## Example
|
|
12
|
+
|
|
13
|
+
- name "Wait until we can successfully login to the node"
|
|
14
|
+
nodes:
|
|
15
|
+
- 'web01.example.com'
|
|
16
|
+
command: 'winrm/reboot'
|
|
17
|
+
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# DOPi Command Plugin: Wait for SSH login Command
|
|
2
|
+
|
|
3
|
+
This DOPi Plugin will try to connect to the node until a successful login
|
|
4
|
+
is possible or until a timeout is reached.
|
|
5
|
+
|
|
6
|
+
## Plugin Settings:
|
|
7
|
+
|
|
8
|
+
The winrm/wait_for_login command plugin is based on the
|
|
9
|
+
[winrm cmd plugin](doc/plugins/winrm/cmd.md) and the
|
|
10
|
+
[custom command plugin](doc/plugins/custom.md) and inherits all their
|
|
11
|
+
parameters.
|
|
12
|
+
|
|
13
|
+
It will however overwrite the **exec** parameter, so it is not possible to
|
|
14
|
+
set a custom command in this plugin.
|
|
15
|
+
|
|
16
|
+
You may want to set a high **plugin_timeout** here to make sure it waits
|
|
17
|
+
long enough for all the nodes to come up if you provision the nodes while
|
|
18
|
+
waiting.
|
|
19
|
+
|
|
20
|
+
### connect_timeout (optional)
|
|
21
|
+
|
|
22
|
+
`default: 0`
|
|
23
|
+
|
|
24
|
+
__*NOTE:*__ This is not implemented for the winrm version of this plugin right now
|
|
25
|
+
|
|
26
|
+
Amount of seconds to wait while connecting until giving up.
|
|
27
|
+
|
|
28
|
+
### interval (optional)
|
|
29
|
+
|
|
30
|
+
`default: 10`
|
|
31
|
+
|
|
32
|
+
Amount of seconds to wait between login attempts.
|
|
33
|
+
|
|
34
|
+
## Examples:
|
|
35
|
+
|
|
36
|
+
### Simple Example
|
|
37
|
+
|
|
38
|
+
- name "Wait until we can successfully login to the node"
|
|
39
|
+
nodes:
|
|
40
|
+
- 'windows01.example.com'
|
|
41
|
+
command:
|
|
42
|
+
plugin: 'winrm/wait_for_login'
|
|
43
|
+
plugin_timeout: 300
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
### Complete Example
|
|
47
|
+
|
|
48
|
+
- name "Wait until we can successfully login to the node"
|
|
49
|
+
nodes:
|
|
50
|
+
- 'windows01.example.com'
|
|
51
|
+
command:
|
|
52
|
+
plugin: 'winrm/wait_for_login'
|
|
53
|
+
plugin_timeout: 300
|
|
54
|
+
connect_timeout: 5
|
|
55
|
+
interval: 30
|
data/dopi.gemspec
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
|
+
require 'dopi/version'
|
|
5
|
+
|
|
6
|
+
Gem::Specification.new do |spec|
|
|
7
|
+
spec.name = 'dopi'
|
|
8
|
+
spec.version = Dopi::VERSION
|
|
9
|
+
spec.authors = ['Andreas Zuber', 'Andreas Maierhofer']
|
|
10
|
+
spec.email = ['zuber@puzzle.ch', 'andreas.maierhofer@swisscom.com']
|
|
11
|
+
spec.description = %q{DOPi orchestrates puppet runs, mco calls and custom commands over different nodes}
|
|
12
|
+
spec.summary = %q{DOPi orchestrates puppet runs, mco calls and custom commands over different nodes}
|
|
13
|
+
spec.homepage = ''
|
|
14
|
+
spec.license = 'Apache-2.0'
|
|
15
|
+
|
|
16
|
+
spec.files = `git ls-files`.split($/)
|
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
|
19
|
+
spec.require_paths = ['lib']
|
|
20
|
+
spec.required_ruby_version = '>= 1.9.3'
|
|
21
|
+
|
|
22
|
+
spec.add_development_dependency 'bundler', '~> 1.3'
|
|
23
|
+
spec.add_development_dependency 'rake'
|
|
24
|
+
spec.add_development_dependency 'rspec'
|
|
25
|
+
spec.add_development_dependency 'rspec-mocks'
|
|
26
|
+
spec.add_development_dependency 'rspec-command'
|
|
27
|
+
|
|
28
|
+
# Code quality
|
|
29
|
+
spec.add_development_dependency 'simplecov'
|
|
30
|
+
|
|
31
|
+
spec.add_runtime_dependency 'dop_common', '~> 0.13', '>= 0.13.0'
|
|
32
|
+
spec.add_runtime_dependency 'gli', '~> 2'
|
|
33
|
+
spec.add_runtime_dependency 'logger-colors', '~> 1'
|
|
34
|
+
spec.add_runtime_dependency 'mcollective-client', '~> 2'
|
|
35
|
+
spec.add_runtime_dependency 'winrm', '~> 1'
|
|
36
|
+
spec.add_runtime_dependency 'parallel', '~> 1'
|
|
37
|
+
|
|
38
|
+
# curses was removed in ruby 2.1
|
|
39
|
+
if RUBY_VERSION >= '2.1'
|
|
40
|
+
spec.add_runtime_dependency 'curses', '~> 1'
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
module Dopi
|
|
2
|
+
module Cli
|
|
3
|
+
|
|
4
|
+
def self.command_add(base)
|
|
5
|
+
base.class_eval do
|
|
6
|
+
|
|
7
|
+
desc 'Add a new plan file to the plan cache'
|
|
8
|
+
arg_name 'plan_file'
|
|
9
|
+
command :add do |c|
|
|
10
|
+
c.desc 'update the plan if it already exists'
|
|
11
|
+
c.default_value false
|
|
12
|
+
c.switch [:update, :u]
|
|
13
|
+
|
|
14
|
+
c.action do |global_options,options,args|
|
|
15
|
+
help_now!('Specify a plan file to add') if args.empty?
|
|
16
|
+
help_now!('You can only add one plan') if args.length > 1
|
|
17
|
+
plan_file = args[0]
|
|
18
|
+
begin
|
|
19
|
+
puts Dopi.add(plan_file)
|
|
20
|
+
rescue DopCommon::PlanExistsError => e
|
|
21
|
+
if options[:update]
|
|
22
|
+
puts Dopi.update_plan(plan_file, {})
|
|
23
|
+
else
|
|
24
|
+
raise e
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module Dopi
|
|
2
|
+
module Cli
|
|
3
|
+
|
|
4
|
+
def self.command_list(base)
|
|
5
|
+
base.class_eval do
|
|
6
|
+
|
|
7
|
+
desc 'Show the list of plans in the dopi plan cache'
|
|
8
|
+
command :list do |c|
|
|
9
|
+
c.action do |global_options,options,args|
|
|
10
|
+
puts Dopi.list
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
module Dopi
|
|
2
|
+
module Cli
|
|
3
|
+
|
|
4
|
+
def self.command_remove(base)
|
|
5
|
+
base.class_eval do
|
|
6
|
+
|
|
7
|
+
desc 'Remove an existing plan from the plan cache'
|
|
8
|
+
arg_name 'name'
|
|
9
|
+
command :remove do |c|
|
|
10
|
+
c.desc 'Keep the DOPi state file'
|
|
11
|
+
c.default_value false
|
|
12
|
+
c.switch [:keep_dopi_state]
|
|
13
|
+
|
|
14
|
+
c.desc 'Remove the DOPv state file (THIS WILL REMOVE THE DISK INFO)'
|
|
15
|
+
c.default_value false
|
|
16
|
+
c.switch [:remove_dopv_state]
|
|
17
|
+
|
|
18
|
+
c.action do |global_options,options,args|
|
|
19
|
+
help_now!('Specify a plan name to remove') if args.empty?
|
|
20
|
+
help_now!('You can only remove one plan') if args.length > 1
|
|
21
|
+
plan_name = args[0]
|
|
22
|
+
Dopi.remove(plan_name, !options[:keep_dopi_state], options[:remove_dopv_state])
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
module Dopi
|
|
2
|
+
module Cli
|
|
3
|
+
|
|
4
|
+
def self.command_reset(base)
|
|
5
|
+
base.class_eval do
|
|
6
|
+
|
|
7
|
+
desc 'Reset a failed plan'
|
|
8
|
+
arg_name 'name'
|
|
9
|
+
command :reset do |c|
|
|
10
|
+
c.desc 'Force reset the states back to ready from every state'
|
|
11
|
+
c.default_value false
|
|
12
|
+
c.switch [:force, :f]
|
|
13
|
+
|
|
14
|
+
c.action do |global_options,options,args|
|
|
15
|
+
help_now!('Specify a plan name to run') if args.empty?
|
|
16
|
+
help_now!('You can only run one plan') if args.length > 1
|
|
17
|
+
plan_name = args[0]
|
|
18
|
+
Dopi.reset(plan_name, options[:force])
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
module Dopi
|
|
2
|
+
module Cli
|
|
3
|
+
|
|
4
|
+
def self.run_options(command)
|
|
5
|
+
DopCommon::Cli.node_select_options(command)
|
|
6
|
+
|
|
7
|
+
command.desc 'Show only stuff the run would do but don\'t execute commands (verify commands will still be executed)'
|
|
8
|
+
command.default_value false
|
|
9
|
+
command.switch [:noop, :n]
|
|
10
|
+
|
|
11
|
+
command.desc 'Select the step set to run (if nothing is specified it will try to run the step set "default")'
|
|
12
|
+
command.default_value 'default'
|
|
13
|
+
command.arg_name 'STEPSET'
|
|
14
|
+
command.flag [:step_set, :s]
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def self.command_run(base)
|
|
18
|
+
base.class_eval do
|
|
19
|
+
|
|
20
|
+
desc 'Run the plan'
|
|
21
|
+
arg_name 'id'
|
|
22
|
+
command :run do |c|
|
|
23
|
+
run_options(c)
|
|
24
|
+
c.action do |global_options,options,args|
|
|
25
|
+
help_now!('Specify a plan name to run') if args.empty?
|
|
26
|
+
help_now!('You can only run one plan') if args.length > 1
|
|
27
|
+
options[:run_for_nodes] = DopCommon::Cli.parse_node_select_options(options)
|
|
28
|
+
plan_name = args[0]
|
|
29
|
+
begin
|
|
30
|
+
Dopi.run(plan_name, options)
|
|
31
|
+
rescue Dopi::StateTransitionError => e
|
|
32
|
+
Dopi.log.error(e.message)
|
|
33
|
+
exit_now!("Some steps are in a state where they can't be started again. Try to reset the plan.")
|
|
34
|
+
ensure
|
|
35
|
+
print_state(plan_name)
|
|
36
|
+
exit_now!('Errors during plan run detected!') if Dopi.show(plan_name).state_failed?
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
desc 'Add a plan, run it and then remove it again (This is mainly for testing)'
|
|
42
|
+
arg_name 'plan_file'
|
|
43
|
+
command :oneshot do |c|
|
|
44
|
+
run_options(c)
|
|
45
|
+
c.action do |global_options,options,args|
|
|
46
|
+
help_now!('Specify a plan file to add') if args.empty?
|
|
47
|
+
help_now!('You can only add one plan') if args.length > 1
|
|
48
|
+
options[:run_for_nodes] = DopCommon::Cli.parse_node_select_options(options)
|
|
49
|
+
plan_file = args[0]
|
|
50
|
+
plan_name = Dopi.add(plan_file)
|
|
51
|
+
begin
|
|
52
|
+
Dopi.run(plan_name, options)
|
|
53
|
+
ensure
|
|
54
|
+
print_state(plan_name)
|
|
55
|
+
failed = Dopi.show(plan_name).state_failed?
|
|
56
|
+
Dopi.remove(plan_name, true)
|
|
57
|
+
exit_now!('Errors during plan run detected!') if failed
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
|