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' ] |