dopi 0.17.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
|