Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Vagrant Provisioning with Ansible

Erika Heidi
February 07, 2015

Vagrant Provisioning with Ansible

Talk presented at SunshinePHP 2015

Erika Heidi

February 07, 2015
Tweet

More Decks by Erika Heidi

Other Decks in Programming

Transcript

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

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

    2. Ansible Overview 3. Writing Playbooks 4. Standalone Ansible
  3. 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!
  4. 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.
  5. 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
  6. 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'], }
  7. 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
  8. Variables --- - hosts: all sudo: yes vars: web_server: nginx

    tasks: - name: Install {{ web_server }} apt: pkg={{ web_server }} state=latest
  9. 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
  10. 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
  11. 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
  12. 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
  13. Looping: with_items tasks: - name: Install Packages apt: pkg={{ item

    }} state=latest with_items: - nginx - php5-fpm - git
  14. 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
  15. Templates <VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot {{ doc_root }} <Directory

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

    src=templates/apache.tpl dest=/etc/apache2/sites-available/000-default.conf
  17. 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
  18. 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
  19. 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
  20. 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
  21. 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