Skip to content

Instantly share code, notes, and snippets.

@Hounddog
Last active June 12, 2016 15:08
Show Gist options
  • Save Hounddog/52658bf77ecb87cfa41f to your computer and use it in GitHub Desktop.
Save Hounddog/52658bf77ecb87cfa41f to your computer and use it in GitHub Desktop.
Vagrant
---
- namespace: development
provider: "virtualbox"
box: ubuntu/trusty64
network: 192.168.123.0/24
count: 2
virtualbox:
memory: 512
cpus: 1
ansible:
playbook: ansible/development.yml
group: development
skip_tags: release
- namespace: staging-release-1
provider: "aws"
box: dummy
box_url: https://github.com/mitchellh/vagrant-aws/raw/master/dummy.box
count: 1
aws:
instance_type: t2.micro
subnet_id: subnet-1825887d
region: eu-west-1
availability_zone: eu-west-1a
ami: ami-f0b11187
elastic_ip: xx.xx.xx.xx
associate_public_ip: false
environment: "Staging"
ansible:
playbook: ansible/staging.yml
group: staging-release
skip_tags: phpunit
vault_password_file: vault_pass.txt
sync:
disabled: true
- namespace: staging-development
provider: "aws"
box: dummy
box_url: https://github.com/mitchellh/vagrant-aws/raw/master/dummy.box
count: 1
aws:
instance_type: t2.micro
subnet_id: subnet-1825887d
region: eu-west-1
availability_zone: eu-west-1a
ami: ami-f0b11187
elastic_ip: xx.xx.xx.xx
associate_public_ip: false
environment: "Staging"
ansible:
playbook: ansible/staging.yml
group: staging-development
skip_tags: phpunit
vault_password_file: vault_pass.txt
sync:
disabled: true
- namespace: qa-staging
provider: "aws"
box: dummy
box_url: https://github.com/mitchellh/vagrant-aws/raw/master/dummy.box
count: 1
aws:
instance_type: t2.micro
subnet_id: subnet-1825887d
region: eu-west-1
availability_zone: eu-west-1a
ami: ami-f19d0586
associate_public_ip: true
elastic_ip: false
ansible:
playbook: ansible/testing.yml
group: test
skip_tags: release
sync:
disabled: false
- namespace: qa-development
provider: "aws"
box: dummy
box_url: https://github.com/mitchellh/vagrant-aws/raw/master/dummy.box
count: 1
aws:
instance_type: t2.micro
subnet_id: subnet-1825887d
region: eu-west-1
availability_zone: eu-west-1a
ami: ami-f19d0586
associate_public_ip: true
elastic_ip: false
ansible:
playbook: ansible/testing.yml
group: test
skip_tags: release
sync:
disabled: false
- namespace: production-elastic
provider: "aws"
box: dummy
box_url: https://github.com/mitchellh/vagrant-aws/raw/master/dummy.box
count: 1
aws:
instance_type: t2.micro
subnet_id: subnet-525ac637
region: eu-west-1
availability_zone: eu-west-1a
ami: ami-279c0450
private_ip:
associate_public_ip: true
elastic_ip: false
security_groups: "sg-a21e58c7"
environment: "Production"
ansible:
playbook: ansible/elasticsearch.yml
group: production-elastic
vault_password_file: vault_pass.txt
sync:
disabled: true
- namespace: production-api
provider: "aws"
box: dummy
box_url: https://github.com/mitchellh/vagrant-aws/raw/master/dummy.box
count: 1
aws:
instance_type: t2.micro
subnet_id: subnet-525ac637
region: eu-west-1
availability_zone: eu-west-1a
ami: ami-259c0452
associate_public_ip: true
elastic_ip: false
elb: "API"
security_groups: "sg-a11056c4"
environment: "Production"
ansible:
playbook: ansible/production-api.yml
group: production-api
skip_tags: phpunit
vault_password_file: vault_pass.txt
sync:
disabled: true
- namespace: production-prerender
provider: "aws"
box: dummy
box_url: https://github.com/mitchellh/vagrant-aws/raw/master/dummy.box
count: 1
aws:
instance_type: t2.micro
subnet_id: subnet-525ac637
region: eu-west-1
availability_zone: eu-west-1a
ami: ami-b7bf27c0
private_ip:
associate_public_ip: true
elastic_ip: false
security_groups: "sg-305c1a55"
environment: "Production"
ansible:
playbook: ansible/prerender.yml
group: production-prerender
vault_password_file: vault_pass.txt
sync:
disabled: true
- namespace: production-webserver
provider: "aws"
box: dummy
box_url: https://github.com/mitchellh/vagrant-aws/raw/master/dummy.box
count: 1
aws:
instance_type: t2.micro
subnet_id: subnet-525ac637
region: eu-west-1
availability_zone: eu-west-1a
ami: ami-c1bf27b6
private_ip:
associate_public_ip: true
elastic_ip: false
security_groups: "sg-0b5c1a6e"
environment: "Production"
elb: "Website"
ansible:
playbook: ansible/production-webserver.yml
group: production-webserver
vault_password_file: vault_pass.txt
sync:
disabled: true
# -*- mode: ruby -*-
# vi: set ft=ruby :
require 'yaml'
require 'ipaddr'
settings = YAML.load_file 'vagrant.yml'
aws_settings = settings["aws"]
vm_settings = settings["vm"]
# Read YAML file with box details
servers = YAML.load_file('servers.yml')
#ARGV
skip = 0
while skip < ARGV.length
if ARGV[skip].start_with?(arg='--vagrant-namespace=')
v = ARGV.delete_at(skip).dup
v.slice! arg
namespacefilter = v.to_s # set namespace
else # skip over "official" vagrant args
skip = skip + 1
end
end
vms = []
ansible_groups = {};
#Assign Children groups for ansible
ansible_groups['db:children'] = [];
ansible_groups['db:children'] << 'development';
ansible_groups['elastic:children'] = [];
ansible_groups['elastic:children'] << 'development';
ansible_groups['elastic:children'] << 'test';
ansible_groups['elastic:children'] << 'staging';
ansible_groups['elastic:children'] << 'production-elastic';
ansible_groups['api:children'] = [];
ansible_groups['api:children'] << 'development';
ansible_groups['api:children'] << 'test';
ansible_groups['api:children'] << 'staging';
ansible_groups['api:children'] << 'production-api';
ansible_groups['staging:children'] = [];
ansible_groups['staging:children'] << 'staging-release';
ansible_groups['staging:children'] << 'staging-development';
ansible_groups['webserver:children'] = [];
ansible_groups['webserver:children'] << 'development';
ansible_groups['webserver:children'] << 'staging';
ansible_groups['webserver:children'] << 'production-webserver';
ansible_groups['prerender:children'] = [];
ansible_groups['prerender:children'] << 'production-prerender';
ansible_groups['profiling:children'] = [];
ansible_groups['profiling:children'] << 'development';
ansible_groups['profiling:children'] << 'staging';
ansible_groups['analytics:children'] = [];
ansible_groups['analytics:children'] << 'development';
ansible_groups['analytics:children'] << 'staging';
servers.each do |servers, i|
if servers['virtualbox'] != nil
network_obj = IPAddr.new servers['network']
range = network_obj.to_range.to_a
cidr = (32-(Math.log(range.length)/Math.log(2))).to_i
offset = 100 # start hosts after here
# remove reserved values
range[0] = '__reserved_network_addr' # network
range[1] = '__reserved_router_addr' # router (reserved)
end
#if namespacefilter != nil && namespacefilter != servers['namespace']
# next
#end
servers['name'] = servers['namespace']
count = servers['count']
(1..count).each do |i|
h = "#{servers['namespace']}-#{i}"
server = servers.dup
server['name'] = h
if servers['virtualbox'] != nil
server['ip'] = range[offset+i].to_s
end
if ansible_groups.has_key?(servers["ansible"]["group"]) == false
ansible_groups[servers["ansible"]["group"]] = [];
end
ansible_groups[servers["ansible"]["group"]] << server['name'];
# generate names and add in the defaults
vms.push(server)
if namespacefilter == servers['namespace']
ARGV << h;
end
end
end
print ARGV;
Vagrant.configure("2") do |config|
vms.each do |vm|
config.vm.define vm["name"] do |box|
#ENV['VAGRANT_DEFAULT_PROVIDER'] = vm["provider"]
box.vm.box = vm["box"]
#Virtualbox Provider
if vm['virtualbox'] != nil
box.vm.network "private_network", ip: vm["ip"]
box.vm.synced_folder "./", "/var/www/api.elephone.vb", :owner => "vagrant", :group => "www-data"
box.vm.provider :virtualbox do |vb|
vb.name = vm["name"]
vb.customize [
"modifyvm", :id,
"--memory", vm_settings["memory"],
"--name", vm["name"],
"--natdnshostresolver1", "on",
"--cpus", vm_settings["cpus"],
]
end
end
#Amazon Webservices Provider
if vm['aws'] != nil
box.vm.box_url = vm["box_url"]
box.vm.synced_folder ".", "/vagrant", type: "rsync", rsync__exclude: ["src/vendor"], disabled: vm["sync"]["disabled"]
box.vm.provider :aws do |aws, override|
aws.access_key_id = aws_settings['access_key_id']
aws.secret_access_key = aws_settings['secret_access_key']
aws.keypair_name = aws_settings['keypair_name']
override.ssh.private_key_path = aws_settings['private_key_path']
aws.instance_type = vm["aws"]["instance_type"]
aws.subnet_id = vm["aws"]["subnet_id"]
aws.region = vm["aws"]["region"]
aws.availability_zone = vm["aws"]["availability_zone"]
aws.ami = vm["aws"]["ami"]
override.ssh.username = "ubuntu"
aws.elastic_ip = vm["aws"]["elastic_ip"]
aws.associate_public_ip = vm["aws"]["associate_public_ip"]
aws.tags = {
"Name" => vm["name"],
"Environment" => vm["aws"]['environment']
}
if vm["aws"]["elb"] != nil
aws.elb = vm["aws"]["elb"]
end
aws.security_groups = vm["aws"]["security_groups"]
end
end
box.vm.provision :ansible do |ansible|
ansible.playbook = vm["ansible"]["playbook"]
ansible.limit = 'all'
#ansible.verbose = 'vvvv'
ansible.groups = ansible_groups;
if vm["ansible"]["vault_password_file"] != nil
ansible.vault_password_file = vm["ansible"]["vault_password_file"]
end
if vm["ansible"]["skip_tags"] != nil
ansible.skip_tags = vm["ansible"]["skip_tags"]
end
ansible.vault_password_file="vault_pass.txt"
end
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment