Ansible/Directory Layout/Details: Difference between revisions
From charlesreid1
| (10 intermediate revisions by the same user not shown) | |||
| Line 3: | Line 3: | ||
=Example Playbooks Directory= | =Example Playbooks Directory= | ||
This covers the details of the default/recommended directory layout from the Ansible documentation. Link: https://docs.ansible.com/ansible/latest/user_guide/playbooks_best_practices.html | This covers the details of the default/recommended directory layout from the Ansible documentation. Link: https://docs.ansible.com/ansible/latest/user_guide/playbooks_best_practices.html#directory-layout | ||
Here is the example directory layout for an Ansible <code>playbooks/</code> directory: | Here is the example directory layout for an Ansible <code>playbooks/</code> directory: | ||
| Line 54: | Line 54: | ||
We will go through this step by step. | We will go through this step by step. | ||
==Creating the directory structure== | |||
To make the directory structure above, you can also run: | |||
<pre> | |||
$ ansible-galaxy init --init-path=<path-to-roles-directory> <name-of-role> | |||
</pre> | |||
For example, | |||
<pre> | |||
ansible-galaxy init --init-path=playbooks/roles x | |||
</pre> | |||
This will fill in the appropriate directory structure in the directory <code>playbooks/roles/x/*</code> | |||
==Hosts== | ==Hosts== | ||
| Line 129: | Line 145: | ||
===Webservers playbook: webservers.yml=== | ===Webservers playbook: webservers.yml=== | ||
The webservers group can be linked to the web role. | |||
This is done in the webservers playbook: | |||
'''<code>webservers.yml</code>:''' | '''<code>webservers.yml</code>:''' | ||
| Line 139: | Line 153: | ||
<pre> | <pre> | ||
--- | --- | ||
- hosts: webservers | - hosts: webservers | ||
roles: | roles: | ||
- common | - common | ||
- | - web | ||
</pre> | </pre> | ||
Note that this assumes your | Note that this assumes your inventory file has assets grouped like so: | ||
<pre> | <pre> | ||
| Line 165: | Line 178: | ||
===Database servers playbook: dbservers.yml=== | ===Database servers playbook: dbservers.yml=== | ||
The database servers in the dbservers group can be connected to the db role: | |||
The database servers can be connected to the | |||
'''<code>dbservers.yml</code>:''' | '''<code>dbservers.yml</code>:''' | ||
| Line 179: | Line 188: | ||
roles: | roles: | ||
- common | - common | ||
- | - db | ||
</pre> | </pre> | ||
==Roles== | |||
{{Main|Ansible/Roles}} | |||
Each role must define a directory structure containing files to define things like tasks, handlers, templates, etc. | Each role must define a directory structure containing files to define things like tasks, handlers, templates, etc. | ||
| Line 238: | Line 231: | ||
Run for each new role as needed. | Run for each new role as needed. | ||
===Common | ===Common Role=== | ||
The common role is a role that defines default values for all roles. Each subsequent role can override these settings selectively. | |||
<pre> | <pre> | ||
| Line 268: | Line 261: | ||
fooapp/ # "" | fooapp/ # "" | ||
</pre> | </pre> | ||
The details of each subdirectory of each role is covered on the [[Ansible/Roles]] page: | |||
* tasks - https://charlesreid1.com/wiki/Ansible/Roles#Tasks | |||
* files - https://charlesreid1.com/wiki/Ansible/Roles#Files | |||
* variables - https://charlesreid1.com/wiki/Ansible/Roles#Variables_2 | |||
* defaults - https://charlesreid1.com/wiki/Ansible/Roles#Defaults_2 | |||
* handlers - https://charlesreid1.com/wiki/Ansible/Roles#Handlers | |||
=Flags= | =Flags= | ||
{{AnsibleFlag}} | {{AnsibleFlag}} | ||
Latest revision as of 18:56, 9 December 2018
Example Playbooks Directory
This covers the details of the default/recommended directory layout from the Ansible documentation. Link: https://docs.ansible.com/ansible/latest/user_guide/playbooks_best_practices.html#directory-layout
Here is the example directory layout for an Ansible playbooks/ directory:
hosts # inventory file
group_vars/
group1.yml # here we assign variables to particular groups
group2.yml
host_vars/
hostname1.yml # here we assign variables to particular systems
hostname2.yml
library/ # if any custom modules, put them here (optional)
module_utils/ # if any custom module_utils to support modules, put them here (optional)
filter_plugins/ # if any custom filter plugins, put them here (optional)
site.yml # master playbook
webservers.yml # playbook for webservers role
dbservers.yml # playbook for dbservers role
fooapp.yml # playbook for foo app
roles/
common/ # this hierarchy represents defaults for 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
webservers/ # same kind of structure as "common" was above, done for the webservers role
dbservers/ # ""
fooapp/ # ""
We will go through this step by step.
Creating the directory structure
To make the directory structure above, you can also run:
$ ansible-galaxy init --init-path=<path-to-roles-directory> <name-of-role>
For example,
ansible-galaxy init --init-path=playbooks/roles x
This will fill in the appropriate directory structure in the directory playbooks/roles/x/*
Hosts
The hosts file will contain information about different hosts.
If you need to separate production and staging host files, you can split hosts into production and staging, and use the -i flag when running ansible to specify an inventory file.
Group Variables
Start with how you define defaults for group variables: create an all file in the group_vars folder
--- # file: group_vars/all ntp: ntp-boston.example.com backup: backup-boston.example.com
If we have a group called webservers, any hosts in the webservers group will load the variables in the file group_vars/webservers. Here is an example:
--- # file: group_vars/webservers apacheMaxRequestsPerChild: 3000 apacheMaxClients: 900
If using a group to denote geographic regions, can use that to set information about how to reach other servers (nearby ones):
--- # file: group_vars/atlanta ntp: ntp-atlanta.example.com backup: backup-atlanta.example.com
Host Variables
It is not encouraged to use host-specific variables - use groups when possible - but sometimes you must (e.g., changing port numbers to get around site-specific restrictions).
Example host variables file:
--- # file: host_vars/db-bos-1.example.com foo_agent_port: 86 bar_agent_port: 99
Playbooks
Now we get to the actual playbooks:
site.yml # master playbook webservers.yml # playbook for webservers role dbservers.yml # playbook for dbservers role fooapp.yml # playbook for foo app
Master playbook: site.yml
The master playbook is the simplest, as it just includes other playbooks.
site.yml:
--- # file: site.yml - import_playbook: webservers.yml - import_playbook: dbservers.yml
Webservers playbook: webservers.yml
The webservers group can be linked to the web role.
This is done in the webservers playbook:
webservers.yml:
---
- hosts: webservers
roles:
- common
- web
Note that this assumes your inventory file has assets grouped like so:
mail.example.com [webservers] foo.example.com bar.example.com [dbservers] one.example.com two.example.com three.example.com
For more info on roles, see Ansible/Roles and Ansible/Separate Playbooks by Role
Database servers playbook: dbservers.yml
The database servers in the dbservers group can be connected to the db role:
dbservers.yml:
---
# file: dbservers.yml
- hosts: dbservers
roles:
- common
- db
Roles
Each role must define a directory structure containing files to define things like tasks, handlers, templates, etc.
This directory structure can be made by hand if there are just a few folders/things to override from the default (common) role, but here is the full directory structure:
playbooks
└── roles
└── x
├── README.md
├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── tasks
│ └── main.yml
├── templates
├── tests
│ ├── inventory
│ └── test.yml
└── vars
└── main.yml
Use the ansible-galaxy command to create this directory structure automatically:
ansible-galaxy init -p playbooks/roles x
This will fill in the appropriate directory structure in the directory playbooks/roles/x/*
Run for each new role as needed.
Common Role
The common role is a role that defines default values for all roles. Each subsequent role can override these settings selectively.
roles/
common/ # this hierarchy represents defaults for 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
webservers/ # same kind of structure as "common" was above, done for the webservers role
dbservers/ # ""
fooapp/ # ""
The details of each subdirectory of each role is covered on the Ansible/Roles page:
- tasks - https://charlesreid1.com/wiki/Ansible/Roles#Tasks
- files - https://charlesreid1.com/wiki/Ansible/Roles#Files
- variables - https://charlesreid1.com/wiki/Ansible/Roles#Variables_2
- defaults - https://charlesreid1.com/wiki/Ansible/Roles#Defaults_2
- handlers - https://charlesreid1.com/wiki/Ansible/Roles#Handlers
Flags