Chris Mague 7 lat temu
commit
3799e3f115

+ 14 - 0
README.md

@@ -0,0 +1,14 @@
+# cookiecutter-packer-ansible
+
+Sets up a packer builder using ansible
+
+## Prerequisites 
+
+Install cookiecutter
+```
+sudo pip install cookiecutter
+```
+
+## Using 
+
+cookiecutter https://gogs.mague.com/Shokunin/cookiecutter-packer-ansible.git 

+ 18 - 0
cookiecutter.json

@@ -0,0 +1,18 @@
+{
+  "full_name": "Chris Mague",
+  "email": "github@mague.com",
+  "packer_name": "packertest",
+  "short_description": "description goes here",
+  "release_date": "2018-01-05",
+  "version": "0.1.0",
+  "ruby_version": "2.4.1",
+  "terraform_version": "0.11.1",
+  "min_ansible_version": "2.4",
+  "allow_duplicates": "no",
+  "galaxy_tags": "",
+  "dependencies": "",
+  "target_os": "ubuntu",
+  "aws_region": "us-west-1",
+  "target_os_version": "xenial",
+  "company_name": "Shokunin Consulting LLC"
+}

+ 25 - 0
{{cookiecutter.packer_name}}/.gitignore

@@ -0,0 +1,25 @@
+# ---> Packer
+# Cache objects
+packer_cache/
+
+# For built boxes
+*.box
+
+# For Ansible
+ansible/playbook.retry
+
+# For Vagrant
+.tmp
+tmp/*
+.librarian
+.vagrant
+*-console.log
+ansible/roles/*
+
+set_env.sh
+set_env_*.sh
+Gemfile.lock
+
+terraform/test.tfvars
+terraform/terraform.tfstate
+terraform/terraform.tfstate.*

+ 1 - 0
{{cookiecutter.packer_name}}/.ruby-gemset

@@ -0,0 +1 @@
+ansible-packer

+ 1 - 0
{{cookiecutter.packer_name}}/.ruby-version

@@ -0,0 +1 @@
+{{ cookiecutter.ruby_version }}

+ 1 - 0
{{cookiecutter.packer_name}}/.terraform-version

@@ -0,0 +1 @@
+{{ cookiecutter.terraform_version }}

+ 34 - 0
{{cookiecutter.packer_name}}/README.md

@@ -0,0 +1,34 @@
+# {{cookiecutter.packer_name}}
+
+{{cookiecutter.short_description}}
+
+## Prerequisites
+
+- [Packer](https://www.packer.io/downloads.html)
+- [Ansible min version {{ cookiecutter.min_ansible_version }}](http://docs.ansible.com/ansible/latest/intro_installation.html)
+- [RVM](https://rvm.io/rvm/install)
+
+## Usage
+
+Finding a suitable base AMI to build from
+
+```
+aws ec2 describe-images --region {{ cookiecutter.aws_region }} \
+ --filters Name=image-type,Values=machine \
+ --filters Name=owner-id,Values=099720109477 \
+ --filters Name=tag-value,Values={{ cookiecutter.target_os_version }} \
+ --filters Name=virtualization-type,Values=hvm  \
+ --filters Name=architecture,Values=x86_64 \
+ --filters Name=root-device-type,Values=ebs \
+  | jq '.Images[] | .Name + "," + .ImageId'  |egrep "{{ cookiecutter.target_os }}/images/hvm-ssd/{{ cookiecutter.target_os }}-{{ cookiecutter.target_os_version }}-" |sort -rn 
+```
+
+
+
+
+
+LICENSE: 3-clause BSD license.
+
+
+---
+Copyright © {{cookiecutter.release_date.split('-')[0]}}, {{ cookiecutter.full_name }}

+ 74 - 0
{{cookiecutter.packer_name}}/Rakefile

@@ -0,0 +1,74 @@
+require 'yaml'
+require 'popen4'
+STDOUT.sync = true
+
+task :default => :build_full_ami
+##########################################################################
+def run_command(cmd)
+  cmdrun = IO.popen(cmd)
+  output = cmdrun.read
+  cmdrun.close
+  if $?.to_i > 0
+    puts "count not run #{cmd}, it returned an error #{output}"
+    exit 2
+  end
+  puts "OK: ran command #{cmd}"
+end
+##########################################################################
+hf = Dir.glob('ansible/playbook.yml')
+errors = []
+desc 'Check Playbook Syntax'
+task :lint_playbook do
+  hf.each do |playbook_file|
+    begin
+      YAML.load_file(playbook_file)
+    rescue Exception => e
+      errors << e.message
+    end
+  end
+  if errors.empty?
+    puts "Rake: #{hf.length} playbook files all checkout!"
+  else
+    errors.each do |err|
+      puts "ERROR: YAML parse errors"
+      puts err
+    end
+    exit 1
+  end
+end
+##########################################################################
+desc 'Update the Galaxy Modules'
+task :update_galaxy do
+  puts 'Rake: updating galaxy modules'
+  run_command('cd ansible && rm -rf roles/* && ansible-galaxy install --roles-path roles -r requirements.yml')
+end
+
+task :validate_packer do
+  puts 'Rake: validating packer.json'
+  run_command('packer validate packer.json')
+end
+
+task :build_ami do
+  puts 'Rake: Building ami'
+  POpen4::popen4( "packer build packer.json" ) do |stdout, stderr, stdin|  
+    stdout.each do |line|  
+      puts line  
+    end
+  end  
+end
+
+desc 'Ensure environment is setup properly'
+task :check_env do
+  ['SOURCE_AMI', 'AWS_ACCESS_KEY_ID', 'AWS_SECRET_ACCESS_KEY'].each do |st|
+    unless ENV.has_key? st
+      puts "ENV var #{st} is not set - see the Readme"
+      exit 1
+    end
+  end
+end
+
+desc 'Build the ami'
+task :build_full_ami => [:check_env, :validate_packer, :update_galaxy, :lint_playbook, :build_ami] do
+  puts 'Rake: Building the ami '
+end
+

+ 48 - 0
{{cookiecutter.packer_name}}/ansible/playbook.yml

@@ -0,0 +1,48 @@
+---
+
+- hosts: all
+  become: yes
+  become_user: root
+  become_method: sudo
+  gather_facts: yes
+  vars_files:
+    - vars/main.yml
+
+  pre_tasks:
+    - name: Update Apt Cache
+      apt: update_cache=yes cache_valid_time=86400
+      when: ansible_os_family == "Debian"
+    - name: Ubuntu Packages
+      apt: >
+        pkg={{item}}
+        state=installed
+      with_items:
+        - htop
+        - iotop
+        - git
+        - sysstat
+        - vim
+        - tmux
+        - tree
+        - tcpdump
+        - unzip
+      when: ansible_os_family == "Debian"
+    - name: CentOS packages
+      yum: pkg={{item}} state=installed
+      with_items:
+       - bind-utils
+       - sysstat
+       - tmux
+       - wget
+       - git
+       - vim-enhanced
+       - iotop
+       - tree
+       - tcpdump
+      when: ansible_distribution == "CentOS"
+
+
+  roles:
+{% for dep in cookiecutter.dependencies.split(',') -%}
+    - {{ dep }}
+{% endfor -%}

+ 7 - 0
{{cookiecutter.packer_name}}/ansible/requirements.yml

@@ -0,0 +1,7 @@
+# from galaxy
+- src: yatesr.timezone
+- src: bennojoy.ntp
+- src: https://github.com/shokunin/ansible-supervisor
+  name: futurice.supervisor
+- src: https://github.com/shokunin/ansible_ec2_base
+- src: git+http://gogs.mague.com/Shokunin/ansible-cloud-consul

+ 2 - 0
{{cookiecutter.packer_name}}/ansible/vars/main.yml

@@ -0,0 +1,2 @@
+---
+timezone: UTC

+ 40 - 0
{{cookiecutter.packer_name}}/packer.json

@@ -0,0 +1,40 @@
+{
+  "variables": {
+    "source_ami"     : "{{ env `SOURCE_AMI` }}",
+    "region"         : "{{ cookiecutter.aws_region }}",
+    "aws_access_key" : "{{ env `AWS_ACCESS_KEY_ID` }}",
+    "aws_secret_key" : "{{ env `AWS_SECRET_ACCESS_KEY` }}"
+ },
+  "provisioners": [
+    {
+      "type"   : "shell",
+      "inline" : [
+        "/bin/echo 'Your patience will be rewarded'",
+        "sleep 300",
+        "sudo apt-get update",
+        "sudo apt-get -y install curl python python-pip"
+      ]
+    },
+    {
+      "type"          : "ansible",
+      "playbook_file" : "./ansible/playbook.yml"
+    }
+  ],
+  "builders": [
+    {
+      "type"          : "amazon-ebs",
+      "access_key"    : "{{user `aws_access_key`}}",
+      "secret_key"    : "{{user `aws_secret_key`}}",
+      "region"        : "{{user `region`}}",
+      "source_ami"    : "{{user `source_ami`}}",
+      "ssh_username"  : "ubuntu",
+      "instance_type" : "m3.medium",
+      "ami_name"      : "{{cookiecutter.packer_name}}-{{timestamp}}",
+      "tags"          : {
+		  "role"       : "{{cookiecutter.packer_name}}",
+		  "build_date" : "{{timestamp}}"
+      }
+    }
+  ],
+  "post-processors": [ ]
+}