Ansible Playbooks

Below are some Ansible playbooks to demostrate some of the features of Ansible, these are to refresh your Ansible knowledge from time to time, don't forget to also checkout the Ansible documentation for latest modules and options. I describe all of the below in my main Ansible cheatsheet.

You can use Ansible Galaxy to create the roles structure, the whole structure may look like something below


site.yml
---
- hosts: all
  become: true
  gather_facts: false
  tasks:
    - name: update apt cache
      apt: update_cache=yes cache_valid_time=86400
      tags: [ 'packages' ]

- include: control.yml
- include: database.yml
- include: webserver.yml
- include: loadbalancer.yml
webserver.yml
---
- hosts: webserver
  become: true
  gather_facts: false
  roles:
    - apache2
    - demo_app
database.yml
---
- hosts: database
  become: true
  roles:
    - role: mysql
      db_user_name: "{{ db_user }}"
      db_user_pass: "{{ db_pass }}"
      db_user_host: '%'
group_vars/all
---
db_name: demo
db_user: demo
db_pass: "{{ vault_db_pass }}"
stack_status.yml
---
- hosts: webserver
  become: true
  gather_facts: false
  tasks:
    - name: verify apache2 service
      command: service apache2 status
      changed_when: false

    - name: verify apache2 is listening on 80
      wait_for: port=80 timeout=1

- hosts: database
  become: true
  tasks:
    - name: verify mysql service
      command: service mysql status
      changed_when: false

    - name: verify mysql is listening on 3306
      wait_for: host={{ ansible_eth0.ipv4.address }} port=3306 timeout=1

- hosts: control
  gather_facts: false
  tasks:
    - name: verify end-to-end index response
      uri: url=http://{{item}} return_content=yes
      with_items: groups.loadbalancer
      register: lb_index

    - fail: msg="index failed to return content"
      when: "'Hello, from sunny' not in item.content"
      with_items: "{{lb_index.results}}"

    - name: verify end-to-end db response
      uri: url=http://{{item}}/db return_content=yes
      with_items: groups.loadbalancer
      register: lb_db

    - fail: msg="db failed to return content"
      when: "'Database Connected from' not in item.content"
      with_items: "{{lb_db.results}}"
stack_restart.yml
---
# Bring stack down
- hosts: webserver
  become: true
  gather_facts: false
  tasks:
    - service: name=apache2 state=stopped
    - wait_for: port=80 state=stopped

# Restart mysql
- hosts: database
  become: true
  tasks:
    - service: name=mysql state=restarted
    - wait_for: host={{ ansible_eth0.ipv4.address }} port=3306 state=started

# Bring stack up
- hosts: webserver
  become: true
  gather_facts: false
  tasks:
    - service: name=apache2 state=started
    - wait_for: port=80
role/mysql/defaults/main.yml
---
db_name: myapp
db_user_name: dbuser
db_user_pass: dbpass
db_user_host: localhost
role/mysql/handlers/main.yml
---
- name: restart mysql
  service: name=mysql state=restarted
role/mysql/tasks/main.yml
---
- name: install tools
  apt: name={{item}} state=present
  with_items:
    - python-mysqldb
  tags: [ 'packages' ]

- name: install mysql-server
  apt: name=mysql-server state=present
  tags: [ 'packages' ]

- name: ensure mysql listening on all ports
  lineinfile: dest=/etc/mysql/my.cnf regexp=^bind-address
              line="bind-address = {{ ansible_eth0.ipv4.address }}"
  notify: restart mysql
  tags: [ 'configure' ]

- name: ensure mysql started
  service: name=mysql state=started enabled=yes
  tags: [ 'service' ]

- name: create database
  mysql_db: name={{ db_name }} state=present
  tags: [ 'configure' ]

- name: create user
  mysql_user: name={{ db_user_name }} password={{ db_user_pass }} priv={{ db_name }}.*:ALL
              host='{{ db_user_host }}' state=present
  tags: [ 'configure' ]