rvagrant 0.8.7.dev
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.
- data/.gitignore +25 -0
- data/.yardopts +1 -0
- data/CHANGELOG.md +386 -0
- data/Gemfile +21 -0
- data/LICENSE +21 -0
- data/README.md +61 -0
- data/Rakefile +11 -0
- data/bin/vagrant +28 -0
- data/config/default.rb +38 -0
- data/contrib/README.md +12 -0
- data/contrib/emacs/vagrant.el +8 -0
- data/contrib/vim/vagrantfile.vim +9 -0
- data/keys/README.md +17 -0
- data/keys/vagrant +27 -0
- data/keys/vagrant.ppk +26 -0
- data/keys/vagrant.pub +1 -0
- data/lib/vagrant.rb +44 -0
- data/lib/vagrant/action.rb +138 -0
- data/lib/vagrant/action/box.rb +11 -0
- data/lib/vagrant/action/box/destroy.rb +21 -0
- data/lib/vagrant/action/box/download.rb +72 -0
- data/lib/vagrant/action/box/package.rb +19 -0
- data/lib/vagrant/action/box/unpackage.rb +55 -0
- data/lib/vagrant/action/box/verify.rb +23 -0
- data/lib/vagrant/action/builder.rb +124 -0
- data/lib/vagrant/action/builtin.rb +108 -0
- data/lib/vagrant/action/env.rb +7 -0
- data/lib/vagrant/action/env/set.rb +18 -0
- data/lib/vagrant/action/environment.rb +50 -0
- data/lib/vagrant/action/general.rb +8 -0
- data/lib/vagrant/action/general/package.rb +113 -0
- data/lib/vagrant/action/general/validate.rb +19 -0
- data/lib/vagrant/action/vm.rb +34 -0
- data/lib/vagrant/action/vm/boot.rb +48 -0
- data/lib/vagrant/action/vm/check_accessible.rb +23 -0
- data/lib/vagrant/action/vm/check_box.rb +28 -0
- data/lib/vagrant/action/vm/check_guest_additions.rb +35 -0
- data/lib/vagrant/action/vm/clean_machine_folder.rb +43 -0
- data/lib/vagrant/action/vm/clear_forwarded_ports.rb +26 -0
- data/lib/vagrant/action/vm/clear_nfs_exports.rb +20 -0
- data/lib/vagrant/action/vm/clear_shared_folders.rb +27 -0
- data/lib/vagrant/action/vm/customize.rb +26 -0
- data/lib/vagrant/action/vm/destroy.rb +19 -0
- data/lib/vagrant/action/vm/destroy_unused_network_interfaces.rb +30 -0
- data/lib/vagrant/action/vm/discard_state.rb +22 -0
- data/lib/vagrant/action/vm/export.rb +52 -0
- data/lib/vagrant/action/vm/forward_ports.rb +133 -0
- data/lib/vagrant/action/vm/forward_ports_helpers.rb +28 -0
- data/lib/vagrant/action/vm/halt.rb +29 -0
- data/lib/vagrant/action/vm/host_name.rb +21 -0
- data/lib/vagrant/action/vm/import.rb +40 -0
- data/lib/vagrant/action/vm/match_mac_address.rb +26 -0
- data/lib/vagrant/action/vm/modify.rb +37 -0
- data/lib/vagrant/action/vm/network.rb +146 -0
- data/lib/vagrant/action/vm/nfs.rb +160 -0
- data/lib/vagrant/action/vm/nfs_helpers.rb +11 -0
- data/lib/vagrant/action/vm/package.rb +23 -0
- data/lib/vagrant/action/vm/package_vagrantfile.rb +33 -0
- data/lib/vagrant/action/vm/provision.rb +34 -0
- data/lib/vagrant/action/vm/provisioner_cleanup.rb +26 -0
- data/lib/vagrant/action/vm/resume.rb +20 -0
- data/lib/vagrant/action/vm/share_folders.rb +78 -0
- data/lib/vagrant/action/vm/suspend.rb +20 -0
- data/lib/vagrant/action/warden.rb +85 -0
- data/lib/vagrant/box.rb +90 -0
- data/lib/vagrant/box_collection.rb +53 -0
- data/lib/vagrant/cli.rb +55 -0
- data/lib/vagrant/command.rb +25 -0
- data/lib/vagrant/command/base.rb +106 -0
- data/lib/vagrant/command/box.rb +33 -0
- data/lib/vagrant/command/destroy.rb +17 -0
- data/lib/vagrant/command/group_base.rb +107 -0
- data/lib/vagrant/command/halt.rb +18 -0
- data/lib/vagrant/command/helpers.rb +33 -0
- data/lib/vagrant/command/init.rb +14 -0
- data/lib/vagrant/command/named_base.rb +14 -0
- data/lib/vagrant/command/package.rb +41 -0
- data/lib/vagrant/command/provision.rb +23 -0
- data/lib/vagrant/command/reload.rb +17 -0
- data/lib/vagrant/command/resume.rb +17 -0
- data/lib/vagrant/command/ssh.rb +49 -0
- data/lib/vagrant/command/ssh_config.rb +29 -0
- data/lib/vagrant/command/status.rb +31 -0
- data/lib/vagrant/command/suspend.rb +17 -0
- data/lib/vagrant/command/up.rb +19 -0
- data/lib/vagrant/command/upgrade_to_060.rb +45 -0
- data/lib/vagrant/command/version.rb +13 -0
- data/lib/vagrant/config.rb +123 -0
- data/lib/vagrant/config/base.rb +85 -0
- data/lib/vagrant/config/error_recorder.rb +19 -0
- data/lib/vagrant/config/nfs.rb +10 -0
- data/lib/vagrant/config/package.rb +9 -0
- data/lib/vagrant/config/ssh.rb +38 -0
- data/lib/vagrant/config/top.rb +61 -0
- data/lib/vagrant/config/vagrant.rb +17 -0
- data/lib/vagrant/config/vm.rb +148 -0
- data/lib/vagrant/config/vm/provisioner.rb +56 -0
- data/lib/vagrant/config/vm/sub_vm.rb +17 -0
- data/lib/vagrant/data_store.rb +70 -0
- data/lib/vagrant/downloaders.rb +7 -0
- data/lib/vagrant/downloaders/base.rb +23 -0
- data/lib/vagrant/downloaders/file.rb +22 -0
- data/lib/vagrant/downloaders/http.rb +70 -0
- data/lib/vagrant/environment.rb +516 -0
- data/lib/vagrant/errors.rb +352 -0
- data/lib/vagrant/hosts.rb +9 -0
- data/lib/vagrant/hosts/arch.rb +27 -0
- data/lib/vagrant/hosts/base.rb +76 -0
- data/lib/vagrant/hosts/bsd.rb +58 -0
- data/lib/vagrant/hosts/fedora.rb +11 -0
- data/lib/vagrant/hosts/linux.rb +69 -0
- data/lib/vagrant/plugin.rb +79 -0
- data/lib/vagrant/provisioners.rb +9 -0
- data/lib/vagrant/provisioners/base.rb +67 -0
- data/lib/vagrant/provisioners/chef.rb +155 -0
- data/lib/vagrant/provisioners/chef_client.rb +120 -0
- data/lib/vagrant/provisioners/chef_solo.rb +135 -0
- data/lib/vagrant/provisioners/puppet.rb +137 -0
- data/lib/vagrant/provisioners/puppet_server.rb +55 -0
- data/lib/vagrant/provisioners/shell.rb +96 -0
- data/lib/vagrant/ssh.rb +224 -0
- data/lib/vagrant/ssh/session.rb +136 -0
- data/lib/vagrant/systems.rb +13 -0
- data/lib/vagrant/systems/arch.rb +34 -0
- data/lib/vagrant/systems/base.rb +87 -0
- data/lib/vagrant/systems/debian.rb +36 -0
- data/lib/vagrant/systems/freebsd.rb +84 -0
- data/lib/vagrant/systems/gentoo.rb +27 -0
- data/lib/vagrant/systems/linux.rb +82 -0
- data/lib/vagrant/systems/linux/config.rb +21 -0
- data/lib/vagrant/systems/linux/error.rb +9 -0
- data/lib/vagrant/systems/redhat.rb +48 -0
- data/lib/vagrant/systems/solaris.rb +67 -0
- data/lib/vagrant/systems/suse.rb +9 -0
- data/lib/vagrant/systems/ubuntu.rb +17 -0
- data/lib/vagrant/test_helpers.rb +128 -0
- data/lib/vagrant/ui.rb +81 -0
- data/lib/vagrant/util.rb +13 -0
- data/lib/vagrant/util/busy.rb +59 -0
- data/lib/vagrant/util/counter.rb +24 -0
- data/lib/vagrant/util/hash_with_indifferent_access.rb +63 -0
- data/lib/vagrant/util/platform.rb +57 -0
- data/lib/vagrant/util/retryable.rb +25 -0
- data/lib/vagrant/util/safe_exec.rb +35 -0
- data/lib/vagrant/util/stacked_proc_runner.rb +35 -0
- data/lib/vagrant/util/template_renderer.rb +83 -0
- data/lib/vagrant/version.rb +6 -0
- data/lib/vagrant/vm.rb +181 -0
- data/templates/chef_server_client.erb +32 -0
- data/templates/chef_solo_solo.erb +23 -0
- data/templates/commands/init/Vagrantfile.erb +86 -0
- data/templates/config/validation_failed.erb +7 -0
- data/templates/locales/en.yml +556 -0
- data/templates/network_entry_arch.erb +9 -0
- data/templates/network_entry_debian.erb +8 -0
- data/templates/network_entry_gentoo.erb +5 -0
- data/templates/network_entry_redhat.erb +9 -0
- data/templates/nfs/exports.erb +5 -0
- data/templates/nfs/exports_linux.erb +5 -0
- data/templates/package_Vagrantfile.erb +11 -0
- data/templates/ssh_config.erb +15 -0
- data/test/unit/locales/en.yml +8 -0
- data/test/unit/test_helper.rb +28 -0
- data/test/unit/vagrant/action/box/destroy_test.rb +18 -0
- data/test/unit/vagrant/action/box/download_test.rb +125 -0
- data/test/unit/vagrant/action/box/package_test.rb +25 -0
- data/test/unit/vagrant/action/box/unpackage_test.rb +84 -0
- data/test/unit/vagrant/action/box/verify_test.rb +30 -0
- data/test/unit/vagrant/action/builder_test.rb +207 -0
- data/test/unit/vagrant/action/env/set_test.rb +24 -0
- data/test/unit/vagrant/action/environment_test.rb +27 -0
- data/test/unit/vagrant/action/general/package_test.rb +268 -0
- data/test/unit/vagrant/action/general/validate_test.rb +31 -0
- data/test/unit/vagrant/action/vm/boot_test.rb +66 -0
- data/test/unit/vagrant/action/vm/check_accessible_test.rb +61 -0
- data/test/unit/vagrant/action/vm/check_box_test.rb +56 -0
- data/test/unit/vagrant/action/vm/check_guest_additions_test.rb +9 -0
- data/test/unit/vagrant/action/vm/clean_machine_folder_test.rb +84 -0
- data/test/unit/vagrant/action/vm/clear_forwarded_ports_test.rb +52 -0
- data/test/unit/vagrant/action/vm/clear_nfs_exports_test.rb +22 -0
- data/test/unit/vagrant/action/vm/clear_shared_folders_test.rb +40 -0
- data/test/unit/vagrant/action/vm/customize_test.rb +37 -0
- data/test/unit/vagrant/action/vm/destroy_test.rb +25 -0
- data/test/unit/vagrant/action/vm/destroy_unused_network_interfaces_test.rb +49 -0
- data/test/unit/vagrant/action/vm/discard_state_test.rb +45 -0
- data/test/unit/vagrant/action/vm/export_test.rb +107 -0
- data/test/unit/vagrant/action/vm/forward_ports_helpers_test.rb +77 -0
- data/test/unit/vagrant/action/vm/forward_ports_test.rb +213 -0
- data/test/unit/vagrant/action/vm/halt_test.rb +79 -0
- data/test/unit/vagrant/action/vm/host_name_test.rb +36 -0
- data/test/unit/vagrant/action/vm/import_test.rb +66 -0
- data/test/unit/vagrant/action/vm/match_mac_address_test.rb +40 -0
- data/test/unit/vagrant/action/vm/modify_test.rb +38 -0
- data/test/unit/vagrant/action/vm/network_test.rb +286 -0
- data/test/unit/vagrant/action/vm/nfs_helpers_test.rb +26 -0
- data/test/unit/vagrant/action/vm/nfs_test.rb +260 -0
- data/test/unit/vagrant/action/vm/package_test.rb +25 -0
- data/test/unit/vagrant/action/vm/package_vagrantfile_test.rb +46 -0
- data/test/unit/vagrant/action/vm/provision_test.rb +65 -0
- data/test/unit/vagrant/action/vm/provisioner_cleanup_test.rb +56 -0
- data/test/unit/vagrant/action/vm/resume_test.rb +35 -0
- data/test/unit/vagrant/action/vm/share_folders_test.rb +144 -0
- data/test/unit/vagrant/action/vm/suspend_test.rb +35 -0
- data/test/unit/vagrant/action/warden_test.rb +125 -0
- data/test/unit/vagrant/action_test.rb +89 -0
- data/test/unit/vagrant/box_collection_test.rb +45 -0
- data/test/unit/vagrant/box_test.rb +74 -0
- data/test/unit/vagrant/cli_test.rb +35 -0
- data/test/unit/vagrant/command/base_test.rb +23 -0
- data/test/unit/vagrant/command/group_base_test.rb +15 -0
- data/test/unit/vagrant/command/helpers_test.rb +88 -0
- data/test/unit/vagrant/command/package_test.rb +27 -0
- data/test/unit/vagrant/config/base_test.rb +52 -0
- data/test/unit/vagrant/config/error_recorder_test.rb +18 -0
- data/test/unit/vagrant/config/ssh_test.rb +12 -0
- data/test/unit/vagrant/config/vagrant_test.rb +35 -0
- data/test/unit/vagrant/config/vm/provisioner_test.rb +92 -0
- data/test/unit/vagrant/config/vm_test.rb +56 -0
- data/test/unit/vagrant/config_test.rb +162 -0
- data/test/unit/vagrant/data_store_test.rb +77 -0
- data/test/unit/vagrant/downloaders/base_test.rb +28 -0
- data/test/unit/vagrant/downloaders/file_test.rb +48 -0
- data/test/unit/vagrant/downloaders/http_test.rb +82 -0
- data/test/unit/vagrant/environment_test.rb +598 -0
- data/test/unit/vagrant/errors_test.rb +42 -0
- data/test/unit/vagrant/hosts/base_test.rb +46 -0
- data/test/unit/vagrant/hosts/bsd_test.rb +53 -0
- data/test/unit/vagrant/hosts/linux_test.rb +54 -0
- data/test/unit/vagrant/plugin_test.rb +9 -0
- data/test/unit/vagrant/provisioners/base_test.rb +63 -0
- data/test/unit/vagrant/provisioners/chef_client_test.rb +190 -0
- data/test/unit/vagrant/provisioners/chef_solo_test.rb +114 -0
- data/test/unit/vagrant/provisioners/chef_test.rb +202 -0
- data/test/unit/vagrant/provisioners/puppet_server_test.rb +68 -0
- data/test/unit/vagrant/provisioners/puppet_test.rb +182 -0
- data/test/unit/vagrant/provisioners/shell_test.rb +79 -0
- data/test/unit/vagrant/ssh/session_test.rb +40 -0
- data/test/unit/vagrant/ssh_test.rb +307 -0
- data/test/unit/vagrant/systems/base_test.rb +18 -0
- data/test/unit/vagrant/systems/linux_test.rb +104 -0
- data/test/unit/vagrant/ui_test.rb +29 -0
- data/test/unit/vagrant/util/busy_test.rb +106 -0
- data/test/unit/vagrant/util/counter_test.rb +29 -0
- data/test/unit/vagrant/util/hash_with_indifferent_access_test.rb +39 -0
- data/test/unit/vagrant/util/platform_test.rb +18 -0
- data/test/unit/vagrant/util/retryable_test.rb +50 -0
- data/test/unit/vagrant/util/stacked_proc_runner_test.rb +43 -0
- data/test/unit/vagrant/util/template_renderer_test.rb +145 -0
- data/test/unit/vagrant/vm_test.rb +300 -0
- data/vagrant.gemspec +35 -0
- metadata +431 -0
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
require 'pathname'
|
|
2
|
+
|
|
3
|
+
module Vagrant
|
|
4
|
+
module Provisioners
|
|
5
|
+
# This class implements provisioning via chef-client, allowing provisioning
|
|
6
|
+
# with a chef server.
|
|
7
|
+
class ChefClient < Chef
|
|
8
|
+
register :chef_client
|
|
9
|
+
|
|
10
|
+
class Config < Chef::Config
|
|
11
|
+
attr_accessor :chef_server_url
|
|
12
|
+
attr_accessor :validation_key_path
|
|
13
|
+
attr_accessor :validation_client_name
|
|
14
|
+
attr_accessor :client_key_path
|
|
15
|
+
attr_accessor :file_cache_path
|
|
16
|
+
attr_accessor :file_backup_path
|
|
17
|
+
attr_accessor :environment
|
|
18
|
+
attr_accessor :encrypted_data_bag_secret_key_path
|
|
19
|
+
attr_accessor :encrypted_data_bag_secret
|
|
20
|
+
|
|
21
|
+
def initialize
|
|
22
|
+
super
|
|
23
|
+
|
|
24
|
+
@validation_client_name = "chef-validator"
|
|
25
|
+
@client_key_path = "/etc/chef/client.pem"
|
|
26
|
+
@file_cache_path = "/srv/chef/file_store"
|
|
27
|
+
@file_backup_path = "/srv/chef/cache"
|
|
28
|
+
@encrypted_data_bag_secret_key_path = nil
|
|
29
|
+
@encrypted_data_bag_secret = "/etc/chef/encrypted_data_bag_secret"
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def validate(errors)
|
|
33
|
+
super
|
|
34
|
+
|
|
35
|
+
errors.add(I18n.t("vagrant.config.chef.server_url_empty")) if !chef_server_url || chef_server_url.strip == ""
|
|
36
|
+
errors.add(I18n.t("vagrant.config.chef.validation_key_path")) if !validation_key_path
|
|
37
|
+
errors.add(I18n.t("vagrant.config.chef.run_list_empty")) if @run_list && @run_list.empty?
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def prepare
|
|
42
|
+
raise ChefError, :server_validation_key_required if config.validation_key_path.nil?
|
|
43
|
+
raise ChefError, :server_validation_key_doesnt_exist if !File.file?(validation_key_path)
|
|
44
|
+
raise ChefError, :server_url_required if config.chef_server_url.nil?
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def provision!
|
|
48
|
+
verify_binary(chef_binary_path("chef-client"))
|
|
49
|
+
chown_provisioning_folder
|
|
50
|
+
create_client_key_folder
|
|
51
|
+
upload_validation_key
|
|
52
|
+
upload_encrypted_data_bag_secret if config.encrypted_data_bag_secret_key_path
|
|
53
|
+
setup_json
|
|
54
|
+
setup_server_config
|
|
55
|
+
run_chef_client
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def create_client_key_folder
|
|
59
|
+
env.ui.info I18n.t("vagrant.provisioners.chef.client_key_folder")
|
|
60
|
+
path = Pathname.new(config.client_key_path)
|
|
61
|
+
|
|
62
|
+
vm.ssh.execute do |ssh|
|
|
63
|
+
ssh.sudo!("mkdir -p #{path.dirname}")
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def upload_validation_key
|
|
68
|
+
env.ui.info I18n.t("vagrant.provisioners.chef.upload_validation_key")
|
|
69
|
+
vm.ssh.upload!(validation_key_path, guest_validation_key_path)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def upload_encrypted_data_bag_secret
|
|
73
|
+
env.ui.info I18n.t("vagrant.provisioners.chef.upload_encrypted_data_bag_secret_key")
|
|
74
|
+
vm.ssh.upload!(encrypted_data_bag_secret_key_path, config.encrypted_data_bag_secret)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def setup_server_config
|
|
78
|
+
setup_config("chef_server_client", "client.rb", {
|
|
79
|
+
:node_name => config.node_name,
|
|
80
|
+
:chef_server_url => config.chef_server_url,
|
|
81
|
+
:validation_client_name => config.validation_client_name,
|
|
82
|
+
:validation_key => guest_validation_key_path,
|
|
83
|
+
:client_key => config.client_key_path,
|
|
84
|
+
:file_cache_path => config.file_cache_path,
|
|
85
|
+
:file_backup_path => config.file_backup_path,
|
|
86
|
+
:environment => config.environment,
|
|
87
|
+
:encrypted_data_bag_secret => config.encrypted_data_bag_secret
|
|
88
|
+
})
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def run_chef_client
|
|
92
|
+
command_env = config.binary_env ? "#{config.binary_env} " : ""
|
|
93
|
+
command = "#{command_env}#{chef_binary_path("chef-client")} -c #{config.provisioning_path}/client.rb -j #{config.provisioning_path}/dna.json"
|
|
94
|
+
|
|
95
|
+
env.ui.info I18n.t("vagrant.provisioners.chef.running_client")
|
|
96
|
+
vm.ssh.execute do |ssh|
|
|
97
|
+
ssh.sudo!(command) do |channel, type, data|
|
|
98
|
+
if type == :exit_status
|
|
99
|
+
ssh.check_exit_status(data, command)
|
|
100
|
+
else
|
|
101
|
+
env.ui.info("#{data}: #{type}")
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def validation_key_path
|
|
108
|
+
File.expand_path(config.validation_key_path, env.root_path)
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def encrypted_data_bag_secret_key_path
|
|
112
|
+
File.expand_path(config.encrypted_data_bag_secret_key_path, env.root_path)
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def guest_validation_key_path
|
|
116
|
+
File.join(config.provisioning_path, "validation.pem")
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
end
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
module Vagrant
|
|
2
|
+
module Provisioners
|
|
3
|
+
# This class implements provisioning via chef-solo.
|
|
4
|
+
class ChefSolo < Chef
|
|
5
|
+
register :chef_solo
|
|
6
|
+
|
|
7
|
+
extend Util::Counter
|
|
8
|
+
include Util::Counter
|
|
9
|
+
|
|
10
|
+
class Config < Chef::Config
|
|
11
|
+
attr_accessor :cookbooks_path
|
|
12
|
+
attr_accessor :roles_path
|
|
13
|
+
attr_accessor :data_bags_path
|
|
14
|
+
attr_accessor :recipe_url
|
|
15
|
+
attr_accessor :nfs
|
|
16
|
+
|
|
17
|
+
def initialize
|
|
18
|
+
super
|
|
19
|
+
|
|
20
|
+
@cookbooks_path = ["cookbooks", [:vm, "cookbooks"]]
|
|
21
|
+
@roles_path = nil
|
|
22
|
+
@data_bags_path = nil
|
|
23
|
+
@nfs = false
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def validate(errors)
|
|
27
|
+
super
|
|
28
|
+
|
|
29
|
+
errors.add(I18n.t("vagrant.config.chef.cookbooks_path_empty")) if !cookbooks_path || [cookbooks_path].flatten.empty?
|
|
30
|
+
errors.add(I18n.t("vagrant.config.chef.run_list_empty")) if !run_list || run_list.empty?
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
attr_reader :cookbook_folders
|
|
35
|
+
attr_reader :role_folders
|
|
36
|
+
attr_reader :data_bags_folders
|
|
37
|
+
|
|
38
|
+
def prepare
|
|
39
|
+
@cookbook_folders = expanded_folders(config.cookbooks_path)
|
|
40
|
+
@role_folders = expanded_folders(config.roles_path)
|
|
41
|
+
@data_bags_folders = expanded_folders(config.data_bags_path)
|
|
42
|
+
|
|
43
|
+
share_folders("csc", @cookbook_folders)
|
|
44
|
+
share_folders("csr", @role_folders)
|
|
45
|
+
share_folders("csdb", @data_bags_folders)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def provision!
|
|
49
|
+
verify_binary(chef_binary_path("chef-solo"))
|
|
50
|
+
chown_provisioning_folder
|
|
51
|
+
setup_json
|
|
52
|
+
setup_solo_config
|
|
53
|
+
run_chef_solo
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# Converts paths to a list of properly expanded paths with types.
|
|
57
|
+
def expanded_folders(paths)
|
|
58
|
+
return [] if paths.nil?
|
|
59
|
+
|
|
60
|
+
# Convert the path to an array if it is a string or just a single
|
|
61
|
+
# path element which contains the folder location (:host or :vm)
|
|
62
|
+
paths = [paths] if paths.is_a?(String) || paths.first.is_a?(Symbol)
|
|
63
|
+
|
|
64
|
+
paths.map do |path|
|
|
65
|
+
path = [:host, path] if !path.is_a?(Array)
|
|
66
|
+
type, path = path
|
|
67
|
+
|
|
68
|
+
# Create the local/remote path based on whether this is a host
|
|
69
|
+
# or VM path.
|
|
70
|
+
local_path = nil
|
|
71
|
+
local_path = File.expand_path(path, env.root_path) if type == :host
|
|
72
|
+
remote_path = nil
|
|
73
|
+
if type == :host
|
|
74
|
+
# Path exists on the host, setup the remote path
|
|
75
|
+
remote_path = "#{config.provisioning_path}/chef-solo-#{get_and_update_counter(:cookbooks_path)}"
|
|
76
|
+
else
|
|
77
|
+
# Path already exists on the virtual machine. Expand it
|
|
78
|
+
# relative to where we're provisioning.
|
|
79
|
+
remote_path = File.expand_path(path, config.provisioning_path)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# Return the result
|
|
83
|
+
[type, local_path, remote_path]
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# Shares the given folders with the given prefix. The folders should
|
|
88
|
+
# be of the structure resulting from the `expanded_folders` function.
|
|
89
|
+
def share_folders(prefix, folders)
|
|
90
|
+
folders.each do |type, local_path, remote_path|
|
|
91
|
+
if type == :host
|
|
92
|
+
env.config.vm.share_folder("v-#{prefix}-#{self.class.get_and_update_counter(:shared_folder)}",
|
|
93
|
+
remote_path, local_path, :nfs => config.nfs)
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def setup_solo_config
|
|
99
|
+
cookbooks_path = guest_paths(@cookbook_folders)
|
|
100
|
+
roles_path = guest_paths(@role_folders).first
|
|
101
|
+
data_bags_path = guest_paths(@data_bags_folders).first
|
|
102
|
+
|
|
103
|
+
setup_config("chef_solo_solo", "solo.rb", {
|
|
104
|
+
:node_name => config.node_name,
|
|
105
|
+
:provisioning_path => config.provisioning_path,
|
|
106
|
+
:cookbooks_path => cookbooks_path,
|
|
107
|
+
:recipe_url => config.recipe_url,
|
|
108
|
+
:roles_path => roles_path,
|
|
109
|
+
:data_bags_path => data_bags_path,
|
|
110
|
+
})
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def run_chef_solo
|
|
114
|
+
command_env = config.binary_env ? "#{config.binary_env} " : ""
|
|
115
|
+
command = "#{command_env}#{chef_binary_path("chef-solo")} -c #{config.provisioning_path}/solo.rb -j #{config.provisioning_path}/dna.json"
|
|
116
|
+
|
|
117
|
+
env.ui.info I18n.t("vagrant.provisioners.chef.running_solo")
|
|
118
|
+
vm.ssh.execute do |ssh|
|
|
119
|
+
ssh.sudo!(command) do |channel, type, data|
|
|
120
|
+
if type == :exit_status
|
|
121
|
+
ssh.check_exit_status(data, command)
|
|
122
|
+
else
|
|
123
|
+
env.ui.info("#{data}: #{type}")
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
# Extracts only the remote paths from a list of folders
|
|
130
|
+
def guest_paths(folders)
|
|
131
|
+
folders.map { |parts| parts[2] }
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
end
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
module Vagrant
|
|
2
|
+
module Provisioners
|
|
3
|
+
class PuppetError < Vagrant::Errors::VagrantError
|
|
4
|
+
error_namespace("vagrant.provisioners.puppet")
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
class Puppet < Base
|
|
8
|
+
register :puppet
|
|
9
|
+
|
|
10
|
+
class Config < Vagrant::Config::Base
|
|
11
|
+
attr_accessor :manifest_file
|
|
12
|
+
attr_accessor :manifests_path
|
|
13
|
+
attr_accessor :module_path
|
|
14
|
+
attr_accessor :pp_path
|
|
15
|
+
attr_accessor :options
|
|
16
|
+
|
|
17
|
+
def initialize
|
|
18
|
+
@manifest_file = nil
|
|
19
|
+
@manifests_path = "manifests"
|
|
20
|
+
@module_path = nil
|
|
21
|
+
@pp_path = "/tmp/vagrant-puppet"
|
|
22
|
+
@options = []
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Returns the manifests path expanded relative to the root path of the
|
|
26
|
+
# environment.
|
|
27
|
+
def expanded_manifests_path
|
|
28
|
+
Pathname.new(manifests_path).expand_path(env.root_path)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Returns the manifest file if set otherwise returns the box name pp file
|
|
32
|
+
# which may or may not exist.
|
|
33
|
+
def computed_manifest_file
|
|
34
|
+
manifest_file || "#{top.vm.box}.pp"
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Returns the module paths as an array of paths expanded relative to the
|
|
38
|
+
# root path.
|
|
39
|
+
def expanded_module_paths
|
|
40
|
+
return [] if !module_path
|
|
41
|
+
|
|
42
|
+
# Get all the paths and expand them relative to the root path, returning
|
|
43
|
+
# the array of expanded paths
|
|
44
|
+
paths = module_path
|
|
45
|
+
paths = [paths] if !paths.is_a?(Array)
|
|
46
|
+
paths.map do |path|
|
|
47
|
+
Pathname.new(path).expand_path(env.root_path)
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def validate(errors)
|
|
52
|
+
super
|
|
53
|
+
|
|
54
|
+
# Manifests path/file validation
|
|
55
|
+
if !expanded_manifests_path.directory?
|
|
56
|
+
errors.add(I18n.t("vagrant.provisioners.puppet.manifests_path_missing", :path => expanded_manifests_path))
|
|
57
|
+
else
|
|
58
|
+
if !expanded_manifests_path.join(computed_manifest_file).file?
|
|
59
|
+
errors.add(I18n.t("vagrant.provisioners.puppet.manifest_missing", :manifest => computed_manifest_file))
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# Module paths validation
|
|
64
|
+
expanded_module_paths.each do |path|
|
|
65
|
+
if !path.directory?
|
|
66
|
+
errors.add(I18n.t("vagrant.provisioners.puppet.module_path_missing", :path => path))
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def prepare
|
|
73
|
+
set_module_paths
|
|
74
|
+
share_manifests
|
|
75
|
+
share_module_paths
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def provision!
|
|
79
|
+
verify_binary("puppet")
|
|
80
|
+
run_puppet_client
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def share_manifests
|
|
84
|
+
env.config.vm.share_folder("manifests", manifests_guest_path, config.expanded_manifests_path)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def share_module_paths
|
|
88
|
+
count = 0
|
|
89
|
+
@module_paths.each do |from, to|
|
|
90
|
+
# Sorry for the cryptic key here, but VirtualBox has a strange limit on
|
|
91
|
+
# maximum size for it and its something small (around 10)
|
|
92
|
+
env.config.vm.share_folder("v-pp-m#{count}", to, from)
|
|
93
|
+
count += 1
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def set_module_paths
|
|
98
|
+
@module_paths = {}
|
|
99
|
+
config.expanded_module_paths.each_with_index do |path, i|
|
|
100
|
+
@module_paths[path] = File.join(config.pp_path, "modules-#{i}")
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def manifests_guest_path
|
|
105
|
+
File.join(config.pp_path, "manifests")
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def verify_binary(binary)
|
|
109
|
+
vm.ssh.execute do |ssh|
|
|
110
|
+
ssh.sudo!("which #{binary}", :error_class => PuppetError, :_key => :puppet_not_detected, :binary => binary)
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def run_puppet_client
|
|
115
|
+
options = [config.options].flatten
|
|
116
|
+
options << "--modulepath '#{@module_paths.values.join(':')}'" if !@module_paths.empty?
|
|
117
|
+
options << config.computed_manifest_file
|
|
118
|
+
options = options.join(" ")
|
|
119
|
+
|
|
120
|
+
commands = ["cd #{manifests_guest_path}",
|
|
121
|
+
"puppet apply #{options}"]
|
|
122
|
+
|
|
123
|
+
env.ui.info I18n.t("vagrant.provisioners.puppet.running_puppet", :manifest => config.computed_manifest_file)
|
|
124
|
+
|
|
125
|
+
vm.ssh.execute do |ssh|
|
|
126
|
+
ssh.sudo! commands do |ch, type, data|
|
|
127
|
+
if type == :exit_status
|
|
128
|
+
ssh.check_exit_status(data, commands)
|
|
129
|
+
else
|
|
130
|
+
env.ui.info(data)
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
module Vagrant
|
|
2
|
+
module Provisioners
|
|
3
|
+
class PuppetServerError < Vagrant::Errors::VagrantError
|
|
4
|
+
error_namespace("vagrant.provisioners.puppet_server")
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
class PuppetServer < Base
|
|
8
|
+
register :puppet_server
|
|
9
|
+
|
|
10
|
+
class Config < Vagrant::Config::Base
|
|
11
|
+
attr_accessor :puppet_server
|
|
12
|
+
attr_accessor :puppet_node
|
|
13
|
+
attr_accessor :options
|
|
14
|
+
|
|
15
|
+
def initialize
|
|
16
|
+
@puppet_server = "puppet"
|
|
17
|
+
@puppet_node = "puppet_node"
|
|
18
|
+
@options = []
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def provision!
|
|
23
|
+
verify_binary("puppetd")
|
|
24
|
+
run_puppetd_client
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def verify_binary(binary)
|
|
28
|
+
vm.ssh.execute do |ssh|
|
|
29
|
+
ssh.sudo!("which #{binary}", :error_class => PuppetServerError, :_key => :puppetd_not_detected, :binary => binary)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def run_puppetd_client
|
|
34
|
+
options = config.options
|
|
35
|
+
options = options.join(" ") if options.is_a?(Array)
|
|
36
|
+
if config.puppet_node
|
|
37
|
+
cn = config.puppet_node
|
|
38
|
+
else
|
|
39
|
+
cn = env.config.vm.box
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
commands = "puppetd #{options} --server #{config.puppet_server} --certname #{cn}"
|
|
43
|
+
|
|
44
|
+
env.ui.info I18n.t("vagrant.provisioners.puppet_server.running_puppetd")
|
|
45
|
+
|
|
46
|
+
vm.ssh.execute do |ssh|
|
|
47
|
+
ssh.sudo!(commands) do |channel, type, data|
|
|
48
|
+
ssh.check_exit_status(data, commands) if type == :exit_status
|
|
49
|
+
env.ui.info(data) if type != :exit_status
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|