Role
Contains the related Tasks and Play and variables that related to that role.
Ansible role let you automatically load related vars, files and handlers based on a known file structure
roles/
common/ # this hierarchy represents a "role"
tasks/ #
main.yml # <-- tasks file can include smaller files if warranted
handlers/ #
main.yml # <-- handlers file
templates/ # <-- files for use with the template resource
ntp.conf.j2 # <------- templates end in .j2
files/ #
bar.txt # <-- files for use with the copy resource
foo.sh # <-- script files for use with the script resource
vars/ #
main.yml # <-- variables associated with this role
defaults/ #
main.yml # <-- default lower priority variables for this role
meta/ #
main.yml # <-- role dependencies
library/ # roles can also include custom modules
module_utils/ # roles can also include custom module_utils
lookup_plugins/ # or other types of plugins, like lookup in this case
webtier/ # same kind of structure as "common" was above, done for the webtier role
monitoring/ # ""
fooapp/ # ""
By default, Ansible will look in most role directories for a main.yml file for relevant content (also main.yaml and main):
tasks/main.yml- A list of tasks that the role provides to the play for execution.handlers/main.yml- handlers that are imported into the parent play for use by the role or other roles and tasks in the play.defaults/main.yml- very low precedence values for variables provided by the role (see Using Variables for more information). A role’s own defaults will take priority over other role’s defaults, but any/all other variable sources will override this.vars/main.yml- high precedence variables provided by the role to the play (see Using Variables for more information).files/stuff.txt- one or more files that are available for the role and it’s children.templates/something.j2- templates to use in the role or child roles.meta/main.yml- metadata for the role, including role dependencies and optional Galaxy metadata such as platforms supported. This is required for uploading into galaxy as a standalone role, but not for using the role in your play.
How to use Roles
- Create your folder:
roles/role_name - Create the folders inside
roles/role_namedepending on what you need. For exampletasks:roles/role_name/tasks - Create the main file:
roles/role_name/tasks/main.yml - Include the roles in
roles:on the main playbook. It will automatically execute the tasks inroles/role_name/tasks
Example:
Create roles/db/tasks
- name: install postgres
apt:
purge: yes
name: postgresql
Create roles/webservers/tasks
- name: Update the cache
apt:
purge: yes
name: apache2
state: present
- name: start apache2
ansible.builtin.systemd_service:
name: apache2
enabled: true
state: started
In main playbook (site.yml)
---
- name: Install required dependencies for web app
hosts: app
become: yes
roles:
- webservers
- name: Install required dependencies for db
hosts: db
become: yes
roles:
- db
Use inventory file (staging.yml)
app:
hosts:
app1:
ansible_host: 192.168.60.4
app2:
ansible_host: 192.168.60.5
db:
hosts:
app3:
ansible_host: 192.168.60.6
server:
children:
db:
app:
vars:
ansible_user: vagrant
ansible_ssh_private_key_file: ~/.vagrant.d/insecure_private_key
We can then run using
ansible-playbook -i staging.yml site.yml