Pro Yearly is on sale from $80 to $50! »

Vagrant Provisioning with Ansible

719435d98d452de7ac367c828266cf01?s=47 Erika Heidi
February 07, 2015

Vagrant Provisioning with Ansible

Talk presented at SunshinePHP 2015

719435d98d452de7ac367c828266cf01?s=128

Erika Heidi

February 07, 2015
Tweet

Transcript

  1. None
  2. whoami • (PHP) Developer Advocate at DigitalOcean • Working with

    PHP and Linux for 10+ years • Author of Vagrant Cookbook and phansible.com
  3. What to expect from this talk 1. Vagrant: quick recap

    2. Ansible Overview 3. Writing Playbooks 4. Standalone Ansible
  4. VAGRANT: QUICK RECAP

  5. None
  6. ANSIBLE OVERVIEW

  7. Ansible Overview • Simple and Straightforward • Human-readable automation language

    • Agentless - needs only SSH • Extensive list of built-in modules • Used by Twitter, Atlassian, EA, Spotify, even NASA!
  8. Installation $ brew update $ brew install ansible $ sudo

    apt-add-repository -y ppa:ansible/ansible $ sudo apt-get update $ sudo apt-get install -y ansible Detailed installation instructions: do.co/ansible-docs Mac OSX Ubuntu *Windows is not officially supported as controller machine.
  9. A Simple Playbook # playbook.yml --- - hosts: all sudo:

    true tasks: - name: Update apt-cache apt: update_cache=yes - name: Install Nginx apt: pkg=nginx state=latest
  10. Playbook x Manifest #Ansible playbook.yml --- - hosts: all sudo:

    true tasks: - name: Update apt-cache apt: update_cache=yes - name: Install Nginx apt: pkg=nginx state=latest #Puppet default.pp exec { 'apt-get update': command => '/usr/bin/apt-get update' } package { 'nginx': ensure => "installed", require => Exec['apt-get update'], }
  11. Ansible Output

  12. Ansible Output (with cowsay)

  13. Ansible as Provisioner #Vagrantfile Vagrant.configure("2") do |config| config.vm.box = "hashicorp/precise64"

    config.vm.provision "ansible" do |ansible| ansible.playbook = "playbook.yml" end end
  14. DEMO

  15. WRITING PLAYBOOKS

  16. Variables --- - hosts: all sudo: yes vars: web_server: nginx

    tasks: - name: Install {{ web_server }} apt: pkg={{ web_server }} state=latest
  17. Facts

  18. Conditionals - name: "shutdown Debian flavored systems" command: /sbin/shutdown -t

    now when: ansible_os_family == "Debian" - name: foo is not defined fail: msg="Bailing out. this play requires 'bar'" when: bar is not defined
  19. Conditionals - name: Check if PHP is installed register: php_install

    command: php -v ignore_errors: true - name: Do something if PHP is installed debug: var=php_install when: php_install|success - name: Do something if PHP is NOT installed debug: msg='PHP is NOT installed!' when: php_install|failed
  20. Conditionals - name: Check if PHP is installed register: php_install

    command: php -v ignore_errors: true - name: Do something if PHP is installed debug: var=php_install when: php_install|success - name: Do something if PHP is NOT installed debug: msg='PHP is NOT installed!' when: php_install|failed
  21. Conditionals - name: Check if PHP is installed register: php_install

    command: php -v ignore_errors: true - name: Do something if PHP is installed debug: var=php_install when: php_install|success - name: Do something if PHP is NOT installed debug: msg='PHP is NOT installed!' when: php_install|failed
  22. None
  23. None
  24. Looping: with_items tasks: - name: Install Packages apt: pkg={{ item

    }} state=latest with_items: - nginx - php5-fpm - git
  25. Looping: with_items --- - hosts: all sudo: yes vars: sys_packages:

    [ 'nginx', 'php5-fpm', 'git' ] tasks: - name: Install Packages apt: pkg={{ item }} state=latest with_items: sys_packages
  26. Templates <VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot {{ doc_root }} <Directory

    {{ doc_root }}> AllowOverride All Require all granted </Directory> </VirtualHost>
  27. Templates - Usage - name: Change default apache vhost template:

    src=templates/apache.tpl dest=/etc/apache2/sites-available/000-default.conf
  28. Handlers (services) --- - hosts: all sudo: yes vars: -

    doc_root: /vagrant tasks: - name: Change default apache vhost template: src=templates/apache.tpl dest=/etc/apache2/sites- available/000-default.conf notify: restart apache handlers: - name: restart apache service: name=apache2 state=restarted
  29. None
  30. ORGANIZING PLAYBOOKS

  31. Including Tasks --- - hosts: all sudo: true vars: doc_root:

    /vagrant/web tasks: - include: tasks/init.yml - include: tasks/nginxphp.yml handlers: - name: restart nginx service: name=nginx state=restarted
  32. Roles . ├── playbook.yml └── roles ├── init │ └──

    tasks │ └── main.yml └── nginxphp ├── handlers │ └── main.yml ├── tasks │ └── main.yml └── templates └── vhost.tpl #playbook.yml --- - hosts: all sudo: true vars: doc_root: /vagrant/web roles: - init - nginxphp
  33. STANDALONE ANSIBLE

  34. Let's talk inventories! #/etc/ansible/hosts [webservers] erikaheidi.com dev-human.com [testservers] 178.62.192.53 95.85.35.248

    178.62.221.111
  35. ad-hoc commands

  36. ad-hoc commands

  37. Running playbooks $ ansible-playbook -i staging -l webservers playbook.yml $

    ansible-playbook playbook.yml --list-hosts $ ansible-playbook playbook.yml --list-tasks ansible-playbook [-i inventory] [-l group] playbook.yml
  38. Vagrant auto-generated inventory # Generated by Vagrant default ansible_ssh_host=127.0.0.1 ansible_ssh_port=2222

    .vagrant/provisioners/ansible/inventory/vagrant_ansible_inventory
  39. Running Ansible on Vagrant vms $ ansible -i [inventory] --private-key=[vagrant_priv_key]

    -u vagrant -a "php -v" $ ansible-playbook -i [inventory] --private-key=[key] -u vagrant demo01.yml .vagrant/provisioners/ansible/inventory/vagrant_ansible_inventory .vagrant/machines/default/virtualbox/private_key
  40. Running Ansible on Vagrant vms

  41. RESOURCES

  42. phansible.com

  43. Vagrant Cookbook - Leanpub leanpub.com/vagrantcookbook/c/ssp15 Also available on Amazon (paperback)

  44. QUESTIONS?

  45. Ansible Tutorials: http://do.co/ansible Please rate this talk: https://joind.in/13459