let's get acquainted: ansible! / symfony camp ua 2014

39
Igor Brovchenko Let's Get Acquainted:

Upload: igor-brovchenko

Post on 14-Jun-2015

663 views

Category:

Technology


4 download

DESCRIPTION

Let's Get Acquainted: Ansible!

TRANSCRIPT

Page 1: Let's Get Acquainted: Ansible!  / Symfony Camp UA 2014

Igor Brovchenko

Let's Get Acquainted:

Page 2: Let's Get Acquainted: Ansible!  / Symfony Camp UA 2014

About me

• Engineer

• Chief Software Engineer at Swivl

• Symfony Camp UA

Igor [email protected]

@tigordev

Page 3: Let's Get Acquainted: Ansible!  / Symfony Camp UA 2014

What is Ansible?• Ansible is an IT automation tool (Python)

• Free, open source (github)

• Simply

• Clear (anyone)

• Fast (to learn, setup)

• Complete (modules)

• Efficient (runs on OpenSSH)

• Secure (without agents)

Page 4: Let's Get Acquainted: Ansible!  / Symfony Camp UA 2014

Use cases

• Server provisioning

• Server orchestration

• Application deployment

• Continues Integration

• …

Page 5: Let's Get Acquainted: Ansible!  / Symfony Camp UA 2014

Who uses Ansible?

Over 1 Million DownloadsOver 900 contributors

and 8000 ★s on GitHub

Page 6: Let's Get Acquainted: Ansible!  / Symfony Camp UA 2014

Other tools

• fabric

• capistrano (capifony)

• puppet

• chef

• saltstack

Page 7: Let's Get Acquainted: Ansible!  / Symfony Camp UA 2014

Ansible 1.7.2

• Development - 1.8

• A new major release of Ansible approximately every 2 months.

Page 8: Let's Get Acquainted: Ansible!  / Symfony Camp UA 2014

Control Machine Requirements

• Red Hat

• Debian

• CentOS

• OS X

• any of the BSDs

• Windows isn’t supported for the control machine

• Ansible 1.8: Windows will be fully supported

Python 2.6

Page 9: Let's Get Acquainted: Ansible!  / Symfony Camp UA 2014

Managed Node Requirements

• Python 2.4

• Starting in version 1.7, Ansible contains support for managing Windows machines

Page 10: Let's Get Acquainted: Ansible!  / Symfony Camp UA 2014

https://galaxy.ansible.com/

Page 11: Let's Get Acquainted: Ansible!  / Symfony Camp UA 2014
Page 12: Let's Get Acquainted: Ansible!  / Symfony Camp UA 2014

http://www.ansible.com/tower

Page 13: Let's Get Acquainted: Ansible!  / Symfony Camp UA 2014
Page 14: Let's Get Acquainted: Ansible!  / Symfony Camp UA 2014

Symfony Deployment

1. Update the code

2. Update vendor dependencies

3. Running database migrations

4. Update Assetic Assets

5. Clearing the cache

6. Other Things…

Page 15: Let's Get Acquainted: Ansible!  / Symfony Camp UA 2014

Symfony Deployment$ git pull

$ php composer.phar install

$ php app/console doctrine:migrations:migrate —no-interaction

$ php app/console assets:install web —symlink$ php app/console assetic:dump --env=prod

$ php app/console cache:clear

Page 16: Let's Get Acquainted: Ansible!  / Symfony Camp UA 2014

Directory Structure`-- /var/www/example.com|-- current → /var/www/example.com/releases/20141012131539|-- releases| `-- 20141012131539| `-- 20141009150741| `-- 20141031145325`-- shared |-- web | `-- uploads |-- logs `-- config `-- parameters.yml

Page 17: Let's Get Acquainted: Ansible!  / Symfony Camp UA 2014

Installing the Control Machine (Mac OSX)

$ brew update

$ brew install ansible

$ ansible-galaxy install servergrove.symfony2

Page 18: Let's Get Acquainted: Ansible!  / Symfony Camp UA 2014

Installing the Control Machine (Mac OSX)

$ ls /usr/local/etc/ansible

hosts roles

$ ls /usr/local/etc/ansible/hosts/roles

servergrove.symfony2

Page 19: Let's Get Acquainted: Ansible!  / Symfony Camp UA 2014

Deploy

$ ansible-playbook app/config/playbook_deploy.yml

$ ansible-playbook -l localhost app/config/playbook_deploy.yml -vvv

Page 20: Let's Get Acquainted: Ansible!  / Symfony Camp UA 2014

playbook_deploy.yml- hosts: stage-app vars: symfony2_project_name: Deploy the application symfony2_project_root: /var/www/example.com symfony2_project_release: '{{ current_timestamp.stdout }}' symfony2_project_repo: [email protected]:ingvar/ExampleApp.git symfony2_project_branch: release symfony2_project_php_path: /usr/local/php55/bin/php symfony2_project_env: prod symfony2_project_console_opts: '--no-debug' symfony2_project_composer_opts: '--no-dev --optimize-autoloader'

roles: - servergrove.symfony2

tasks: - local_action: osx_say msg="Deployment complete." voice=Zarvox

Page 21: Let's Get Acquainted: Ansible!  / Symfony Camp UA 2014

Inventory (hosts)[localhost]localhost ansible_connection=local

[stage-app]stage.example.com ansible_connection=ssh

[prod-app]www1.example.comwww2.example.comwww[10:50].example.com

[databases]db-[a:f].example.com

Page 22: Let's Get Acquainted: Ansible!  / Symfony Camp UA 2014

Inventory (hosts)

$ ansible localhost -m command "echo \"Hello World\" "

$ ansible prod-app -m ping

Page 23: Let's Get Acquainted: Ansible!  / Symfony Camp UA 2014

Ansible Structure• Inventory

• Modules

• Ad Hoc Commands

• Playbooks

• Tasks

• Variables

• Templates

• Handlers

• Roles

Page 24: Let's Get Acquainted: Ansible!  / Symfony Camp UA 2014

Modules• Cloud

• Commands

• Database

• Files

• Internal

• Inventory

• Messaging

• Monitoring

• Net Infrastructure

• Network

• Notification

• Packaging

• Source Control

• System

• Utilities

• Web Infrastructure

• Windows

Page 25: Let's Get Acquainted: Ansible!  / Symfony Camp UA 2014

Modules• Cloud (DO, AWS, Azure, GCE, Docker)

• DB (Mongo, MySQL, Postgres, Redis, Riak)

• Messaging (RabbitMQ)

• Monitoring (Zabbix, Monit, Nagios, New Relic…)

• Web (apache, supervisord…)

• Docker

• Vagrant

• …

Page 26: Let's Get Acquainted: Ansible!  / Symfony Camp UA 2014

Notification Modules• flowdock

• hipchat

• irc

• jabber

• slac

• sns

• twilio

• …

Page 27: Let's Get Acquainted: Ansible!  / Symfony Camp UA 2014

Cron module# Ensure a job that runs at 2 and 5 exists.# Creates an entry like "* 5,2 * * ls -alh > /dev/null"- cron: name="check dirs" hour="5,2" job="ls -alh > /dev/null"

# Ensure an old job is no longer present. Removes any job that is prefixed# by "#Ansible: an old job" from the crontab- cron: name="an old job" state=absent

# Creates an entry like "@reboot /some/job.sh"- cron: name="a job for reboot" special_time=reboot job="/some/job.sh"

# Creates a cron file under /etc/cron.d- cron: name="yum autoupdate" weekday="2" minute=0 hour=12 user="root" job="YUMINTERACTIVE=0 /usr/sbin/yum-autoupdate" cron_file=ansible_yum-autoupdate

# Removes a cron file from under /etc/cron.d

Page 28: Let's Get Acquainted: Ansible!  / Symfony Camp UA 2014

http://docs.ansible.com/guide_vagrant.html

Page 29: Let's Get Acquainted: Ansible!  / Symfony Camp UA 2014

Roles• YAML

• Documentation

• Modules (task)

• Ansible Galaxy

Page 30: Let's Get Acquainted: Ansible!  / Symfony Camp UA 2014

Tasks (main.yml)

Page 31: Let's Get Acquainted: Ansible!  / Symfony Camp UA 2014

Templates• Templates are processed by the Jinja2 templating

language (http://jinja.pocoo.org/docs/dev/templates/)

• Powerful conditionals

• Loops and iterators

Page 32: Let's Get Acquainted: Ansible!  / Symfony Camp UA 2014

Example templates• Apache VirtualHost configuration file

• HAProxy configuration

• …

Page 33: Let's Get Acquainted: Ansible!  / Symfony Camp UA 2014

Rollback?• http://www.servermanaged.it/ansible/ansible-simple-

rollback-strategy/

• http://www.future500.nl/articles/2014/07/thoughts-on-deploying-with-ansible/

Page 34: Let's Get Acquainted: Ansible!  / Symfony Camp UA 2014

Resources• http://docs.ansible.com/

• http://docs.ansible.com/playbooks_best_practices.html

• https://galaxy.ansible.com/

• https://github.com/ansible/ansible-examples

• https://github.com/leucos/ansible-tuto

Page 35: Let's Get Acquainted: Ansible!  / Symfony Camp UA 2014

Books

Page 36: Let's Get Acquainted: Ansible!  / Symfony Camp UA 2014
Page 37: Let's Get Acquainted: Ansible!  / Symfony Camp UA 2014

Real worldapp 1

app 2

app 3

DB - master

DB - slave

RabbitMQ

Redisapp 4

storage

transcoder

logs

monitoring

Page 38: Let's Get Acquainted: Ansible!  / Symfony Camp UA 2014
Page 39: Let's Get Acquainted: Ansible!  / Symfony Camp UA 2014

Questions?• Igor Brovchenko

• @tigordev

[email protected]

• http://ua.linkedin.com/in/IgorBrovchenko