vagrant-dsc 0.0.1 → 1.0.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 +4 -4
- data/README.md +47 -13
- data/development/Vagrantfile +34 -5
- data/development/manifests/{ContosoWebsite.ps1 → MyWebsite.ps1} +1 -1
- data/lib/vagrant-dsc/config.rb +93 -42
- data/lib/vagrant-dsc/locales/en.yml +6 -0
- data/lib/vagrant-dsc/plugin.rb +2 -2
- data/lib/vagrant-dsc/provisioner.rb +73 -26
- data/lib/vagrant-dsc/templates/runner.ps1.erb +18 -10
- data/lib/vagrant-dsc/version.rb +1 -1
- data/spec/base.rb +48 -51
- data/spec/provisioner/config_spec.rb +107 -249
- data/spec/provisioner/provisioner_spec.rb +394 -34
- data/spec/spec_helper.rb +4 -1
- data/vagrant-dsc.gemspec +7 -7
- metadata +62 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c8ec166dab0cf1c326f7d0f943abcee534574d68
|
4
|
+
data.tar.gz: aad0961c447ebf11921c64c920d43463fb2410b5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 16b406fbc437d601f40536c687efac1536588655a4813a3592ebfc9f19f0496cfaa1750a87b640d8ba5e429e68e453fd07d45774c1817408e1650b0ad3eac0bb
|
7
|
+
data.tar.gz: 603e019f5b4444ef240733f8a8eb417f3ed003a3ed394fe64212218736936c5549b8401409d47ea7f901a962d119694411758c9920b26504520631bf1027662d
|
data/README.md
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
# Vagrant DSC Plugin
|
2
2
|
|
3
|
-
[
|
3
|
+
[](https://travis-ci.org/mefellows/vagrant-dsc)
|
4
|
+
[](https://coveralls.io/r/mefellows/vagrant-dsc)
|
5
|
+
[](http://badge.fury.io/rb/vagrant-dsc)
|
6
|
+
|
7
|
+
[Desired State Configuration](http://technet.microsoft.com/en-au/library/dn249912.aspx) provisioning plugin for Vagrant, enabling you to quickly configure & bootstrap a Windows Virtual Machine in a repeatable, reliable fashion - the Vagrant way.
|
4
8
|
|
5
9
|
.NET Devs - no more excuses...
|
6
10
|
|
@@ -14,29 +18,59 @@
|
|
14
18
|
|
15
19
|
## Usage
|
16
20
|
|
17
|
-
In your Vagrantfile, add the following plugin:
|
21
|
+
In your Vagrantfile, add the following plugin and configure to your needs:
|
18
22
|
|
19
23
|
```ruby
|
20
24
|
config.vm.provision "dsc" do |dsc|
|
21
|
-
# The (Vagrantfile) relative path(s) to any folder containing DSC Resources
|
22
|
-
dsc.manifests_path = ["manifests", "other_manifests"]
|
23
|
-
|
24
25
|
# The path relative to `dsc.manifests_path` pointing to the Configuration file
|
25
|
-
|
26
|
-
|
26
|
+
dsc.configuration_file = "MyWebsite.ps1"
|
27
|
+
|
28
|
+
# The Configuration Command to run. Assumed to be the same as the `dsc.configuration_file`
|
29
|
+
# (sans extension) if not provided.
|
30
|
+
dsc.configuration_name = "MyWebsite"
|
31
|
+
|
32
|
+
# Commandline arguments to the Configuration run
|
33
|
+
# Set of Parameters to pass to the DSC Configuration.
|
34
|
+
#
|
35
|
+
# To pass in flags, simply set the value to `nil`
|
36
|
+
dsc.configuration_params = {"machineName => "localhost", "-EnableDebug" => nil}
|
37
|
+
|
38
|
+
# Relative path to a folder containing a pre-generated MOF file.
|
39
|
+
#
|
40
|
+
# Path is relative to the folder containing the Vagrantfile.
|
41
|
+
#dsc.mof_path = "mof_output"
|
42
|
+
|
43
|
+
# Relative path to the folder containing the root Configuration manifest file.
|
44
|
+
# Defaults to 'manifests'.
|
45
|
+
#
|
46
|
+
# Path is relative to the folder containing the Vagrantfile.
|
47
|
+
# dsc.manifests_path = "manifests"
|
27
48
|
|
28
|
-
#
|
29
|
-
#
|
30
|
-
|
49
|
+
# Set of module paths relative to the Vagrantfile dir.
|
50
|
+
#
|
51
|
+
# These paths are added to the DSC Configuration running
|
52
|
+
# environment to enable local modules to be addressed.
|
53
|
+
#
|
54
|
+
# @return [Array] Set of relative module paths.
|
55
|
+
#dsc.module_path = ["manifests", "modules"]
|
31
56
|
|
57
|
+
# The type of synced folders to use when sharing the data
|
58
|
+
# required for the provisioner to work properly.
|
32
59
|
#
|
33
|
-
|
60
|
+
# By default this will use the default synced folder type.
|
61
|
+
# For example, you can set this to "nfs" to use NFS synced folders.
|
62
|
+
#dsc.synced_folder_type = ""
|
63
|
+
|
64
|
+
# Temporary working directory on the guest machine.
|
65
|
+
#dsc.temp_dir = "/tmp/vagrant-dsc"
|
34
66
|
end
|
35
67
|
```
|
36
68
|
|
37
|
-
##
|
69
|
+
## Roadmap
|
38
70
|
|
39
|
-
*
|
71
|
+
* Support DSC Pull Server provisioning
|
72
|
+
* Test (dry-run) a DSC Configuration Run with 'vagrant vagrant-dsc test'
|
73
|
+
* Support for non-Windows environments
|
40
74
|
|
41
75
|
### Supported Environments
|
42
76
|
|
data/development/Vagrantfile
CHANGED
@@ -73,14 +73,43 @@ SCRIPT
|
|
73
73
|
dsc.module_path = ["manifests", "modules"]
|
74
74
|
|
75
75
|
# The path relative to `dsc.manifests_path` pointing to the Configuration file
|
76
|
-
dsc.
|
76
|
+
dsc.configuration_file = "manifests/MyWebsite.ps1"
|
77
77
|
|
78
|
-
# The Configuration Command to run. Assumed to be the same as the `dsc.
|
78
|
+
# The Configuration Command to run. Assumed to be the same as the `dsc.configuration_file`
|
79
79
|
# (sans extension) if not provided.
|
80
|
-
|
80
|
+
dsc.configuration_name = "MyWebsite"
|
81
81
|
|
82
82
|
# Commandline arguments to the Configuration run
|
83
|
-
|
84
|
-
dsc.
|
83
|
+
# Set of Parameters to pass to the DSC Configuration.
|
84
|
+
dsc.configuration_params = {[:machineName] => "localhost"}
|
85
|
+
|
86
|
+
# Relative path to a pre-generated MOF file.
|
87
|
+
#
|
88
|
+
# Path is relative to the folder containing the Vagrantfile.
|
89
|
+
#dsc.mof_file = "localhost.mof"
|
90
|
+
|
91
|
+
# Relative path to the folder containing the root Configuration manifest file.
|
92
|
+
# Defaults to 'manifests'.
|
93
|
+
#
|
94
|
+
# Path is relative to the folder containing the Vagrantfile.
|
95
|
+
# dsc.manifests_path = "manifests"
|
96
|
+
|
97
|
+
# Set of module paths relative to the Vagrantfile dir.
|
98
|
+
#
|
99
|
+
# These paths are added to the DSC Configuration running
|
100
|
+
# environment to enable local modules to be addressed.
|
101
|
+
#
|
102
|
+
# @return [Array] Set of relative module paths.
|
103
|
+
#dsc.module_path = []
|
104
|
+
|
105
|
+
# The type of synced folders to use when sharing the data
|
106
|
+
# required for the provisioner to work properly.
|
107
|
+
#
|
108
|
+
# By default this will use the default synced folder type.
|
109
|
+
# For example, you can set this to "nfs" to use NFS synced folders.
|
110
|
+
#dsc.synced_folder_type = ""
|
111
|
+
|
112
|
+
# Temporary working directory on the guest machine.
|
113
|
+
#dsc.temp_dir = "/tmp/vagrant-dsc"
|
85
114
|
end
|
86
115
|
end
|
data/lib/vagrant-dsc/config.rb
CHANGED
@@ -3,54 +3,96 @@ require "log4r"
|
|
3
3
|
|
4
4
|
module VagrantPlugins
|
5
5
|
module DSC
|
6
|
+
# The "Configuration" represents a configuration of how the DSC
|
7
|
+
# provisioner should behave: data directories, working directory,
|
8
|
+
# DSC Manifests etc.
|
6
9
|
class Config < Vagrant.plugin("2", :config)
|
7
10
|
extend Vagrant::Util::Counter
|
8
11
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
+
# Set of Parameters to pass to the DSC Configuration.
|
13
|
+
#
|
14
|
+
# @return [Hash] Set of k/v parameters to pass to DSC.
|
15
|
+
attr_accessor :configuration_params
|
16
|
+
|
17
|
+
# Relative path to a folder, containing the pre-generated MOF file.
|
18
|
+
#
|
19
|
+
# Path is relative to the folder containing the Vagrantfile.
|
20
|
+
attr_accessor :mof_path
|
21
|
+
|
22
|
+
# Relative path to the DSC Configuration file.
|
23
|
+
#
|
24
|
+
# Path is relative to the folder containing the Vagrantfile.
|
25
|
+
attr_accessor :configuration_file
|
26
|
+
|
27
|
+
# Relative path to the folder containing the root Configuration manifest file.
|
28
|
+
# Defaults to 'manifests'.
|
29
|
+
#
|
30
|
+
# Path is relative to the folder containing the Vagrantfile.
|
12
31
|
attr_accessor :manifests_path
|
32
|
+
|
33
|
+
# The name of the Configuration module
|
34
|
+
#
|
35
|
+
# Defaults to the basename of the "configuration_file"
|
36
|
+
# e.g. "Foo.ps1" becomes "Foo"
|
13
37
|
attr_accessor :configuration_name
|
38
|
+
|
39
|
+
# Set of module paths relative to the Vagrantfile dir.
|
40
|
+
#
|
41
|
+
# These paths are added to the DSC Configuration running
|
42
|
+
# environment to enable local modules to be addressed.
|
43
|
+
#
|
44
|
+
# @return [Array] Set of relative module paths.
|
14
45
|
attr_accessor :module_path
|
15
|
-
|
46
|
+
|
47
|
+
# The type of synced folders to use when sharing the data
|
48
|
+
# required for the provisioner to work properly.
|
49
|
+
#
|
50
|
+
# By default this will use the default synced folder type.
|
51
|
+
# For example, you can set this to "nfs" to use NFS synced folders.
|
16
52
|
attr_accessor :synced_folder_type
|
53
|
+
|
54
|
+
# Temporary working directory on the guest machine.
|
17
55
|
attr_accessor :temp_dir
|
18
|
-
|
56
|
+
|
57
|
+
# Fully qualified path to the configuration file.
|
58
|
+
#
|
59
|
+
# Do not override this.
|
60
|
+
attr_accessor :expanded_configuration_file
|
19
61
|
|
20
62
|
def initialize
|
21
63
|
super
|
22
64
|
|
23
|
-
@
|
24
|
-
@manifests_path
|
25
|
-
@configuration_name
|
26
|
-
@
|
27
|
-
@module_path
|
28
|
-
@
|
29
|
-
@
|
30
|
-
@
|
31
|
-
@temp_dir = UNSET_VALUE
|
32
|
-
@working_directory = UNSET_VALUE
|
33
|
-
|
65
|
+
@configuration_file = UNSET_VALUE
|
66
|
+
@manifests_path = UNSET_VALUE
|
67
|
+
@configuration_name = UNSET_VALUE
|
68
|
+
@mof_path = UNSET_VALUE
|
69
|
+
@module_path = UNSET_VALUE
|
70
|
+
@configuration_params = {}
|
71
|
+
@synced_folder_type = UNSET_VALUE
|
72
|
+
@temp_dir = UNSET_VALUE
|
34
73
|
@logger = Log4r::Logger.new("vagrant::vagrant_dsc")
|
35
74
|
end
|
36
75
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
end
|
42
|
-
|
76
|
+
# Final step of the Configuration lifecyle prior to
|
77
|
+
# validation.
|
78
|
+
#
|
79
|
+
# Ensures all attributes are set to defaults if not provided.
|
43
80
|
def finalize!
|
44
81
|
super
|
45
82
|
|
46
|
-
|
83
|
+
# Null checks
|
84
|
+
@configuration_file = "default.ps1" if @configuration_file == UNSET_VALUE
|
47
85
|
@module_path = nil if @module_path == UNSET_VALUE
|
48
86
|
@synced_folder_type = nil if @synced_folder_type == UNSET_VALUE
|
49
87
|
@temp_dir = nil if @temp_dir == UNSET_VALUE
|
50
|
-
@
|
51
|
-
@
|
52
|
-
@
|
53
|
-
|
88
|
+
@mof_path = nil if @mof_path == UNSET_VALUE
|
89
|
+
@configuration_name = File.basename(@configuration_file, File.extname(@configuration_file)) if @configuration_name == UNSET_VALUE
|
90
|
+
@manifests_path = File.dirname(@configuration_file) if @manifests_path == UNSET_VALUE
|
91
|
+
|
92
|
+
# Can't supply them both!
|
93
|
+
if (@configuration_file != nil && @mof_path != nil)
|
94
|
+
raise DSCError, :manifest_and_mof_provided
|
95
|
+
end
|
54
96
|
|
55
97
|
# Set a default temp dir that has an increasing counter so
|
56
98
|
# that multiple DSC definitions won't overwrite each other
|
@@ -62,6 +104,9 @@ module VagrantPlugins
|
|
62
104
|
|
63
105
|
# Returns the module paths as an array of paths expanded relative to the
|
64
106
|
# root path.
|
107
|
+
#
|
108
|
+
# @param [String|Array] root_path The relative path to expand module paths against.
|
109
|
+
# @return [Array] Set of fully qualified paths to the modules directories.
|
65
110
|
def expanded_module_paths(root_path)
|
66
111
|
return [] if !module_path
|
67
112
|
|
@@ -70,13 +115,17 @@ module VagrantPlugins
|
|
70
115
|
paths = module_path
|
71
116
|
paths = [paths] if !paths.is_a?(Array)
|
72
117
|
paths.map do |path|
|
73
|
-
Pathname.new(path).expand_path(root_path)
|
118
|
+
Pathname.new(path).expand_path(root_path).to_s
|
74
119
|
end
|
75
120
|
end
|
76
121
|
|
122
|
+
# Validate configuration and return a hash of errors.
|
77
123
|
#
|
78
|
-
#
|
124
|
+
# Does not check that DSC itself is properly configured, which is performed
|
125
|
+
# at run-time.
|
79
126
|
#
|
127
|
+
# @param [Machine] The current {Machine}
|
128
|
+
# @return [Hash] Any errors or {} if no errors found
|
80
129
|
def validate(machine)
|
81
130
|
@logger.info("==> Configurin' DSC man!")
|
82
131
|
errors = _detected_errors
|
@@ -85,20 +134,22 @@ module VagrantPlugins
|
|
85
134
|
this_expanded_module_paths = expanded_module_paths(machine.env.root_path)
|
86
135
|
|
87
136
|
# Manifest file validation
|
137
|
+
this_expanded_module_paths.each do |path|
|
138
|
+
errors << I18n.t("vagrant_dsc.errors.module_path_missing", path: path) if !Pathname.new(path).expand_path(machine.env.root_path).directory?
|
139
|
+
end
|
140
|
+
|
141
|
+
expanded_path = Pathname.new(manifests_path).
|
142
|
+
expand_path(machine.env.root_path)
|
143
|
+
|
144
|
+
if !expanded_path.directory?
|
145
|
+
errors << I18n.t("vagrant_dsc.errors.manifests_path_missing",
|
146
|
+
path: expanded_path.to_s)
|
147
|
+
end
|
88
148
|
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
errors << I18n.t("vagrant_dsc.errors.manifests_path_missing",
|
94
|
-
path: expanded_path.to_s)
|
95
|
-
else
|
96
|
-
expanded_manifest_file = expanded_path.join(manifest_file)
|
97
|
-
if !expanded_manifest_file.file? && !expanded_manifest_file.directory?
|
98
|
-
errors << I18n.t("vagrant_dsc.errors.manifest_missing",
|
99
|
-
manifest: expanded_manifest_file.to_s)
|
100
|
-
end
|
101
|
-
end
|
149
|
+
@expanded_configuration_file = expanded_path.join(File.basename(configuration_file))
|
150
|
+
if !expanded_configuration_file.file? && !expanded_configuration_file.directory?
|
151
|
+
errors << I18n.t("vagrant_dsc.errors.manifest_missing",
|
152
|
+
manifest: expanded_configuration_file.to_s)
|
102
153
|
end
|
103
154
|
|
104
155
|
{ "dsc provisioner" => errors }
|
@@ -30,3 +30,9 @@ en:
|
|
30
30
|
"Path to DSC Manifest folder does not exist: %{path}"
|
31
31
|
manifest_missing: |-
|
32
32
|
"Path to DSC Manifest does not exist: %{manifest}"
|
33
|
+
manifest_and_mof_provided: |-
|
34
|
+
"Cannot provide configuration_file and mof_path at the same time. Please provide only one of the two."
|
35
|
+
unsupported_operation: |-
|
36
|
+
"Operation unsupported / not-yet implemented: %{operation}"
|
37
|
+
absolute_module_path: |-
|
38
|
+
"Absolute 'module_path' not allowed. Please provide a path relative to your Vagrantfile."
|
data/lib/vagrant-dsc/plugin.rb
CHANGED
@@ -5,8 +5,8 @@ module VagrantPlugins
|
|
5
5
|
class Plugin < Vagrant.plugin("2")
|
6
6
|
name "DSC"
|
7
7
|
description <<-DESC
|
8
|
-
|
9
|
-
|
8
|
+
Provides support for provisioning your virtual machines with
|
9
|
+
DSC either using a local `DSC` Configuration or a DSC server.
|
10
10
|
DESC
|
11
11
|
|
12
12
|
config(:dsc, :provisioner) do
|
@@ -3,28 +3,47 @@ require 'erb'
|
|
3
3
|
|
4
4
|
module VagrantPlugins
|
5
5
|
module DSC
|
6
|
+
# DSC Errors namespace, including setup of locale-based error messages.
|
6
7
|
class DSCError < Vagrant::Errors::VagrantError
|
7
8
|
error_namespace("vagrant_dsc.errors")
|
8
9
|
I18n.load_path << File.expand_path("locales/en.yml", File.dirname(__FILE__))
|
9
10
|
end
|
10
|
-
|
11
|
+
class DSCUnsupportedOperation < DSCError
|
12
|
+
error_key(:unsupported_operation)
|
13
|
+
end
|
14
|
+
|
15
|
+
# DSC Provisioner Plugin.
|
16
|
+
#
|
17
|
+
# Runs the [Desired State Configuration](http://technet.microsoft.com/en-au/library/dn249912.aspx) system
|
18
|
+
# on a guest Virtual Machine, enabling you to quickly configure & bootstrap a Windows Virtual Machine in a repeatable,
|
19
|
+
# reliable fashion - the Vagrant way.
|
11
20
|
class Provisioner < Vagrant.plugin("2", :provisioner)
|
12
|
-
|
21
|
+
PowerShell_VERSION = 4
|
22
|
+
|
23
|
+
# Default path for storing the transient script runner
|
24
|
+
# This should be removed in cleanup
|
13
25
|
DSC_GUEST_RUNNER_PATH = "c:/tmp/vagrant-dsc-runner.ps1"
|
14
26
|
|
27
|
+
# Constructs the Provisioner Plugin.
|
28
|
+
#
|
29
|
+
# @param [Machine] machine The guest machine that is to be provisioned.
|
30
|
+
# @param [Config] config The Configuration object used by the Provisioner.
|
31
|
+
# @returns Provisioner
|
15
32
|
def initialize(machine, config)
|
16
33
|
super
|
17
34
|
|
18
35
|
@logger = Log4r::Logger.new("vagrant::provisioners::dsc")
|
19
36
|
end
|
20
37
|
|
38
|
+
# Configures the Provisioner.
|
39
|
+
#
|
40
|
+
# @param [Config] root_config The default configuration from the Vagrant hierarchy.
|
21
41
|
def configure(root_config)
|
22
|
-
@logger.info("==> Configuring DSC
|
42
|
+
@logger.info("==> Configuring DSC")
|
23
43
|
|
24
44
|
# Calculate the paths we're going to use based on the environment
|
25
45
|
root_path = @machine.env.root_path
|
26
46
|
@expanded_module_paths = @config.expanded_module_paths(root_path)
|
27
|
-
@manifest_file = File.join(manifests_guest_path, @config.manifest_file)
|
28
47
|
|
29
48
|
# Setup the module paths
|
30
49
|
@module_paths = []
|
@@ -38,6 +57,7 @@ module VagrantPlugins
|
|
38
57
|
|
39
58
|
# Share the manifests directory with the guest
|
40
59
|
@logger.info("==> Sharing manifest #{File.expand_path(@config.manifests_path, root_path)} | #{manifests_guest_path} | #{folder_opts}")
|
60
|
+
|
41
61
|
root_config.vm.synced_folder(
|
42
62
|
File.expand_path(@config.manifests_path, root_path),
|
43
63
|
manifests_guest_path, folder_opts)
|
@@ -49,6 +69,7 @@ module VagrantPlugins
|
|
49
69
|
end
|
50
70
|
end
|
51
71
|
|
72
|
+
# Provision the guest machine with DSC.
|
52
73
|
def provision
|
53
74
|
@logger.info("==> Provisioning DSC man! #{Vagrant.source_root}")
|
54
75
|
|
@@ -75,26 +96,35 @@ module VagrantPlugins
|
|
75
96
|
|
76
97
|
verify_dsc
|
77
98
|
|
78
|
-
generate_dsc_runner_script
|
79
|
-
|
80
|
-
run_dsc_apply
|
99
|
+
run_dsc_apply(generate_dsc_runner_script)
|
100
|
+
end
|
81
101
|
|
102
|
+
# Cleanup after a destroy action.
|
103
|
+
#
|
104
|
+
# This is the method called when destroying a machine that allows
|
105
|
+
# for any state related to the machine created by the provisioner
|
106
|
+
# to be cleaned up.
|
107
|
+
def cleanup
|
108
|
+
# Remove temp files? Or is this ONLY called in destroy (in which case those files will go anyway...)
|
82
109
|
end
|
83
110
|
|
111
|
+
# Local path (guest path) to the manifests directory.
|
84
112
|
def manifests_guest_path
|
85
113
|
File.join(config.temp_dir, config.manifests_path)
|
86
114
|
end
|
87
115
|
|
116
|
+
# Verify that a current version of WMF/Powershell is enabled on the guest.
|
88
117
|
def verify_dsc
|
89
118
|
verify_binary("Start-DscConfiguration")
|
90
119
|
|
91
120
|
# Confirm WMF 4.0+ in $PSVersionTable
|
92
121
|
@machine.communicate.test(
|
93
|
-
"(($PSVersionTable | ConvertTo-json | ConvertFrom-Json).PSVersion.Major) -ge #{
|
122
|
+
"(($PSVersionTable | ConvertTo-json | ConvertFrom-Json).PSVersion.Major) -ge #{PowerShell_VERSION}",
|
94
123
|
error_class: DSCError,
|
95
|
-
error_key: :
|
124
|
+
error_key: :dsc_incorrect_PowerShell_version )
|
96
125
|
end
|
97
126
|
|
127
|
+
# Verify the DSC binary is executable on the guest machine.
|
98
128
|
def verify_binary(binary)
|
99
129
|
@machine.communicate.sudo(
|
100
130
|
"which #{binary}",
|
@@ -105,25 +135,40 @@ module VagrantPlugins
|
|
105
135
|
|
106
136
|
# Install and Configure DSC where possible.
|
107
137
|
#
|
138
|
+
# Operation is current unsupported, but is likely to be enabled
|
139
|
+
# as a flag when the plugin detects an unsupported OS.
|
108
140
|
def install_dsc
|
141
|
+
# raise DSCError, I18n.t("vagrant_dsc.errors.manifest_missing", operation: "install_dsc")
|
142
|
+
raise DSCUnsupportedOperation, :operation => "install_dsc"
|
143
|
+
# Install chocolatey
|
109
144
|
|
110
145
|
# Ensure .NET 4.5 installed
|
111
146
|
|
112
147
|
# Ensure WMF 4.0 is installed
|
113
|
-
|
114
148
|
end
|
115
149
|
|
116
|
-
# Generates a
|
150
|
+
# Generates a PowerShell DSC runner script from an ERB template
|
151
|
+
#
|
152
|
+
# @return [String] The interpolated PowerShell script.
|
117
153
|
def generate_dsc_runner_script
|
118
154
|
path = File.expand_path("../templates/runner.ps1", __FILE__)
|
155
|
+
|
119
156
|
script = Vagrant::Util::TemplateRenderer.render(path, options: {
|
120
|
-
config: config,
|
121
|
-
module_paths: @module_paths,
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
157
|
+
config: @config,
|
158
|
+
module_paths: @module_paths.map { |k,v| v }.join(";"),
|
159
|
+
mof_path: @config.mof_path,
|
160
|
+
configuration_file: @config.configuration_file,
|
161
|
+
configuration_name: @config.configuration_name,
|
162
|
+
temp_path: @config.temp_dir,
|
163
|
+
parameters: @config.configuration_params.map { |k,v| "#{k}" + (!v.nil? ? " \"#{v}\"": '') }.join(" ")
|
126
164
|
})
|
165
|
+
end
|
166
|
+
|
167
|
+
# Writes the PowerShell DSC runner script to a location on the guest.
|
168
|
+
#
|
169
|
+
# @param [String] script The PowerShell DSC runner script.
|
170
|
+
# @return [String] the Path to the uploaded location on the guest machine.
|
171
|
+
def write_dsc_runner_script(script)
|
127
172
|
guest_script_path = DSC_GUEST_RUNNER_PATH
|
128
173
|
file = Tempfile.new(["vagrant-dsc-runner", "ps1"])
|
129
174
|
begin
|
@@ -138,29 +183,28 @@ module VagrantPlugins
|
|
138
183
|
guest_script_path
|
139
184
|
end
|
140
185
|
|
186
|
+
# Runs the DSC Configuration over the guest machine.
|
187
|
+
#
|
188
|
+
# Expects
|
141
189
|
def run_dsc_apply
|
142
190
|
|
191
|
+
# Check the DSC_GUEST_RUNNER_PATH exists?
|
192
|
+
|
143
193
|
# Set up Configuration arguments (hostname, manifest/module location, error levels ...)
|
144
194
|
|
145
195
|
# Where are the modules?
|
146
196
|
|
147
197
|
# Where is the manifest
|
148
198
|
|
149
|
-
# Setup $env:PSModulePath for execution env.
|
150
|
-
|
151
|
-
# Integrator -ConfigurationData "$SetupPath\Configuration\Development.psd1" -OutputPath $StagingPath -BasePath $AppBasePath
|
152
|
-
|
153
199
|
# TODO: Get a counter in here in case of multiple runs
|
154
200
|
|
155
|
-
# Apply configuration/parameters to DSC Runner
|
156
|
-
|
157
201
|
# Import starting point configuration into scope
|
158
202
|
|
159
|
-
command = "
|
203
|
+
command = ".\\'#{DSC_GUEST_RUNNER_PATH}'"
|
160
204
|
|
161
205
|
@machine.ui.info(I18n.t(
|
162
206
|
"vagrant_dsc.running_dsc",
|
163
|
-
manifest: config.
|
207
|
+
manifest: config.configuration_file))
|
164
208
|
|
165
209
|
opts = {
|
166
210
|
elevated: true,
|
@@ -175,6 +219,8 @@ module VagrantPlugins
|
|
175
219
|
end
|
176
220
|
end
|
177
221
|
|
222
|
+
# Verify that the shared folders have been properly configured
|
223
|
+
# on the guest machine.
|
178
224
|
def verify_shared_folders(folders)
|
179
225
|
folders.each do |folder|
|
180
226
|
@logger.info("Checking for shared folder: #{folder}")
|
@@ -184,9 +230,10 @@ module VagrantPlugins
|
|
184
230
|
end
|
185
231
|
end
|
186
232
|
|
233
|
+
# If on using WinRM, we can assume we are on Windows
|
187
234
|
def windows?
|
188
235
|
@machine.config.vm.communicator == :winrm
|
189
236
|
end
|
190
237
|
end
|
191
238
|
end
|
192
|
-
end
|
239
|
+
end
|
@@ -1,24 +1,32 @@
|
|
1
1
|
#
|
2
|
-
# DSC Runner
|
3
|
-
#
|
2
|
+
# DSC Runner.
|
3
|
+
#
|
4
|
+
# Bootstraps the DSC environment, sets up configuration data
|
5
|
+
# and runs the DSC Configuration.
|
6
|
+
#
|
4
7
|
#
|
5
8
|
|
6
|
-
# Set the local PowerShell
|
7
|
-
<% options[:module_paths]
|
8
|
-
|
9
|
-
|
9
|
+
# Set the local PowerShell Module environment path
|
10
|
+
<% if options[:module_paths] %>
|
11
|
+
echo "Adding to path: <%= options[:module_paths] %>"
|
12
|
+
$env:PSModulePath="<%= options[:module_paths] %>;${env:PSModulePath}"
|
10
13
|
<% end %>
|
11
14
|
|
15
|
+
$script = $(Join-Path "<%= options[:temp_path] %>" "<%= options[:configuration_file] %>")
|
12
16
|
echo "PSModulePath Configured: ${env:PSModulePath}"
|
13
|
-
echo "Running Configuration file:
|
17
|
+
echo "Running Configuration file: ${script}"
|
14
18
|
|
19
|
+
# Generate the MOF file, only if a MOF path not already provided.
|
20
|
+
<% if options[:mof_path] == nil %>
|
15
21
|
# Import the Manifest
|
16
|
-
. $
|
22
|
+
. $script
|
17
23
|
|
18
|
-
# Generate the MOF file
|
19
24
|
cd "<%= options[:temp_path] %>"
|
20
25
|
$StagingPath = $(Join-Path "<%= options[:temp_path] %>" "staging")
|
21
|
-
<%=
|
26
|
+
<%=options[:configuration_name]%> -MachineName "localhost" -OutputPath $StagingPath <%= options[:parameters] %>
|
27
|
+
<% else %>
|
28
|
+
$StagingPath = "<%= options[:mof_path] %>"
|
29
|
+
<% end %>
|
22
30
|
|
23
31
|
# Start a DSC Configuration run
|
24
32
|
Start-DscConfiguration -Force -Wait -Verbose -Path $StagingPath
|
data/lib/vagrant-dsc/version.rb
CHANGED