Advertisement
Guest User

Untitled

a guest
Nov 11th, 2016
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.27 KB | None | 0 0
  1. # -*- mode: ruby -*-
  2. # vi: set ft=ruby :
  3.  
  4. require 'yaml'
  5.  
  6.  
  7. # Allow to define the config file via env variable
  8. config_file = ENV['VAGRANT_CONFIG_YAML'] || 'vagrant.yaml'
  9.  
  10. # Read the config file
  11. if File.file?(config_file)
  12. $cfg = YAML.load_file(config_file)
  13. else
  14. abort("ERROR: Can not read the Vagrant YAML configuration from %s." % config_file)
  15. end
  16.  
  17. # Internal defaults (can be overriden by 'defaults' in the YAML file)
  18. $defaults = {
  19. 'provision_individual' => false,
  20. 'provision_all' => false,
  21. # The following can also be defined on the VM level
  22. 'cpus' => 1,
  23. 'memory' => 512,
  24. 'extra_disks' => [],
  25. 'group' => nil,
  26. 'box' => 'centos/7',
  27. 'ip_range' => '192.168.11.%d',
  28. 'ip_start' => 10,
  29. 'ssh_user' => 'vagrant',
  30. 'ssh_port_start' => 10000,
  31. 'ports' => {},
  32. 'gui' => false,
  33. 'provisioning' => {
  34. 'verbosity' => 0
  35. },
  36. 'synced_folder' => {
  37. 'enabled' => false,
  38. 'host' => '.',
  39. 'guest' => '/vagrant'
  40. }
  41. }
  42.  
  43.  
  44. def param(params, p)
  45. if params.key?(p)
  46. if params[p].instance_of?(Hash)
  47. tmp = {}
  48.  
  49. if $cfg.key?('defaults') and $cfg['defaults'].key?(p) and $cfg['defaults'][p].instance_of?(Hash)
  50. tmp = $cfg['defaults'][p].clone
  51. elsif $defaults.key?(p) and $defaults[p].instance_of?(Hash)
  52. tmp = $defaults[p].clone
  53. end
  54.  
  55. return tmp.update(params[p])
  56. else
  57. return params[p]
  58. end
  59. elsif $cfg.key?('defaults') and $cfg['defaults'].key?(p)
  60. return $cfg['defaults'][p]
  61. elsif $defaults.key?(p)
  62. return $defaults[p]
  63. else
  64. abort("ERROR: Param %s doesn't exist!" % p)
  65. end
  66. end
  67.  
  68.  
  69. def set_ansible(ansible, prov, limit)
  70. if prov.key?('ask_sudo_pass')
  71. ansible.ask_sudo_pass = prov['ask_sudo_pass']
  72. end
  73.  
  74. if prov.key?('ask_vault_pass')
  75. ansible.ask_vault_pass = prov['ask_vault_pass']
  76. end
  77.  
  78. if prov.key?('extra_vars')
  79. ansible.extra_vars = prov['extra_vars']
  80. end
  81.  
  82. if prov.key?('groups')
  83. ansible.groups = prov['groups']
  84. end
  85.  
  86. ansible.host_key_checking = prov['host_key_checking'] || false
  87.  
  88. if prov.key?('host_vars')
  89. ansible.host_vars = prov['host_vars']
  90. end
  91.  
  92. if prov.key?('inventory_path')
  93. ansible.inventory_path = prov['inventory_path']
  94. end
  95.  
  96. ansible.limit = prov['limit'] || limit
  97. ansible.playbook = prov['playbook'] || 'site.yaml'
  98.  
  99. if prov.key?('raw_arguments')
  100. ansible.raw_arguments = prov['raw_arguments']
  101. end
  102.  
  103. if prov.key?('raw_ssh_args')
  104. ansible.raw_ssh_args = prov['raw_ssh_args']
  105. end
  106.  
  107. if prov.key?('skip_tags')
  108. ansible.skip_tags = prov['skip_tags']
  109. end
  110.  
  111. if prov.key?('start_at_task')
  112. ansible.start_at_task = prov['start_at_task']
  113. end
  114.  
  115. ansible.sudo = prov['sudo'] || false
  116.  
  117. if prov.key?('sudo_user')
  118. ansible.sudo_user = prov['sudo_user']
  119. end
  120.  
  121. if prov.key?('tags')
  122. ansible.tags = prov['tags']
  123. end
  124.  
  125. if prov.key?('vault_password_file')
  126. ansible.vault_password_file = prov['vault_password_file']
  127. end
  128.  
  129. if prov.key?('verbosity') and prov['verbosity'] > 0
  130. ansible.verbose = "-%s" % ('v' * (prov['verbosity'] || 0))
  131. end
  132. end
  133.  
  134.  
  135. # Minimal Vagrant version
  136. Vagrant.require_version '>= 1.6.0'
  137.  
  138. # Using Vagrant config format version 2
  139. Vagrant.configure('2') do |config|
  140. # Get the default VM folder
  141. vb_machine_folder = (`VBoxManage list systemproperties | grep 'Default machine folder'`).split(':')[1].strip()
  142.  
  143. # Create individual VMs
  144. $cfg['vms'].each_with_index do |(name, p), i|
  145. config.vm.define name do |node|
  146. # Configure box
  147. node.vm.box = param(p, 'box')
  148.  
  149. # Configure second NIC
  150. node.vm.network 'private_network', ip: p['ip'] || (param(p, 'ip_range') % (param(p, 'ip_start') + i))
  151.  
  152. # Configure SSH user
  153. node.ssh.username = param(p, 'ssh_user')
  154.  
  155. # Remove the default SSH port forwarding
  156. node.vm.network :forwarded_port, id: 'ssh', host: 2222, guest: 22, disabled: true
  157.  
  158. # Define new SSH port forwarding
  159. node.ssh.port = p['ssh_port'] || (param(p, 'ssh_port_start') + i)
  160. node.vm.network :forwarded_port, id: 'SSH', host: p['ssh_port'] || (param(p, 'ssh_port_start') + i), guest: 22
  161.  
  162. # Configure shared folder
  163. sync = param(p, 'synced_folder')
  164. node.vm.synced_folder sync['host'], sync['guest'], disabled: (not sync['enabled'])
  165.  
  166. # Configure addintional port forwarding
  167. param(p, 'ports').each do |port_name, ports|
  168. node.vm.network :forwarded_port, id: port_name, host: ports['host'], guest: ports['guest'], protocol: ports['proto'] || 'tcp'
  169. end
  170.  
  171. # Set VM parameters
  172. node.vm.provider 'virtualbox' do |v|
  173. # Change the VM name
  174. v.name = name
  175.  
  176. # Set number of CPU cores and memory size
  177. v.cpus = param(p, 'cpus')
  178. v.memory = param(p, 'memory')
  179.  
  180. # Whether to display the VM window
  181. v.gui = param(p, 'gui')
  182.  
  183. # Create new SCSI controller for additional disks
  184. if param(p, 'extra_disks').length > 0
  185. v.customize [
  186. 'storagectl', :id,
  187. '--add', 'scsi',
  188. '--name', 'SCSI']
  189. end
  190.  
  191. # Add extra disks
  192. param(p, 'extra_disks').each_with_index do |disk_size, disk_num|
  193. # Define the disk path
  194. disk_path = File.join(vb_machine_folder, v.name, 'extra_disk%d.vdi' % (disk_num + 1))
  195.  
  196. # Create and attach the disk
  197. unless File.exist?(disk_path)
  198. v.customize [
  199. 'createhd',
  200. '--filename', disk_path,
  201. '--format', 'VDI',
  202. '--size', disk_size * 1024]
  203. end
  204. v.customize [
  205. 'storageattach', :id,
  206. '--storagectl', 'SCSI',
  207. '--device', 0,
  208. '--port', disk_num,
  209. '--type', 'hdd',
  210. '--medium', disk_path]
  211. end
  212.  
  213. if not param(p, 'group').nil?
  214. # Move the VM into the right group
  215. v.customize [
  216. 'modifyvm', :id,
  217. '--groups', "/%s" % param(p, 'group')
  218. ]
  219. end
  220. end
  221.  
  222. # Provision individual hosts
  223. if param({}, 'provision_individual') or (p.key?('provision') and p['provision'])
  224. prov = param(p, 'provisioning')
  225.  
  226. node.vm.provision :ansible do |ansible|
  227. # Limit it to the VMs name by default
  228. set_ansible(ansible, prov, name)
  229. end
  230. end
  231. end
  232. end
  233.  
  234. # Provision all hosts
  235. if $cfg['vms'].length > 0 and param({}, 'provision_all')
  236. prov = param({}, 'provisioning')
  237.  
  238. config.vm.provision :ansible do |ansible|
  239. # Limit it to all defined VMs
  240. set_ansible(ansible, prov, "~(%s)" % $cfg['vms'].keys.join('|'))
  241. end
  242. end
  243. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement