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

Vagrant Provisioning with Ansible

Vagrant Provisioning with Ansible

As presented at PHP Southcoast 2015

Erika Heidi

July 18, 2015
Tweet

More Decks by Erika Heidi

Other Decks in Programming

Transcript

  1. What to expect from this talk 1. Vagrant: quick recap

    2. Ansible Overview 3. Playbook crash-course 4. Standalone Ansible
  2. 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!
  3. 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.
  4. 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
  5. 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
  6. Variables --- - hosts: all sudo: yes vars: web_server: nginx

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

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

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

    src=templates/apache.tpl dest=/etc/apache2/sites-available/000-default.conf
  12. 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
  13. 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
  14. 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
  15. 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
  16. 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
  17. Running Ansible on Vagrant vms $ ansible all -i [inventory]

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