$30 off During Our Annual Pro Sale. View Details »

Managing WordPress with Ansible

David Murphy
December 04, 2015

Managing WordPress with Ansible

Slides from my talk at WordCamp US, December 2015

David Murphy

December 04, 2015
Tweet

More Decks by David Murphy

Other Decks in Technology

Transcript

  1. Managing WordPress
    with Ansible
    1 — David Murphy @ WordCamp US, December 2015

    View Slide

  2. @schwuk
    http://schwuk.com
    2 — David Murphy @ WordCamp US, December 2015

    View Slide

  3. 3 — David Murphy @ WordCamp US, December 2015

    View Slide

  4. Managing WordPress
    with Ansible
    4 — David Murphy @ WordCamp US, December 2015

    View Slide

  5. Deploying WordPress
    with Ansible
    5 — David Murphy @ WordCamp US, December 2015

    View Slide

  6. why bother?
    6 — David Murphy @ WordCamp US, December 2015

    View Slide

  7. do it
    yourself
    7 — David Murphy @ WordCamp US, December 2015

    View Slide

  8. knowing how to
    do it yourself
    8 — David Murphy @ WordCamp US, December 2015

    View Slide

  9. automattion
    9 — David Murphy @ WordCamp US, December 2015

    View Slide

  10. automattion
    10 — David Murphy @ WordCamp US, December 2015

    View Slide

  11. automation
    11 — David Murphy @ WordCamp US, December 2015

    View Slide

  12. why
    automate
    things?
    12 — David Murphy @ WordCamp US, December 2015

    View Slide

  13. if you are going to
    do something more
    than once, automate
    it
    — me (and many others)
    13 — David Murphy @ WordCamp US, December 2015

    View Slide

  14. choices
    14 — David Murphy @ WordCamp US, December 2015

    View Slide

  15. choice #1:
    software
    15 — David Murphy @ WordCamp US, December 2015

    View Slide

  16. 16 — David Murphy @ WordCamp US, December 2015

    View Slide

  17. choice #2:
    platform
    17 — David Murphy @ WordCamp US, December 2015

    View Slide

  18. an abundance of choices:
    Ubuntu • Debian
    FreeBSD • OpenBSD • NetBSD
    Fedora • CentOS
    openSUSE • Slackware
    Gentoo • Arch Linux
    CoreOS
    18 — David Murphy @ WordCamp US, December 2015

    View Slide

  19. they are
    all good
    19 — David Murphy @ WordCamp US, December 2015

    View Slide

  20. 20 — David Murphy @ WordCamp US, December 2015

    View Slide

  21. choice #3:
    hosting
    21 — David Murphy @ WordCamp US, December 2015

    View Slide

  22. a plethora of choices:
    Bluehost • InMotion Hosting • DreamHost
    HostGator • WP Engine • GoDaddy
    Pagely • Media Temple
    DigitalOcean • Linode • Vultr
    Amazon Web Services
    Google Cloud Platform
    Microsoft Azure
    22 — David Murphy @ WordCamp US, December 2015

    View Slide

  23. shared
    hosting
    23 — David Murphy @ WordCamp US, December 2015

    View Slide

  24. virtual
    private
    server
    24 — David Murphy @ WordCamp US, December 2015

    View Slide

  25. cloud
    25 — David Murphy @ WordCamp US, December 2015

    View Slide

  26. they are not
    all equal
    26 — David Murphy @ WordCamp US, December 2015

    View Slide

  27. 27 — David Murphy @ WordCamp US, December 2015

    View Slide

  28. 28 — David Murphy @ WordCamp US, December 2015

    View Slide

  29. choice #4:
    tool
    29 — David Murphy @ WordCamp US, December 2015

    View Slide

  30. Puppet
    Chef
    Salt
    Ansible
    30 — David Murphy @ WordCamp US, December 2015

    View Slide

  31. 31 — David Murphy @ WordCamp US, December 2015

    View Slide

  32. Ansible is a powerful
    automation tool
    that you can learn
    quickly.
    32 — David Murphy @ WordCamp US, December 2015

    View Slide

  33. inventory
    playbooks
    roles
    33 — David Murphy @ WordCamp US, December 2015

    View Slide

  34. inventory
    34 — David Murphy @ WordCamp US, December 2015

    View Slide

  35. sample inventory
    [webservers]
    www1.example.com
    www2.example.com
    [dbservers]
    db0.example.com
    db1.example.com
    35 — David Murphy @ WordCamp US, December 2015

    View Slide

  36. naming patterns
    [webservers]
    www[01:50].example.com
    [databases]
    db-[a:f].example.com
    36 — David Murphy @ WordCamp US, December 2015

    View Slide

  37. groups-of-groups
    [web]
    host1
    host2
    [database]
    host2
    host3
    [site:children]
    web
    database
    37 — David Murphy @ WordCamp US, December 2015

    View Slide

  38. my inventory
    [development]
    my_vagrant_host ansible_sudo=yes
    [production]
    wcus.schwuk.com
    38 — David Murphy @ WordCamp US, December 2015

    View Slide

  39. demo
    39 — David Murphy @ WordCamp US, December 2015

    View Slide

  40. 40 — David Murphy @ WordCamp US, December 2015

    View Slide

  41. playbooks
    41 — David Murphy @ WordCamp US, December 2015

    View Slide

  42. sample playbook
    ---
    - hosts: webservers
    remote_user: root
    tasks:
    - name: ensure apache is at the latest version
    yum: pkg=httpd state=latest
    - name: write the apache config file
    template: src=/srv/httpd.j2 dest=/etc/httpd.conf
    - hosts: databases
    remote_user: root
    tasks:
    - name: ensure postgresql is at the latest version
    yum: name=postgresql state=latest
    - name: ensure that postgresql is started
    service: name=postgresql state=running
    42 — David Murphy @ WordCamp US, December 2015

    View Slide

  43. modules
    43 — David Murphy @ WordCamp US, December 2015

    View Slide

  44. yum
    - name: install the latest version of Apache
    yum: name=httpd state=latest
    - name: remove the Apache package
    yum: name=httpd state=absent
    - name: install the latest version of Apache from↩
    the testing repo
    yum: name=httpd enablerepo=testing state=present
    - name: install one specific version of Apache
    yum: name=httpd-2.2.29-1.4.amzn1 state=present
    44 — David Murphy @ WordCamp US, December 2015

    View Slide

  45. template
    # Example from Ansible Playbooks
    - template: src=/mytemplates/foo.j2 dest=/etc/file.conf↩
    owner=bin group=wheel mode=0644
    # The same example, but using symbolic modes equivalent to 0644
    - template: src=/mytemplates/foo.j2 dest=/etc/file.conf↩
    owner=bin group=wheel mode="u=rw,g=r,o=r"
    45 — David Murphy @ WordCamp US, December 2015

    View Slide

  46. service
    # Example action to start service httpd, if not running
    - service: name=httpd state=started
    # Example action to stop service httpd, if running
    - service: name=httpd state=stopped
    # Example action to restart service httpd, in all cases
    - service: name=httpd state=restarted
    # Example action to reload service httpd, in all cases
    - service: name=httpd state=reloaded
    # Example action to enable service httpd, and not touch↩
    the running state
    - service: name=httpd enabled=yes
    46 — David Murphy @ WordCamp US, December 2015

    View Slide

  47. modules, modules, modules
    → command, get_url
    → apt, apt_key, apt_repository
    → digital_ocean, linode, ec2, gce, docker
    → irc, slack, hipchat, mail
    → mysql_db, mysql_user
    → git, subversion
    47 — David Murphy @ WordCamp US, December 2015

    View Slide

  48. install → configure → control
    48 — David Murphy @ WordCamp US, December 2015

    View Slide

  49. apt → template → service
    49 — David Murphy @ WordCamp US, December 2015

    View Slide

  50. deploying
    WordPress
    50 — David Murphy @ WordCamp US, December 2015

    View Slide

  51. famous 5-minute install1
    → download/unzip
    → create database
    → edit config
    → upload
    1 http://codex.wordpress.org/InstallingWordPress#Famous5-
    Minute_Install
    51 — David Murphy @ WordCamp US, December 2015

    View Slide

  52. a better example
    → install packages
    → create database, then database user
    → download/unzip
    → edit config
    → configure webserver
    → ensure webserver is running
    52 — David Murphy @ WordCamp US, December 2015

    View Slide

  53. first, some variables
    vars:
    db_name: wcus
    db_user: wcus
    db_password: correcthorsebatterystaple
    site_name: wcus.schwuk.com
    site_alias: wcus
    53 — David Murphy @ WordCamp US, December 2015

    View Slide

  54. install the packages
    - name: Install mysql-server
    apt: name=mysql-server state=present↩
    update_cache=yes cache_valid_time=3600
    - name: Install apache2
    apt: name=apache2 state=present
    - name: Install libapache2-mod-php5
    apt: name=libapache2-mod-php5 state=present
    - name: Install php5-mysql
    apt: name=php5-mysql state=present
    - name: Install python-mysqldb
    apt: name=python-mysqldb state=present
    - name: Install python-httplib2
    apt: name=python-httplib2 state=present
    54 — David Murphy @ WordCamp US, December 2015

    View Slide

  55. install the packages, take two
    - name: Install required packages
    apt:
    name: "{{ item }}"
    state: present
    update_cache: yes
    cache_valid_time: 3600
    with_items:
    - mysql-server
    - apache2
    - libapache2-mod-php5
    - php5-mysql
    - python-mysqldb
    - python-httplib2
    55 — David Murphy @ WordCamp US, December 2015

    View Slide

  56. setup the database
    - name: Create WordPress database
    mysql_db:
    name: "{{ db_name }}"
    state: present
    - name: Create WordPress user
    mysql_user:
    name: "{{ db_user }}"
    password: "{{ db_password }}"
    priv: "{{ db_name }}.*:ALL"
    state: present
    56 — David Murphy @ WordCamp US, December 2015

    View Slide

  57. install WordPress
    - name: Create directory for WordPress
    file:
    path: /srv/{{ site_alias }}
    state: directory
    mode: 0755
    - name: Get WordPress
    get_url:
    url: http://wordpress.org/latest.tar.gz
    dest: /tmp/wordpress.tar.gz
    - name: Extract WordPress
    unarchive:
    src: /tmp/wordpress.tar.gz
    dest: /srv/{{ site_alias }}
    copy: no
    57 — David Murphy @ WordCamp US, December 2015

    View Slide

  58. edit the config
    - name: Generate Keys and Salts
    uri:
    url: https://api.wordpress.org/secret-key/1.1/salt/
    dest: /srv/{{ site_alias }}/keys.php
    creates: /srv/{{ site_alias }}/keys.php
    - name: Configure WordPress
    template:
    src: wp-config.php
    dest: /srv/{{ site_alias }}/wordpress/wp-config.php
    owner: root
    group: root
    mode: 0644
    58 — David Murphy @ WordCamp US, December 2015

    View Slide

  59. wp-config.php
    define('DB_NAME', '{{ db_name }}');
    define('DB_USER', '{{ db_user }}');
    define('DB_PASSWORD', '{{ db_password }}');
    define('DB_HOST', 'localhost');
    define('DB_CHARSET', 'utf8');
    define('DB_COLLATE', '');
    include dirname( __FILE__ ) . '../keys.php';
    $table_prefix = 'wp_';
    define('WP_DEBUG', false);
    if ( !defined('ABSPATH') )
    define('ABSPATH', dirname(__FILE__) . '/');
    require_once(ABSPATH . 'wp-settings.php');
    59 — David Murphy @ WordCamp US, December 2015

    View Slide

  60. configure the webserver
    - name: Configure webserver
    template:
    src: apache-site.conf
    dest: /etc/apache2/sites-available/{{ site_alias }}.conf
    owner: root
    group: root
    mode: 0644
    notify:
    - restart apache
    - name: Disable default site_alias
    command: a2dissite 000-default
    - name: Enable WordPress site
    command: a2ensite {{ site_alias }}
    60 — David Murphy @ WordCamp US, December 2015

    View Slide

  61. handling events
    handlers:
    - name: restart apache
    service: name=apache2 state=restarted
    61 — David Murphy @ WordCamp US, December 2015

    View Slide

  62. demo
    62 — David Murphy @ WordCamp US, December 2015

    View Slide

  63. 63 — David Murphy @ WordCamp US, December 2015

    View Slide

  64. 64 — David Murphy @ WordCamp US, December 2015

    View Slide

  65. 65 — David Murphy @ WordCamp US, December 2015

    View Slide

  66. next
    steps
    66 — David Murphy @ WordCamp US, December 2015

    View Slide

  67. opinionated
    67 — David Murphy @ WordCamp US, December 2015

    View Slide

  68. there's more than
    one way to do it
    — Perl community (and Larry Wall)
    68 — David Murphy @ WordCamp US, December 2015

    View Slide

  69. questions?
    69 — David Murphy @ WordCamp US, December 2015

    View Slide