Advertisement
Guest User

trellis

a guest
Feb 14th, 2019
165
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.11 KB | None | 0 0
  1. ANSIBLE_PATH = __dir__ # absolute path to Ansible directory on host machine
  2. ANSIBLE_PATH_ON_VM = '/home/vagrant/trellis'.freeze # absolute path to Ansible directory on virtual machine
  3.  
  4. require File.join(ANSIBLE_PATH, 'lib', 'trellis', 'vagrant')
  5. require File.join(ANSIBLE_PATH, 'lib', 'trellis', 'config')
  6. require 'yaml'
  7.  
  8. vconfig = YAML.load_file("#{ANSIBLE_PATH}/vagrant.default.yml")
  9.  
  10. if File.exist?("#{ANSIBLE_PATH}/vagrant.local.yml")
  11. local_config = YAML.load_file("#{ANSIBLE_PATH}/vagrant.local.yml")
  12. vconfig.merge!(local_config) if local_config
  13. end
  14.  
  15. ensure_plugins(vconfig.fetch('vagrant_plugins')) if vconfig.fetch('vagrant_install_plugins')
  16.  
  17. trellis_config = Trellis::Config.new(root_path: ANSIBLE_PATH)
  18.  
  19. Vagrant.require_version '>= 2.1.0'
  20.  
  21. Vagrant.configure('2') do |config|
  22. config.vm.box = vconfig.fetch('vagrant_box')
  23. config.vm.box_version = vconfig.fetch('vagrant_box_version')
  24. config.ssh.forward_agent = true
  25. config.vm.post_up_message = post_up_message
  26.  
  27. # Fix for: "stdin: is not a tty"
  28. # https://github.com/mitchellh/vagrant/issues/1673#issuecomment-28288042
  29. config.ssh.shell = %(bash -c 'BASH_ENV=/etc/profile exec bash')
  30.  
  31. # Required for NFS to work
  32. if vconfig.fetch('vagrant_ip') == 'dhcp'
  33. config.vm.network :private_network, type: 'dhcp', hostsupdater: 'skip'
  34.  
  35. cached_addresses = {}
  36. config.hostmanager.ip_resolver = proc do |vm, _resolving_vm|
  37. if cached_addresses[vm.name].nil?
  38. if vm.communicate.ready?
  39. vm.communicate.execute("hostname -I | cut -d ' ' -f 2") do |_type, contents|
  40. cached_addresses[vm.name] = contents.split("\n").first[/(\d+\.\d+\.\d+\.\d+)/, 1]
  41. end
  42. end
  43. end
  44. cached_addresses[vm.name]
  45. end
  46. else
  47. config.vm.network :private_network, ip: vconfig.fetch('vagrant_ip'), hostsupdater: 'skip'
  48. end
  49.  
  50. main_hostname, *hostnames = trellis_config.site_hosts_canonical
  51. config.vm.hostname = main_hostname
  52.  
  53. if Vagrant.has_plugin?('vagrant-hostmanager') && !trellis_config.multisite_subdomains?
  54. redirects = trellis_config.site_hosts_redirects
  55.  
  56. config.hostmanager.enabled = true
  57. config.hostmanager.manage_host = true
  58. config.hostmanager.aliases = hostnames + redirects
  59. elsif Vagrant.has_plugin?('landrush') && trellis_config.multisite_subdomains?
  60. config.landrush.enabled = true
  61. config.landrush.tld = config.vm.hostname
  62. hostnames.each { |host| config.landrush.host host, vconfig.fetch('vagrant_ip') }
  63. else
  64. fail_with_message "vagrant-hostmanager missing, please install the plugin with this command:\nvagrant plugin install vagrant-hostmanager\n\nOr install landrush for multisite subdomains:\nvagrant plugin install landrush"
  65. end
  66.  
  67. bin_path = File.join(ANSIBLE_PATH_ON_VM, 'bin')
  68.  
  69. vagrant_mount_type = vconfig.fetch('vagrant_mount_type')
  70.  
  71. extra_options = if vagrant_mount_type == 'smb'
  72. {
  73. smb_username: vconfig.fetch('vagrant_smb_username', 'vagrant'),
  74. smb_password: vconfig.fetch('vagrant_smb_password', 'vagrant'),
  75. }
  76. else
  77. {}
  78. end
  79.  
  80. if vagrant_mount_type != 'nfs' || Vagrant::Util::Platform.wsl? || (Vagrant::Util::Platform.windows? && !Vagrant.has_plugin?('vagrant-winnfsd'))
  81. vagrant_mount_type = nil if vagrant_mount_type == 'nfs'
  82. trellis_config.wordpress_sites.each_pair do |name, site|
  83. config.vm.synced_folder local_site_path(site), remote_site_path(name, site), owner: 'vagrant', group: 'www-data', mount_options: mount_options(vagrant_mount_type, dmode: 776, fmode: 775), type: vagrant_mount_type, **extra_options
  84. end
  85.  
  86. config.vm.synced_folder ANSIBLE_PATH, ANSIBLE_PATH_ON_VM, mount_options: mount_options(vagrant_mount_type, dmode: 755, fmode: 644), type: vagrant_mount_type, **extra_options
  87. config.vm.synced_folder File.join(ANSIBLE_PATH, 'bin'), bin_path, mount_options: mount_options(vagrant_mount_type, dmode: 755, fmode: 755), type: vagrant_mount_type, **extra_options
  88. elsif !Vagrant.has_plugin?('vagrant-bindfs')
  89. fail_with_message "vagrant-bindfs missing, please install the plugin with this command:\nvagrant plugin install vagrant-bindfs"
  90. else
  91. trellis_config.wordpress_sites.each_pair do |name, site|
  92. config.vm.synced_folder local_site_path(site), nfs_path(name), type: 'nfs'
  93. config.bindfs.bind_folder nfs_path(name), remote_site_path(name, site), u: 'vagrant', g: 'www-data', o: 'nonempty'
  94. end
  95.  
  96. config.vm.synced_folder ANSIBLE_PATH, '/ansible-nfs', type: 'nfs'
  97. config.bindfs.bind_folder '/ansible-nfs', ANSIBLE_PATH_ON_VM, o: 'nonempty', p: '0644,a+D'
  98. config.bindfs.bind_folder bin_path, bin_path, perms: '0755'
  99. end
  100.  
  101. vconfig.fetch('vagrant_synced_folders', []).each do |folder|
  102. options = {
  103. type: folder.fetch('type', 'nfs'),
  104. create: folder.fetch('create', false),
  105. mount_options: folder.fetch('mount_options', [])
  106. }
  107.  
  108. destination_folder = folder.fetch('bindfs', true) ? nfs_path(folder['destination']) : folder['destination']
  109.  
  110. config.vm.synced_folder folder['local_path'], destination_folder, options
  111.  
  112. if folder.fetch('bindfs', true)
  113. config.bindfs.bind_folder destination_folder, folder['destination'], folder.fetch('bindfs_options', {})
  114. end
  115. end
  116.  
  117. provisioner = local_provisioning? ? :ansible_local : :ansible
  118. provisioning_path = local_provisioning? ? ANSIBLE_PATH_ON_VM : ANSIBLE_PATH
  119.  
  120. config.vm.provision provisioner do |ansible|
  121. if local_provisioning?
  122. ansible.install_mode = 'pip'
  123. ansible.provisioning_path = provisioning_path
  124. ansible.version = vconfig.fetch('vagrant_ansible_version')
  125. end
  126.  
  127. ansible.compatibility_mode = '2.0'
  128. ansible.playbook = File.join(provisioning_path, 'dev.yml')
  129. ansible.galaxy_role_file = File.join(provisioning_path, 'requirements.yml') unless vconfig.fetch('vagrant_skip_galaxy') || ENV['SKIP_GALAXY']
  130. ansible.galaxy_roles_path = File.join(provisioning_path, 'vendor/roles')
  131. ansible.galaxy_command = 'ansible-galaxy install --role-file=%{role_file} --roles-path=%{roles_path}'
  132.  
  133. ansible.groups = {
  134. 'web' => ['default'],
  135. 'development' => ['default']
  136. }
  137.  
  138. ansible.tags = ENV['ANSIBLE_TAGS']
  139. ansible.extra_vars = { 'vagrant_version' => Vagrant::VERSION }
  140.  
  141. if (vars = ENV['ANSIBLE_VARS'])
  142. extra_vars = Hash[vars.split(',').map { |pair| pair.split('=') }]
  143. ansible.extra_vars.merge!(extra_vars)
  144. end
  145.  
  146. if !Vagrant::Util::Platform.windows?
  147. config.trigger.after :up do |trigger|
  148. # Add Vagrant ssh-config to ~/.ssh/config
  149. trigger.info = "Adding vagrant ssh-config for #{main_hostname } to ~/.ssh/config"
  150. trigger.ruby do
  151. update_ssh_config(main_hostname)
  152. end
  153. end
  154. end
  155. end
  156.  
  157. # VirtualBox settings
  158. config.vm.provider 'virtualbox' do |vb|
  159. vb.name = config.vm.hostname
  160. vb.customize ['modifyvm', :id, '--cpus', vconfig.fetch('vagrant_cpus')]
  161. vb.customize ['modifyvm', :id, '--memory', vconfig.fetch('vagrant_memory')]
  162. vb.customize ['modifyvm', :id, '--ioapic', vconfig.fetch('vagrant_ioapic', 'on')]
  163.  
  164. # Fix for slow external network connections
  165. vb.customize ['modifyvm', :id, '--natdnshostresolver1', vconfig.fetch('vagrant_natdnshostresolver', 'on')]
  166. vb.customize ['modifyvm', :id, '--natdnsproxy1', vconfig.fetch('vagrant_natdnsproxy', 'on')]
  167. end
  168.  
  169. # VMware Workstation/Fusion settings
  170. %w(vmware_fusion vmware_workstation).each do |provider|
  171. config.vm.provider provider do |vmw, _override|
  172. vmw.name = config.vm.hostname
  173. vmw.vmx['numvcpus'] = vconfig.fetch('vagrant_cpus')
  174. vmw.vmx['memsize'] = vconfig.fetch('vagrant_memory')
  175. end
  176. end
  177.  
  178. # Parallels settings
  179. config.vm.provider 'parallels' do |prl, _override|
  180. prl.name = config.vm.hostname
  181. prl.cpus = vconfig.fetch('vagrant_cpus')
  182. prl.memory = vconfig.fetch('vagrant_memory')
  183. prl.update_guest_tools = true
  184. end
  185.  
  186. # Hyper-V settings
  187. config.vm.provider 'hyperv' do |h|
  188. h.vmname = config.vm.hostname
  189. h.cpus = vconfig.fetch('vagrant_cpus')
  190. h.memory = vconfig.fetch('vagrant_memory')
  191. h.enable_virtualization_extensions = true
  192. h.linked_clone = true
  193. end
  194. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement