Ansible/Roles: Difference between revisions
From charlesreid1
| Line 71: | Line 71: | ||
The web frontend can use an nginx web server playbook (see [[Ansible/Nginx Playbook]] for sample nginx playbook). | The web frontend can use an nginx web server playbook (see [[Ansible/Nginx Playbook]] for sample nginx playbook). | ||
==Example Playbook== | ==Example Playbook: Single Host== | ||
Here is an example playbook with two roles, web and database. | Here is an example playbook with two roles, web and database. | ||
<pre> | |||
- name: deploy webapp on vagrant | |||
hosts: web | |||
vars_files: | |||
- secrets.yml | |||
roles: | |||
- role: database | |||
database_name: "{{ mezzanine_proj_name }}" | |||
database_user: "{{ mezzanine_proj_name }}" | |||
- role: webserver | |||
live_hostname: 192.168.33.10.xip.io | |||
domains: | |||
- 192.168.33.10.xip.io | |||
- www.192.168.33.10.xip.io | |||
</pre> | |||
==Example Playbook: Single Host with Pre and Post Tasks== | |||
Here is the same playbook but running a pre/post task before/after the roles are defined. These pre/post tasks will be run once per host. | |||
<pre> | <pre> | ||
| Line 92: | Line 110: | ||
database_user: "{{ mezzanine_proj_name }}" | database_user: "{{ mezzanine_proj_name }}" | ||
- role: | - role: webserver | ||
live_hostname: 192.168.33.10.xip.io | live_hostname: 192.168.33.10.xip.io | ||
domains: | domains: | ||
| Line 106: | Line 124: | ||
msg="web server {{ inventory_hostname }} configured" | msg="web server {{ inventory_hostname }} configured" | ||
</pre> | </pre> | ||
===Database role=== | ===Database role=== | ||
Revision as of 18:39, 13 November 2018
Playbook Roles
What are Ansible roles?
Roles allow you to split your playbook into different parts for different servers.
For example, a webapp with a database backend can define a webserver role and a database role, and it becomes much easier to modify the playbook to run these on the same host or on different hosts.
Feature: pre-tasks and post-tasks
In the playbook you can specify a pre-task and a post-task for a role.
For example, suppose you want to update aptitude before deploying the web server, and you want to send a notification to Slack when you are finished.
Then you could use the following playbook, which defines a pre_tasks list of things to do before the roles are defined, and a post_task list of things to do once the roles have been carried out.
- name: deploy mezzanine on vagrant
hosts: web
vars_files:
- secrets.yml
pre_tasks:
- name: update the apt cache
apt: update_cache=yes
roles:
- role: mezzanine
database_host: "{{ hostvars.db.ansible_eth1.ipv4.address }}"
live_hostname: 192.168.33.10.xip.io
domains:
- 192.168.33.10.xip.io
- www.192.168.33.10.xip.io
post_tasks:
- name: notify Slack that the servers have been updated
local_action: >
slack
domain=acme.slack.com
token={{ slack_token }}
msg="web server {{ inventory_hostname }} configured"
Feature: role files
If a role is particularly complicated or has details of its own to take care of, you can put all of the files specific to one particular role into a directory.
Suppose you have two roles, webserver and database. Then your directory structure would look like this:
playbooks/
roles/
database/
tasks/
main.yml
handlers/
main.yml
files/
pg_hba.conf
postgresql.conf
webserver/
...
Tasks, handlers, files, templates, etc. are all put into subfolders with the same name as the role.
Example
Let's look at an example of deploying an application with Ansible that a classic architecture: a web frontend with a database backend.
The web frontend can use an nginx web server playbook (see Ansible/Nginx Playbook for sample nginx playbook).
Example Playbook: Single Host
Here is an example playbook with two roles, web and database.
- name: deploy webapp on vagrant
hosts: web
vars_files:
- secrets.yml
roles:
- role: database
database_name: "{{ mezzanine_proj_name }}"
database_user: "{{ mezzanine_proj_name }}"
- role: webserver
live_hostname: 192.168.33.10.xip.io
domains:
- 192.168.33.10.xip.io
- www.192.168.33.10.xip.io
Example Playbook: Single Host with Pre and Post Tasks
Here is the same playbook but running a pre/post task before/after the roles are defined. These pre/post tasks will be run once per host.
- name: deploy mezzanine on vagrant
hosts: web
vars_files:
- secrets.yml
pre_tasks:
- name: update the apt cache
apt: update_cache=yes
roles:
- role: database
database_name: "{{ mezzanine_proj_name }}"
database_user: "{{ mezzanine_proj_name }}"
- role: webserver
live_hostname: 192.168.33.10.xip.io
domains:
- 192.168.33.10.xip.io
- www.192.168.33.10.xip.io
post_tasks:
- name: notify Slack that the servers have been updated
local_action: >
slack
domain=acme.slack.com
token={{ slack_token }}
msg="web server {{ inventory_hostname }} configured"
Database role
The database role has multiple files associated with it, to define the tasks, default variable values, handlers, files, and templates used by Ansible.
These should go in playbooks/roles/database/.
Flags