Ansible/Roles: Difference between revisions
From charlesreid1
| Line 39: | Line 39: | ||
</pre> | </pre> | ||
==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: | |||
<pre> | |||
playbooks/ | |||
roles/ | |||
database/ | |||
tasks/ | |||
main.yml | |||
handlers/ | |||
main.yml | |||
files/ | |||
pg_hba.conf | |||
postgresql.conf | |||
webserver/ | |||
... | |||
</pre> | |||
The files folder contains two postgres configuration files: | |||
* postgresql.conf configures postgres to accept connections on any network interface (since default is localhost only) | |||
* pg_hba.conf configures postgres to accept a username and password to authenticate | |||
=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). | |||
=Flags= | =Flags= | ||
{{AnsibleFlag}} | {{AnsibleFlag}} | ||
Revision as of 18:08, 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/
...
The files folder contains two postgres configuration files:
- postgresql.conf configures postgres to accept connections on any network interface (since default is localhost only)
- pg_hba.conf configures postgres to accept a username and password to authenticate
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).
Flags