vagrant-easyconfig 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 93cd001163f24e4b4e7f64d7282eefae86052e54d847d0b58adf2a7aea879905
4
+ data.tar.gz: 8f5e829d0f0aed4c023f0b686202cdef6680715ef094d887d2fa0b9d7f5ee5ea
5
+ SHA512:
6
+ metadata.gz: 716ea8b74b8583fddb4dbb122bc8efa7452fa95d72d9267ccb4157e39a78a5257aeae273b902630c6e1352944fa8ad4c091d03c918b9e817e23cad117693c86e
7
+ data.tar.gz: d811b419f8aa84392eb67737ec96fed9cf82d91a899e3e02b2251919a0c21083441d966fa65e732dd67c58c7a9b94d4655110fd1b4bda986e904f8c578d520bf
data/.gitignore ADDED
@@ -0,0 +1,3 @@
1
+ *.gem
2
+ Gemfile.lock
3
+
data/.gitlab-ci.yml ADDED
@@ -0,0 +1,9 @@
1
+ image: "ruby"
2
+
3
+ build:
4
+ script:
5
+ - gem build vagrant-easyconfig.gemspec
6
+ - mkdir -p ~/.gem; echo "---" > ~/.gem/credentials; chmod 0600 ~/.gem/credentials
7
+ - echo $RUBYGEMS_API >> ~/.gem/credentials
8
+ - gem push vagrant-easyconfig-*.gem
9
+
data/Gemfile ADDED
@@ -0,0 +1,11 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
4
+
5
+ group :development do
6
+ gem "vagrant", git: "https://github.com/hashicorp/vagrant.git"
7
+ end
8
+
9
+ group :plugins do
10
+ gem "vagrant-easyconfig" , path: "."
11
+ end
data/README.md ADDED
@@ -0,0 +1,197 @@
1
+ # EasyConfig Vagrant Plugin
2
+
3
+ This plugin is a collection of Ruby-files that can be placed inside a [Vagrant](https://www.vagrantup.com/) directory. When used it helps with configuring plugins, defining the VMs and provisioning with Ansible by providing a simple to configure YAML-file.
4
+
5
+
6
+ ## Installation
7
+
8
+ `vagrant plugin install vagrant-easyconfig`
9
+
10
+
11
+ ## YAML-File
12
+
13
+ The configuration file is hard-coded on purpose and when it is non-existent it will be created an can then be adapted therefrom. The file looks as follows
14
+
15
+ ```yaml
16
+ ---
17
+ default:
18
+ vm:
19
+ gui: false
20
+ memory: 4096
21
+ cpus: 4
22
+ storage: 10GB
23
+ # list of boxes that may be used for this project
24
+ boxes:
25
+ ubuntu1804: ubuntu/bionic64
26
+ ubuntu: ubuntu/focal64
27
+ # key for the box that is used for this project
28
+ box: ubuntu
29
+ hosts:
30
+ # name of the host
31
+ example-host:
32
+ # if no ip is given it will be generated from net.ip
33
+ ip:
34
+ # groups used for ansible
35
+ groups:
36
+ # aliases are added to the /etc/hosts on the host and guest
37
+ aliases:
38
+ # override vm options per host
39
+ # vm:
40
+ # memory: 8192
41
+ plugins:
42
+ # automatically installs vbguest, hostmanager and disksize
43
+ auto_install: true
44
+ vbguest:
45
+ # turn off auto_update of vbguest
46
+ auto_update: true
47
+ linked_clones: true
48
+ net:
49
+ # ip to auto generate IPs from
50
+ # incrementing by 1 for every host
51
+ ip: 192.168.100.100
52
+ private_nic_type: 82540EM
53
+ network_type: private_network
54
+ ansible:
55
+ # whether to use ansible_local or ansible provisioner
56
+ local: true
57
+ # whether to install ansible with guest OS or pip
58
+ pip: false
59
+ # where the ansible project is located
60
+ playbook_path:
61
+ # where the playbook is located inside the ansible project
62
+ playbook:
63
+ # when used passes the extra_vars to ansible
64
+ extra_vars:
65
+ # when used only tasks with these tags are run
66
+ tags:
67
+ # when used all tasks except for one with these tags are run
68
+ skip_tags:
69
+ # toggle verbose logging for ansible
70
+ verbose: false
71
+ # will be disable on unix systems
72
+ windows:
73
+ ssh:
74
+ # specify ssh-key location
75
+ key:
76
+ # override for current host
77
+ # by specifying the hostname of the current machine
78
+ # all settings under this key are overriding the default section
79
+ # example-host:
80
+ # vm:
81
+ # memory: 8192
82
+ # hosts:
83
+ # example-host:
84
+ # vm:
85
+ # memory: 16384
86
+ ```
87
+
88
+ ### Overriding
89
+
90
+ There are two sections that can be utilized for overriding default values.
91
+
92
+ #### Overriding per Host
93
+
94
+ Supposing a project is used on different hosts which in turn have a different set of resources available (which is expected and does not impair the functionality of the project for the intended purposes). Then it would be helpful to dedicate a specific amount of resources to the project (VM) depending on that host. For this reason and others it is possible to override all of the settings inside the `default` block by custom values depending on the host it is used in.
95
+
96
+ Therefore one has to specify another block below the `default` block, the key being the `hostname` of the host. When the host's `hostname` is **example-host** the key should be **example-host**. An example is given in the code above from line 61-68.
97
+
98
+ ---
99
+
100
+ This may also benefit if for example the Vagrant version is different and in one it is not possible to use the `pip-installation` of `Ansible`. Or some provisioning should be skipped, then it can be set in the `host`-specific section with `Ansible`-tags.
101
+
102
+ #### Overriding per Guest
103
+
104
+ Sometimes one expects all the Guest-VMs to have the same specifications, e.g. when creating a Kubernetes-Cluster. However, if the setup requires different Hosts, i.e. database-hosts, master- and slaves, control- and production-machines, then the Guest-machines may need different specs. Therefore it is possible to define a `vm`-section inside the `host`-section. This then overrides the default values of the `vm`-section. An example is given in the code above in line 23-25.
105
+
106
+ ### Boxes
107
+
108
+ It is possible to specify a list of boxes in the `boxes`-section. The `box`-section then is set with the key from the `boxes`-section. That makes sense, when the project should support multiple platforms and those should be persisted.
109
+
110
+ ### IPs
111
+
112
+ The section `net.ip` specifies the base IP-address. When no IPs are specified inside the `host`-sections this one is used and incremented by one for every guest, and then assigning it.
113
+
114
+ This can be overridden by specifying an IP-address directly in the `host`-section as can be seen in line 36.
115
+
116
+ ### Groups
117
+
118
+ Groups refer to `Ansible`-groups. This is a simple way to group Guests together. Only single strings or a simple list of strings is allowed, so no complex nested groups can be created like this.
119
+
120
+ ### Aliases
121
+
122
+ A host may need aliases that should be specified to make it reachable through different `hostnames`. Rancher's UI (Website of the Kubernetes-Product Rancher), can only be access through a root path of a URL, as otherwise assets are not reachable. Therefore this product requires the host to be reachable via two `hostnames`. One for the UI and one for reaching the Kubernetes-services themselves.
123
+
124
+ the `hosts.*.aliases`-section is a string-list and those will be added to the host's and guest's `/etc/hosts`-files.
125
+
126
+ ### Plugins
127
+
128
+ The `plugins.auto_install`-section allows toggling on and off the auto installation of the plugins `vagrant-vbguest`, `vagrant-hostmanager` and `vagrant-disksize`.
129
+
130
+ The `plugins.vbguest.auto_update`-section allows toggling on and off the auto installation of the most recent version of the `VirtualBox Guest Extensions`.
131
+
132
+ ### Ansible
133
+
134
+ | section | default | description |
135
+ | --------------- | -------------- | ------------------------------------------------------------ |
136
+ | `local` | `true` | Use the `ansible_local` provisioner. Meaning the `Ansible` project is directly invoked on the Guest-machine by specifying the target to be `localhost` and the `connection` being `local`.<br />Otherwise use the `ansible` provisioner, invoking `Ansible` from the host against the Guest-machine. |
137
+ | `pip` | `false` | Use the `pip` to install `Ansible` on the Guest-machine, when not available and using `local=true`.<br />Otherwise use the systems package manager to install `Ansible`, i.e. aptitude, yum, dnf... |
138
+ | `playbook_path` | `ansible` | The location of the `Ansible`-project. If nothing is specified the directory `<vagrant-directory>/ansible` is assumed. |
139
+ | `playbook` | `playbook.yml` | The location of the `Playbook`-file. If nothing is specified `playbook.yml` is assumed. |
140
+ | `extra_vars` | `nil` | If used passes the extra_vars to `Ansible`. |
141
+ | `tags` | `nil` | If specified only tasks/roles with these tags are run. |
142
+ | `skip_tags` | `nil` | If specified tasks/roles with these tags are skipped. |
143
+ | `verbose` | `false` | Make output more verbose. |
144
+
145
+ ## Usage
146
+
147
+ A classic usage of the plugin looks as follows:
148
+
149
+ ```ruby
150
+ # -*- mode: ruby -*-
151
+ # vi: set ft=ruby :
152
+
153
+ EasyConfig::Config.load("config.yaml")
154
+ EasyConfig::Config.print()
155
+
156
+ Vagrant.configure("2") do |config|
157
+ EasyConfig::Plugins.configure(config)
158
+ EasyConfig::VM.each(config) do |host|
159
+ # do something except defining
160
+ end
161
+ end
162
+
163
+ ```
164
+
165
+ ### Load the config.yaml
166
+
167
+ ```ruby
168
+ EasyConfig::Config.load("config.yaml")
169
+ ```
170
+
171
+ In the previous major section, the `config.yaml` was described. This one has to be loaded. If the file does not exist, a `config.yaml.template` is automatically created at the specified location, which can then be moved or copied and adapted.
172
+
173
+ ### Always see the configuration
174
+
175
+ ```ruby
176
+ EasyConfig::Config.print()
177
+ ```
178
+
179
+ This will just print out the configuration. By putting this directly after loading it is shown with every `vagrant` command executed. It could also be put in the trigger sections if needed.
180
+
181
+ ### Plugin-Configuration
182
+
183
+ ```ruby
184
+ EasyConfig::Plugins.configure(config)
185
+ ```
186
+
187
+ Plugins mostly need the `config` to be configured. Thus the `config` has to be passed to the `EasyConfig::Plugins` module, for it to be able to configure the plugins on the host-level, i.e. for each guest the same configuration.
188
+
189
+ ### Define the VMs
190
+
191
+ ```ruby
192
+ EasyConfig::VM.each(config) do |host|
193
+ # do something except defining
194
+ end
195
+ ```
196
+
197
+ This is enough to define all the VMs specified inside the `config.yaml` with the `Ansible`-provisioner. It is still possible to add further configuration code inside the block of the `each`-function which gets the `host`-configuration passed.
@@ -0,0 +1,20 @@
1
+ # -*- mode: ruby -*-
2
+ # vi: set ft=ruby :
3
+
4
+ begin
5
+ require 'vagrant'
6
+ rescue LoadError
7
+ raise 'The EasyConfig Vagrant Plugin must be run within Vagrant'
8
+ end
9
+
10
+ module EasyConfig
11
+ class Plugin < Vagrant.plugin('2')
12
+ name 'EasyConfig'
13
+ end
14
+ end
15
+
16
+ require_relative "vagrant-easyconfig/hash.rb"
17
+ require_relative "vagrant-easyconfig/os.rb"
18
+ require_relative "vagrant-easyconfig/plugins.rb"
19
+ require_relative "vagrant-easyconfig/config.rb"
20
+ require_relative "vagrant-easyconfig/vm.rb"
@@ -0,0 +1,181 @@
1
+ # -*- mode: ruby -*-
2
+ # vi: set ft=ruby :
3
+
4
+ require_relative "config_template.rb"
5
+ require_relative "os.rb"
6
+ require "yaml"
7
+ require "ipaddr"
8
+
9
+ module EasyConfig
10
+ module Config
11
+ extend self
12
+
13
+ @@config = {}
14
+
15
+ def self.load(path)
16
+ config_path = File.expand_path(path, Dir.pwd)
17
+ vagrantfile_path = File.expand_path('Vagrantfile', Dir.pwd)
18
+ unless File.exist? vagrantfile_path
19
+ config_path = File.expand_path(path, File.dirname(File.dirname(File.dirname(__FILE__))))
20
+ end
21
+ unless File.exist? config_path
22
+ File.write("#{config_path}.template", @@config_template)
23
+ abort <<~EOL
24
+ Easyconfig:Config.load: Cannot load file [#{config_path}]
25
+ Easyconfig:Config.load: Create template [#{config_path}.template]
26
+ Easyconfig:Config.load: Copy the template to [#{config_path}] and adapt
27
+ EOL
28
+ end
29
+
30
+ self.merge_template config_path
31
+ self.merge_default
32
+ self.set_hostnames
33
+ self.set_boxes
34
+ self.auto_install_plugins
35
+ self.initialize_ansible
36
+
37
+ unless OS.windows?
38
+ @@config.delete("windows")
39
+ end
40
+
41
+ self.post_initialize
42
+ return nil
43
+ end
44
+
45
+ def self.get(*args)
46
+ if @@config == nil
47
+ abort "Easyconfig:Config.get: load config first with [Config.load(path)]"
48
+ end
49
+ if args.length == 0
50
+ return Marshal.load(Marshal.dump(@@config))
51
+ end
52
+ return Marshal.load(Marshal.dump(@@config.dig(*args)))
53
+ end
54
+
55
+ def self.print
56
+ if @@config == nil
57
+ abort "Easyconfig:Config.print: load config first with [Config.load(path)]"
58
+ end
59
+ puts @@config.to_yaml
60
+ puts "---\n\n"
61
+ return nil
62
+ end
63
+
64
+ private
65
+
66
+ def self.merge_template(config_path)
67
+ template = YAML.load(@@config_template)
68
+ # remove default host as it needs to be overridden
69
+ template["default"]["hosts"] = {}
70
+ file = YAML.load_file(config_path)
71
+ @@config = template.deep_merge!(file)
72
+ end
73
+
74
+ def self.merge_default
75
+ hostname = "#{`hostname`[0..-2]}"
76
+ default = @@config.fetch("default")
77
+ key = [hostname, hostname.downcase].detect {|key| @@config.key?(key)}
78
+ if key and (specific = @@config.fetch(key)) != nil
79
+ default.deep_merge!(specific)
80
+ end
81
+ @@config = default
82
+
83
+ vm = @@config.fetch("vm")
84
+ ip = @@config.dig("net", "ip")
85
+ hosts = @@config.fetch("hosts")
86
+ hosts.each_with_index do |item, index|
87
+ hostname = item[0]
88
+ unless item[1]
89
+ hosts[hostname] = {}
90
+ end
91
+ host = hosts[hostname]
92
+ # create temporary copy of host
93
+ temp = Marshal.load(Marshal.dump(host))
94
+ # override host with default values
95
+ host["vm"] = host.fetch("vm", {}).deep_merge!(vm)
96
+ # re-override host with previous values from temp
97
+ host["vm"].deep_merge!(temp.fetch("vm", {}))
98
+
99
+ if host.fetch("ip","") == nil or host.fetch("ip",nil) == nil
100
+ host["ip"] = IPAddr.new(IPAddr.new(ip, Socket::AF_INET).to_i + index, Socket::AF_INET).to_s
101
+ end
102
+ end
103
+ @@config.delete("vm")
104
+ @@config["net"].delete("ip")
105
+ end
106
+
107
+ def self.set_hostnames
108
+ @@config.fetch("hosts").keys.each do |guestname|
109
+
110
+ if @@config.dig("hosts", guestname).key?("aliases")
111
+ aliases = @@config.dig("hosts", guestname, "aliases")
112
+ if aliases.kind_of?(Array) && aliases.length > 0
113
+ aliases = aliases.map {|a| a = "#{`hostname`[0..-2].downcase}-#{a}"}
114
+ @@config["hosts"][guestname]["aliases"] = aliases
115
+ end
116
+ end
117
+
118
+ @@config["hosts"]["#{`hostname`[0..-2]}-#{guestname}".downcase] = @@config["hosts"][guestname]
119
+ @@config["hosts"].delete(guestname)
120
+ end
121
+ end
122
+
123
+ def self.set_boxes
124
+ # box = @@config.dig("vm","boxes").fetch(@@config.dig("vm","box"))
125
+ # @@config["vm"]["box"] = box
126
+ # @@config["vm"].delete("boxes")
127
+
128
+ @@config.fetch("hosts").each do |hostname, host|
129
+ box = host.dig("vm", "boxes").fetch(host.dig("vm","box"))
130
+ host["vm"]["box"] = box
131
+ host["vm"].delete("boxes")
132
+ end
133
+ end
134
+
135
+ def self.auto_install_plugins
136
+ if @@config.dig("plugins","auto_install")
137
+ required_plugins = %w( vagrant-hostmanager vagrant-vbguest vagrant-disksize )
138
+ _retry = false
139
+ required_plugins.each do |plugin|
140
+ unless Vagrant.has_plugin? plugin
141
+ system "vagrant plugin install #{plugin}"
142
+ _retry=true
143
+ end
144
+ end
145
+
146
+ if (_retry)
147
+ exec "vagrant " + ARGV.join(' ')
148
+ end
149
+ end
150
+ end
151
+
152
+ def self.initialize_ansible
153
+ project_path = @@config.dig("ansible","project_path")
154
+ if project_path == nil or project_path == ""
155
+ project_path = "ansible"
156
+ end
157
+ if @@config.dig("ansible","local")
158
+ project_path = "/vagrant/#{ project_path }".gsub(%r{/+},'/')
159
+ end
160
+ @@config["ansible"]["project_path"] = project_path
161
+
162
+ playbook = @@config.dig("ansible","playbook")
163
+ if playbook == nil or playbook == ""
164
+ playbook = "playbook.yml"
165
+ end
166
+ @@config["ansible"]["playbook"] = playbook.gsub(%r{/+},'/')
167
+ end
168
+ def self.post_initialize
169
+ if OS.windows?
170
+ unless @@config.dig("windows","ssh","key") != nil and @@config.dig("windows","ssh","key") != ""
171
+ abort <<~EOL
172
+ Easyconfig:Config.initialize_ansible: On Windows please add [windows.ssh.key] to config.yaml
173
+ Easyconfig:Config.initialize_ansible: and pass the absolute path to your ssh key file
174
+ EOL
175
+ end
176
+ config.ssh.insert_key = false
177
+ config.ssh.private_key_path = [@@config.dig("windows","ssh","key")]
178
+ end
179
+ end
180
+ end
181
+ end
@@ -0,0 +1,76 @@
1
+ module EasyConfig
2
+ module Config
3
+ @@config_template = <<-EOL.strip
4
+ ---
5
+ default:
6
+ vm:
7
+ gui: false
8
+ memory: 4096
9
+ cpus: 4
10
+ storage: 10GB
11
+ # list of boxes that may be used for this project
12
+ boxes:
13
+ ubuntu1804: ubuntu/bionic64
14
+ ubuntu: ubuntu/focal64
15
+ # key for the box that is used for this project
16
+ box: ubuntu
17
+ hosts:
18
+ # name of the host
19
+ example-host:
20
+ # if no ip is given it will be generated from net.ip
21
+ ip:
22
+ # groups used for ansible
23
+ groups:
24
+ # aliases are added to the /etc/hosts on the host and guest
25
+ aliases:
26
+ # override vm options per host
27
+ # vm:
28
+ # memory: 8192
29
+ plugins:
30
+ # automatically installs vbguest, hostmanager and disksize
31
+ auto_install: true
32
+ vbguest:
33
+ # turn off auto_update of vbguest
34
+ auto_update: true
35
+ linked_clones: true
36
+ net:
37
+ # ip to auto generate IPs from
38
+ # incrementing by 1 for every host
39
+ ip: 192.168.100.100
40
+ private_nic_type: 82540EM
41
+ network_type: private_network
42
+ ansible:
43
+ # whether to use ansible_local or ansible provisioner
44
+ local: true
45
+ # whether to install ansible with guest OS or pip
46
+ pip: false
47
+ # where the ansible project is located
48
+ project_path:
49
+ # where the playbook is located inside the ansible project
50
+ playbook:
51
+ # when used passes the extra_vars to ansible
52
+ extra_vars:
53
+ # when used only tasks with these tags are run
54
+ tags:
55
+ # when used all tasks except for one with these tags are run
56
+ skip_tags:
57
+ # toggle verbose logging for ansible
58
+ verbose: false
59
+ # will be disable on unix systems
60
+ windows:
61
+ ssh:
62
+ # specify ssh-key location
63
+ key:
64
+ # override for current host
65
+ # by specifying the hostname of the current machine
66
+ # all settings under this key are overriding the default section
67
+ #{`hostname`[0..-2].downcase}:
68
+ # vm:
69
+ # memory: 8192
70
+ # hosts:
71
+ # example-host:
72
+ # vm:
73
+ # memory: 16384
74
+ EOL
75
+ end
76
+ end
@@ -0,0 +1,17 @@
1
+ # -*- mode: ruby -*-
2
+ # vi: set ft=ruby :
3
+
4
+ class ::Hash
5
+ def deep_merge(second)
6
+ merger = proc { |_, v1, v2| Hash === v1 && Hash === v2 ? v1.merge(v2, &merger) : Array === v1 && Array === v2 ? v1 | v2 : [:undefined, nil, :nil].include?(v2) ? v1 : v2 }
7
+ merge(second.to_h, &merger)
8
+ end
9
+ def deep_merge!(second)
10
+ merger = proc { |_, v1, v2| Hash === v1 && Hash === v2 ? v1.merge!(v2, &merger) : Array === v1 && Array === v2 ? v1 | v2 : [:undefined, nil, :nil].include?(v2) ? v1 : v2 }
11
+ merge!(second.to_h, &merger)
12
+ end
13
+ def deep_update!(second)
14
+ merger = proc { |_, v1, v2| Hash === v1 && Hash === v2 ? v1.merge!(v2.select { |k| v1.keys.include? k }, &merger) : Array === v1 && Array === v2 ? v1 | v2 : [:undefined, nil, :nil].include?(v2) ? v1 : v2 }
15
+ merge!(second.to_h.select { |k| keys.include? k }, &merger)
16
+ end
17
+ end
@@ -0,0 +1,20 @@
1
+ # -*- mode: ruby -*-
2
+ # vi: set ft=ruby :
3
+
4
+ module OS
5
+ def OS.windows?
6
+ (/cygwin|mswin|mingw|bccwin|wince|emx/ =~ RUBY_PLATFORM) != nil
7
+ end
8
+
9
+ def OS.mac?
10
+ (/darwin/ =~ RUBY_PLATFORM) != nil
11
+ end
12
+
13
+ def OS.unix?
14
+ !OS.windows?
15
+ end
16
+
17
+ def OS.linux?
18
+ OS.unix? and not OS.mac?
19
+ end
20
+ end
@@ -0,0 +1,70 @@
1
+ # -*- mode: ruby -*-
2
+ # vi: set ft=ruby :
3
+
4
+ module EasyConfig
5
+ module Plugins
6
+ def self.configure(config)
7
+ self.configure_hostmanager(config)
8
+ self.configure_vbguest(config)
9
+ return nil
10
+ end
11
+
12
+ def self.configure_hostmanager(config)
13
+ if Vagrant.has_plugin?('vagrant-hostmanager')
14
+ config.hostmanager.enabled = true
15
+ config.hostmanager.manage_host = true
16
+ config.hostmanager.manage_guest = true
17
+ config.hostmanager.ignore_private_ip = false
18
+ config.hostmanager.include_offline = true
19
+ else
20
+ puts <<~EOL
21
+ Easyconfig:Plugins.configure_hostmanager: no hosts plugin installed, thus no aliases are added to the /etc/hosts file
22
+ Easyconfig:Plugins.configure_hostmanager: plugin examples: vagrant-hostmanager
23
+ EOL
24
+ end
25
+ return nil
26
+ end
27
+
28
+ def self.configure_vbguest(config)
29
+ if Vagrant.has_plugin?("vagrant-vbguest")
30
+ auto_update = Config.get("plugins","vbguest","auto_update")
31
+ config.vbguest.auto_update = auto_update != nil ? auto_update : true
32
+ if OS.unix?
33
+ config.vm.synced_folder ".", "/vagrant", disabled: false
34
+ else
35
+ config.vm.synced_folder ".", "/vagrant", disabled: false, mount_options: ["dmode=0755,fmode=0644"]
36
+ end
37
+ else
38
+ puts <<~EOL
39
+ Easyconfig:Plugins.configure_vbguest: no vagrant-vbguest plugin installed, thus no autoupdates and synced folders are working
40
+ Easyconfig:Plugins.configure_vbguest: install with: vagrant plugin install vagrant-vbguest
41
+ EOL
42
+ end
43
+ return nil
44
+ end
45
+
46
+ def self.configure_disksize(config)
47
+ if Vagrant.has_plugin?("vagrant-disksize")
48
+ config.disksize.size = Config.get("hosts", config.vm.hostname, "vm","storage")
49
+ else
50
+ puts <<~EOL
51
+ Easyconfig:Plugins.configure_disksize: no disksize plugin installed, thus storage is not set correctly to #{ vm.fetch("storage") }
52
+ Easyconfig:Plugins.configure_disksize: vagrant plugin install vagrant-disksize
53
+ EOL
54
+ end
55
+ return nil
56
+ end
57
+
58
+ def self.add_aliases(config)
59
+ if Vagrant.has_plugin?('vagrant-hostmanager')
60
+ if Config.get("hosts", config.vm.hostname).key?("aliases")
61
+ aliases = Config.get("hosts", config.vm.hostname,"aliases")
62
+ if aliases.kind_of?(Array) && aliases.length > 0
63
+ config.hostmanager.aliases = aliases
64
+ end
65
+ end
66
+ end
67
+ return nil
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,100 @@
1
+ # -*- mode: ruby -*-
2
+ # vi: set ft=ruby :
3
+
4
+ module EasyConfig
5
+ module VM
6
+ extend self
7
+
8
+ def self.each(config, &block)
9
+ hostnames = Config.get("hosts").keys
10
+ Config.get("hosts").each_with_index do |item, index|
11
+ hostname = item[0]
12
+ host_config = item[1]
13
+
14
+ config.vm.define hostname do |host|
15
+ self.define(host, hostname, host_config, index == hostnames.size-1)
16
+
17
+ block.call(host)
18
+ end
19
+ end
20
+ end
21
+
22
+ private
23
+
24
+ def self.define(config, hostname, host, provision)
25
+ ip = host.fetch("ip")
26
+ type = Config.get("net","network_type")
27
+ nic_type = Config.get("net","private_nic_type")
28
+ config.vm.network type, ip: ip, nic_type: nic_type
29
+
30
+ config.vm.box = host.dig("vm","box")
31
+
32
+ config.vm.hostname = hostname
33
+
34
+ config.vm.provider :virtualbox do |vb|
35
+
36
+ vb.gui = host.dig("vm","gui")
37
+ vb.cpus = host.dig("vm","cpus")
38
+ vb.memory = host.dig("vm","memory")
39
+ vb.name = hostname
40
+ # vb.default_nic_type = nic_type
41
+ vb.linked_clone = true if Gem::Version.new(Vagrant::VERSION) >= Gem::Version.new('1.8.0') and Config.get("linked_clones")
42
+ vb.customize ["modifyvm", :id, "--nictype1", nic_type]
43
+ vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
44
+
45
+ # workaround for Ubuntu 20.04
46
+ if ["ubuntu/focal", "Easyconfig/ubuntu-desktop-focal-20.04-lts"].include? host.dig("vm","box")
47
+ vb.customize ["modifyvm", :id, "--uart1", "0x3F8", "4"]
48
+ vb.customize ["modifyvm", :id, "--uartmode1", "file", File::NULL]
49
+ end
50
+ end
51
+
52
+ if Config.get("ansible","local") or provision
53
+ playbook_file = File.expand_path(
54
+ Config.get("ansible","playbook"),
55
+ Config.get("ansible","project_path")
56
+ ).gsub(%r{/vagrant/},'')
57
+ if File.exist? playbook_file
58
+ config.vm.provision "ansible#{ "_local" if Config.get("ansible","local") }" do |ansible|
59
+ if Config.get("ansible","local") and Config.get("ansible","pip")
60
+ ansible.install_mode = "pip"
61
+ end
62
+ config_path = "#{Config.get("ansible","project_path")}/ansible.cfg"
63
+ if File.exist?(config_path)
64
+ ansible.config_file = "#{Config.get("ansible","project_path")}/ansible.cfg"
65
+ end
66
+ ansible.playbook = Config.get("ansible","playbook")
67
+ ansible.provisioning_path = Config.get("ansible","project_path")
68
+ ansible.extra_vars = Config.get("ansible","extra_vars")
69
+ ansible.verbose = Config.get("ansible","verbose")
70
+ ansible.tags = Config.get("ansible","tags")
71
+ ansible.skip_tags = Config.get("ansible","skip_tags")
72
+ ansible.compatibility_mode = "2.0"
73
+
74
+ groups = {}
75
+ Config.get("hosts").each do |hostname, host|
76
+ if host.key?("groups") and host.fetch("groups") != nil
77
+ host_groups = host.fetch("groups")
78
+ unless host_groups.kind_of?(Array)
79
+ host_groups = [host_groups]
80
+ end
81
+ host_groups.each do |group|
82
+ unless groups.key?(group)
83
+ groups[group] = []
84
+ end
85
+ groups[group] << hostname
86
+ end
87
+ end
88
+ end
89
+ ansible.groups = groups
90
+ end
91
+ else
92
+ puts "Easyconfig:VM.define: no ansible playbook available at [#{playbook_file}]"
93
+ end
94
+ end
95
+ Plugins.configure_disksize(config)
96
+ Plugins.add_aliases(config)
97
+ return nil
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,18 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = "vagrant-easyconfig"
3
+ s.version = "0.0.1"
4
+ s.license = "MIT"
5
+ s.authors = ["Daniel Satanik", "Benjamin Akhras"]
6
+ s.email = ["daniel@satanik.at"]
7
+ s.homepage = "https://gitlab.com/dessecated-unicorn/vagrant-easyconfig"
8
+ s.summary = "Vagrant plugin easy yaml configs"
9
+ s.description = "Vagrant plugin for easy VMs, provisioning and Ansible configuration."
10
+
11
+ all_files = `git ls-files`.split("\n")
12
+ s.files = all_files
13
+ s.require_paths = ["lib"]
14
+
15
+ s.rdoc_options = ["--charset=UTF-8"]
16
+ s.extra_rdoc_files = %w(README.md)
17
+
18
+ end
metadata ADDED
@@ -0,0 +1,58 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: vagrant-easyconfig
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Daniel Satanik
8
+ - Benjamin Akhras
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2021-02-25 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: Vagrant plugin for easy VMs, provisioning and Ansible configuration.
15
+ email:
16
+ - daniel@satanik.at
17
+ executables: []
18
+ extensions: []
19
+ extra_rdoc_files:
20
+ - README.md
21
+ files:
22
+ - ".gitignore"
23
+ - ".gitlab-ci.yml"
24
+ - Gemfile
25
+ - README.md
26
+ - lib/vagrant-easyconfig.rb
27
+ - lib/vagrant-easyconfig/config.rb
28
+ - lib/vagrant-easyconfig/config_template.rb
29
+ - lib/vagrant-easyconfig/hash.rb
30
+ - lib/vagrant-easyconfig/os.rb
31
+ - lib/vagrant-easyconfig/plugins.rb
32
+ - lib/vagrant-easyconfig/vm.rb
33
+ - vagrant-easyconfig.gemspec
34
+ homepage: https://gitlab.com/dessecated-unicorn/vagrant-easyconfig
35
+ licenses:
36
+ - MIT
37
+ metadata: {}
38
+ post_install_message:
39
+ rdoc_options:
40
+ - "--charset=UTF-8"
41
+ require_paths:
42
+ - lib
43
+ required_ruby_version: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ required_rubygems_version: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: '0'
53
+ requirements: []
54
+ rubygems_version: 3.2.3
55
+ signing_key:
56
+ specification_version: 4
57
+ summary: Vagrant plugin easy yaml configs
58
+ test_files: []