Shows an excerpt of the PERFORM 2014 Conference's Hands-On Training on Automated Deployments. Tells the why and the how and differentiates between agent-based and agentless solutions, such as Chef, Puppet or Ansible. Goes into greater detail on the Ansible host automation tool.
VK Business Profile - provides IT solutions and Web Development
Automated Deployments
1. Automated Deployments – Hands-On
Orlando, October 2014
Martin Etmajer
martin.etmajer@dynatrace.com
Senior Technology Strategist @ Dynatrace
1 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
2. image here “ Martin Etmajer
Insert headshot
Senior Technology Strategist @ Dynatrace
martin.etmajer@dynatrace.com
@metmajer
2 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
20. Motivation
Production environments are often grown “works of art”:
» Not entirely reproducible
» Manual changes applied whenever needed
» Not even similar to the environments developers have
“Works on my machine.”
20 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
22. Benefits: Automation
Makes provisioning a repeatable, low-risk “push-button” activity
» By providing executable specifications
» No manual changes involved (regarded immutable)
» The process is tested with each execution (builds confidence)
Recreate
Environments
22 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
23. Benefits: Automation
Makes provisioning an engineering discipline:
» Iteratively plan, code, test and verify
» Open to frequently changing requirements (agile)
Helps align efforts between Development and Operations:
» Jointly define desired environmental states
» Integrate and respect each others processes
23 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
24. Implement
and test Verification
DEVELOPMENT
OPERATIONS
Benefits: Automation
current iteration
(2 weeks)
time
Planning
24 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
25. Benefits: Automation
Allows the provisioning process to be integrated into the Continuous Delivery build
pipeline (build automation server):
» Environments can be provisioned multiple times a day
» When the process fails in staging, the release candidate is discarded - the production
environment will not be harmed
25 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
26. Benefits: Automation
Reduces the risks of software releases by providing a consistent process for all staging
and production environments
Risks?
» Differing library versions
» Differing middleware configurations
» Differing environmental variables in the OS
» Differing number of max. open file handles in the OS,…
26 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
28. Benefits: Auditability
What, who, why and when?
» Keep all (executable) specifications in VCS
» Provide meaningful commit messages (changelog)
» Build history tells you which revision got deployed
“Infrastructure as Code”
28 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
30. Benefits: Repeatability
Establishes a process that is repeatable at any time:
» Environments are no longer in the hands of single people
» Any (authorized) person could recreate the environments
» Requires command execution to be idempotent
30 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
31. Benefits: Repeatability
Allows for testability of the deployment process:
» Failures will be caught early-on in the process
What if something breaks?
» Caught a bug: use a version that is known to work
» Hardware failure: redeploy environment in minutes
Minimizes MTTR
31 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
37. Agent-Based Deployments (Chef, Puppet)
» Can be used in client-server or client-only modes
» Client must be installed on each host to be provisioned
» Clients have dependencies: Ruby
37 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
38. Agent-Based Deployments
Puppet
» Written and extensible in Ruby (comes with a DSL)
» Order of statement does not specify order of execution
» Huge ecosystem (PuppetDB, MCollective, Hiera)
» Large entrance barrier
38 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
44. Agentless Deployments
Ansible
» Written and extensible (Python)
» Human- and machine-readable configuration (YAML)
» No boot-strapping required on deployment hosts (SSH)
» Simple, easy to ramp up with (think of new employees!)
» Clear and concise documentation
44 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
46. Sample Environment
Web Server Frontend
Application Server
Backend
Application Server
Database
check out deploy
VCS Build Automation
46 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
47. Sample Environment
Apache Apache Tomcat Apache Tomcat PostgreSQL
Web Server Frontend
Application Server
Backend
Application Server
Database
Git
VCS
Jenkins
check out deploy
Build Automation
47 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
48. Use Case: Deploy Dynatrace Agents
Apache Apache Tomcat Apache Tomcat PostgreSQL
Web Server Frontend
Application Server
Backend
Application Server
Database
Git
VCS
Jenkins
check out deploy
Build Automation
48 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
49. Use Case: Deploy Dynatrace Agents
Apache Apache Tomcat Apache Tomcat PostgreSQL
Web Server Frontend
Application Server
Backend
Application Server
Database
Git
VCS
Jenkins
check out deploy
Build Automation
Dynatrace Server
49 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
51. Today you will learn how to automatically...
1. Inject dynaTrace Agents into Apache Tomcats
2. Load database data into PostgreSQL
3. Integrate all this into Jenkins
51 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
54. Ansible Concepts: Inventories
» Ansible provisions groups of servers at once
» Groups and hosts are stored in inventory files
» An inventory file is expressed in a simple INI format
» Default location: /etc/ansible/hosts
» bit.ly/ansible-inventory
54 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
55. Ansible Concepts: Inventories
[frontends]
frontend.example.com
[backends]
backend.example.com
[frontends:vars]
dt_agent_name=frontend
Group
Variables Variable
[backends:vars]
dt_agent_name=backend
Group
Host
55 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
61. Ansible Concepts: Playbooks
ansible-playbook [–i <inventory>] <playbook>
Playbooks
» Describe policies your remote systems shall enforce
» Consist of variables, tasks, handlers, files and roles
» Are expressed in the YAML format
» bit.ly/ansible-playbook
61 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
62. Excursion to YAML
YAML (YAML Ain’t No Markup Language): Motivation
» “All data structures can be expressed via dicts, lists and scalars”
» Simplicity makes it much easier to read and parse than XML
62 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
63. YAML Excursion » Dictionaries
--- # Block
name: Michael Jordan
age: 34
--- # Inline
{ name: Michael Jordan, age: 34 }
63 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
64. YAML Excursion » Dictionaries
--- # Block
name: Michael Jordan
age: 34
--- # Inline
{ name: Michael Jordan, age: 34 }
Document
64 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
65. YAML Excursion » Dictionaries
--- # Block
name: Michael Jordan
age: 34
--- # Inline
{ name: Michael Jordan, age: 34 }
key: value
Same
Indentation
level
65 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
66. YAML Excursion » Dictionaries
--- # Block
name: Michael Jordan
age: 34
Comment
Optional quotes
for Strings
--- # Inline
{ name: Michael Jordan, age: 34 }
66 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
67. YAML Excursion » Lists
--- # Block
- milk
- bread
- butter
--- # Inline
[milk, bread, butter]
67 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
68. YAML Excursion » Lists
--- # Block
- milk
- bread
- butter
--- # Inline
[milk, bread, butter]
Items start with
hyphen + space
68 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
69. YAML Excursion » Lists
--- # Block
- milk
- bread
- butter
--- # Inline
[Smaimlke, bread, butter]
indentation
level
69 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
74. Ansible Concepts: Playbooks
# production
[frontends]
frontend.example.com
[backends]
backend.example.com
[frontends:vars]
dt_agent_name=frontend
[backends:vars]
dt_agent_name=backend
74 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
75. Ansible Concepts: Playbooks
# templates/tomcat-setenv.sh
CATALINA_OPTS="$CATALINA_OPTS
-agentpath:{{ dt_agent_dir }}/libdtagent.so
=name={{ dt_agent_name }},collector={{ dt_collector_url }}"
75 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
76. Ansible Concepts: Playbooks
--- # variables.yml
tomcat_home: /opt/tomcat
dt_agent_dir: /opt/dynatrace/agents
dt_collector_url: dynatrace.example.com
76 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
77. Ansible Concepts: Playbooks
ansible-playbook –i production appservers.yml
Run!
PLAY [frontends:backends]
******************************************************
TASK: [Inject dynaTrace Java agent into Apache Tomcat]
************************
changed: [backend.example.com]
changed: [frontend.example.com]
PLAY RECAP
************************************************************************
backend.example.com : ok=1 changed=1 unreachable=0 failed=0
frontend.example.com : ok=1 changed=1 unreachable=0 failed=0
77 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
78. Ansible Concepts: Playbooks
--- # playbook.yml
- include: appservers.yml
- include: dbservers.yml
- include: webservers.yml
Includes multiple plays
into a single playbook
78 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
79. Ansible Concepts: Playbooks » Variables
Usage
» {{ foo }}
» {{ foo[i] }}
» {{ foo.bar }}
» Hello, my name is {{ foo }}
» bit.ly/ansible-variables
79 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
85. Ansible Concepts: Playbooks » Variables
Advance Usage
» {{ foo | mandatory }}
» {{ foo | default(0) }}
» {{ list| min }}
» {{ list| unique }}
» {{ list1 | union(list2) }}
» bit.ly/ansible-variables
Computes a join of lists ‘list1 and ‘list2’
85 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
86. Ansible Concepts: Playbooks » Variables
Validity
» Valid: ‘foo_bar’, ‘foo5’
» Invalid: ‘foo-bar’, ‘foo bar’, ‘foo.bar’, ‘5foo’, ‘5’
86 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
87. Ansible Concepts: Playbooks » Variables
--- # playbook.yml
- hosts: all
vars:
- cleanup_home: yes
- settings:
ports:
http: 80
ssl: 443
…
Inlined
87 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
88. Ansible Concepts: Playbooks » Variables
--- # playbook.yml
- hosts: all
vars_files:
- variables.yml
…
--- # variables.yml
cleanup_home: yes
settings:
ports:
http: 80
ssl: 443
Imported
88 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
89. Ansible Concepts: Playbooks » Variables
--- # playbook.yml
- hosts: all
tasks:
- { include: create-user.yml, user: deploy }
…
Defined in
task inclusion
89 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
90. Ansible Concepts: Playbooks » Variables
--- # playbook.yml
- hosts: all
roles:
- { role: create-user, user: deploy }
…
Defined in
role inclusion
90 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
91. Ansible Concepts: Playbooks » Variables
ansible –e ‘user=deploy’ playbook.yml
Defined at
invocation
91 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
92. Ansible Concepts: Playbooks » Tasks
Tasks are...
» invocations of Ansible modules
» the units that do the actual deployment and configuration
» bit.ly/ansible-module
92 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
94. Ansible Concepts: Playbooks » Tasks
Example: Copy file from src (localhost) to dest (remote host)
--- # webservers.yml
- hosts: webservers
tasks:
- name: Copy file from ‘foo.conf’ to /etc/default
copy: >
src=/srv/files/foo.conf
dest=/etc/default
owner=deploy
group=deploy
mode=644
94 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
95. Ansible Concepts: Playbooks » Roles
Roles
» Are the preferred means to organize and reuse related tasks
» Build on the idea of include files to form clean abstractions
» bit.ly/ansible-roles
95 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
96. Ansible Concepts: Playbooks » Roles
Reusing Roles in a Play
--- # webservers.yml
- hosts: webservers
roles:
- { role: common }
- { role: apache2 }
remote_user: deploy
sudo: yes
96 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
97. Ansible Concepts: Playbooks » Roles
Best Practice: Directory Layout for Role-based Playbooks
playbook.yml
appservers.yml
dbservers.yml
webservers.yml
Top-level Playbook
/roles/x
/roles/x/meta/main.yml
/roles/x/defaults/main.yml
/roles/x/files
/roles/x/handlers/main.yml
/roles/x/tasks/main.yml
/roles/x/templates/main.yml
/roles/x/vars/main.yml
97 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
98. Ansible Concepts: Playbooks » Roles
Best Practice: Directory Layout for Role-based Playbooks
playbook.yml
appservers.yml
dbservers.yml
webservers.yml
Plays
/roles/x
/roles/x/meta/main.yml
/roles/x/defaults/main.yml
/roles/x/files
/roles/x/handlers/main.yml
/roles/x/tasks/main.yml
/roles/x/templates/main.yml
/roles/x/vars/main.yml
98 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
99. Ansible Concepts: Playbooks » Roles
Best Practice: Directory Layout for Role-based Playbooks
playbook.yml
appservers.yml
dbservers.yml
webservers.yml
/roles/x
/roles/x/meta/main.yml
/roles/x/defaults/main.yml
/roles/x/files
/roles/x/handlers/main.yml
/roles/x/tasks/main.yml
/roles/x/templates/main.yml
/roles/x/vars/main.yml
Holds a role named ‘x’
99 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
100. Ansible Concepts: Playbooks » Roles
Best Practice: Directory Layout for Role-based Playbooks
playbook.yml
appservers.yml
dbservers.yml
webservers.yml
/roles/x
/roles/x/meta/main.yml
/roles/x/defaults/main.yml
/roles/x/files
/roles/x/handlers/main.yml
/roles/x/tasks/main.yml
/roles/x/templates/main.yml
/roles/x/vars/main.yml
Dependencies
100 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
101. Ansible Concepts: Playbooks » Roles
Best Practice: Directory Layout for Role-based Playbooks
playbook.yml
appservers.yml
dbservers.yml
webservers.yml
/roles/x
/roles/x/meta/main.yml
/roles/x/defaults/main.yml
/roles/x/files
/roles/x/handlers/main.yml
/roles/x/tasks/main.yml
/roles/x/templates/main.yml
/roles/x/vars/main.yml
Default variables
101 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
102. Ansible Concepts: Playbooks » Roles
Best Practice: Directory Layout for Role-based Playbooks
playbook.yml
appservers.yml
dbservers.yml
webservers.yml
/roles/x
/roles/x/meta/main.yml
/roles/x/defaults/main.yml
/roles/x/files
/roles/x/handlers/Files
main.yml
/roles/x/tasks/main.yml
/roles/x/templates/main.yml
/roles/x/vars/main.yml
102 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
103. Ansible Concepts: Playbooks » Roles
Best Practice: Directory Layout for Role-based Playbooks
playbook.yml
appservers.yml
dbservers.yml
webservers.yml
/roles/x
/roles/x/meta/main.yml
/roles/x/defaults/main.yml
/roles/x/files
/roles/x/handlers/main.yml
/roles/x/tasks/main.yml
/roles/x/templates/main.yml
/roles/x/vars/main.yml
Handlers
103 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
104. Ansible Concepts: Playbooks » Roles
Best Practice: Directory Layout for Role-based Playbooks
playbook.yml
appservers.yml
dbservers.yml
webservers.yml
/roles/x
/roles/x/meta/main.yml
/roles/x/defaults/main.yml
/roles/x/files
/roles/x/handlers/main.yml
/roles/x/tasks/main.yml
/roles/x/templates/main.yml
/roles/x/vars/main.yml
Tasks
104 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
105. Ansible Concepts: Playbooks » Roles
Best Practice: Directory Layout for Role-based Playbooks
playbook.yml
appservers.yml
dbservers.yml
webservers.yml
/roles/x
/roles/x/meta/main.yml
/roles/x/defaults/main.yml
/roles/x/files
/roles/x/handlers/main.yml
/roles/x/tasks/main.yml
/roles/x/templates/main.yml
/roles/x/vars/main.yml Templates
105 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
106. Ansible Concepts: Playbooks » Roles
Best Practice: Directory Layout for Role-based Playbooks
playbook.yml
appservers.yml
dbservers.yml
webservers.yml
/roles/x
/roles/x/meta/main.yml
/roles/x/defaults/main.yml
/roles/x/files
/roles/x/handlers/main.yml
/roles/x/tasks/main.yml
/roles/x/templates/main.yml
/roles/x/vars/main.yml
Variables
106 COMPANY CONFIDENTIAL – DO NOT DISTRIBUTE #Perform2014
ad “Immutability”: whenever a change needs to be done, the environments are recreated by pushing a button
ad “jointly define”: but driven by development (which is itself driven by product management)
ad “multiple times a day”: some companies do this multiple times per hour even; Cloud-based deployments make this feasible by creating spinning up new environments and let load balancers point to them after have been provisioned
ad “Consistency”: Consistency does not necessarily mean equality; often only a high degree of similarity can be achieved (however, all environments must be created by the same process)
ad “idempotent”: commands in popular hosting automation tools are already implementated that way, so usually this is nothing you need to worry about, unless you with to implement your own; Examples: install a service only if it is not already installed; add a line to some configuration file only if it is not already contained
ad “testability”: building up an automated deployment strategy is not an undertaking that is free of errors; being able to apply a fix and reinitiate the whole process inside a testing environment (that skips all those commands which are already fulfilled) greatly improves development speed
MTTR = Mean Time to Recover / Mean Time to Repair
There are a variety of deployment automation tools out there. But how to choose a deployment solution that is right for you? Maybe a differentiation between agent-based vs. agentless architectures can help you make a decision.
Note: terms “agent” and “client” are used interchangeably
Note: terms “agent” and “client” are used interchangeably
Note: terms “agent” and “client” are used interchangeably
ad “client must be installed”: how do you get them there (often done manually)? client may also require an update once in a while
ad “written in Ruby”: consequently has Ruby as a dependency, problematic in mixed environments (AIX, BSD, Unix, etc.)
ad “order of statements”: in Puppet you specify the desired end state, Puppet decides on its own how to get there
ad “large entrance barrier”: takes a long time for new hires to ramp up and understand existing specifications
“As a user has claimed on reddit.com, there seem to be version incompatibilities with PuppetDB (PuppetDB requires client nodes to install a “PuppetDB terminus” plugin), which have prevented this user from upgrading older environments easily. Usually, this is not something that you would consider when evaluating a tool. Clearly, having to rely on agents can have its disadvantages. Let’s look at a different approach.”
Ad-hoc commands are a great way to test commands on the command line, however, for real server orchestration, there’s a much more powerful concept: Ansible Playbooks.
Ad-hoc commands are a great way to test commands on the command line, however, for real server orchestration, there’s a much more powerful concept: Ansible Playbooks.
Ad-hoc commands are a great way to test commands on the command line, however, for real server orchestration, there’s a much more powerful concept: Ansible Playbooks.
ad “read and parse”: most computer languages already have dicts, lists and scalar types (String, Number, etc.) built in. XML goes a different way here.
“There are a couple of things to identify here.”
“There are a couple of things to identify here.”
“There are a couple of things to identify here.”
Everything you see here is executed in order.
ad “play”: A play maps a group of hosts to a set of tasks. By composing a playbook of multiple plays, it is possible to orchestrate multi-server deployments: run certain tasks on the group of webservers, then some tasks on the group of dbservers, then some more commands back on the webservers group, etc.
“So, let’s install a package.”
ad “dependencies”: Role dependencies allow you to transitively pull in other roles, e.g. a -> b -> c
ad “default variables”: Role default variables allow you to define default variables for included and dependent roles. These variables have the lowest priority and can thus be overridden easily.
ad “files”: Placing files within a role comes with great convenience: copy and script tasks can reference files relatively to this folder
ad “templates”: Templates are similar to files with the difference that variables will be replaced in templates. They are then processed with the template tasks and locations can be referenced relatively to this folder.
ad “variables”: Variables placed in here will be added to the play. They override any default variables.
ad “dependencies”: Role dependencies allow you to transitively pull in other roles, e.g. a -> b -> c
ad “default variables”: Role default variables allow you to define default variables for included and dependent roles. These variables have the lowest priority and can thus be overridden easily.
ad “files”: Placing files within a role comes with great convenience: copy and script tasks can reference files relatively to this folder
ad “templates”: Templates are similar to files with the difference that variables will be replaced in templates. They are then processed with the template tasks and locations can be referenced relatively to this folder.
ad “variables”: Variables placed in here will be added to the play. They override any default variables.
ad “dependencies”: Role dependencies allow you to transitively pull in other roles, e.g. a -> b -> c
ad “default variables”: Role default variables allow you to define default variables for included and dependent roles. These variables have the lowest priority and can thus be overridden easily.
ad “files”: Placing files within a role comes with great convenience: copy and script tasks can reference files relatively to this folder
ad “templates”: Templates are similar to files with the difference that variables will be replaced in templates. They are then processed with the template tasks and locations can be referenced relatively to this folder.
ad “variables”: Variables placed in here will be added to the play. They override any default variables.
ad “dependencies”: Role dependencies allow you to transitively pull in other roles, e.g. a -> b -> c
ad “default variables”: Role default variables allow you to define default variables for included and dependent roles. These variables have the lowest priority and can thus be overridden easily.
ad “files”: Placing files within a role comes with great convenience: copy and script tasks can reference files relatively to this folder
ad “templates”: Templates are similar to files with the difference that variables will be replaced in templates. They are then processed with the template tasks and locations can be referenced relatively to this folder.
ad “variables”: Variables placed in here will be added to the play. They override any default variables.
ad “dependencies”: Role dependencies allow you to transitively pull in other roles, e.g. a -> b -> c
ad “default variables”: Role default variables allow you to define default variables for included and dependent roles. These variables have the lowest priority and can thus be overridden easily.
ad “files”: Placing files within a role comes with great convenience: copy and script tasks can reference files relatively to this folder
ad “templates”: Templates are similar to files with the difference that variables will be replaced in templates. They are then processed with the template tasks and locations can be referenced relatively to this folder.
ad “variables”: Variables placed in here will be added to the play. They override any default variables.
ad “dependencies”: Role dependencies allow you to transitively pull in other roles, e.g. a -> b -> c
ad “default variables”: Role default variables allow you to define default variables for included and dependent roles. These variables have the lowest priority and can thus be overridden easily.
ad “files”: Placing files within a role comes with great convenience: copy and script tasks can reference files relatively to this folder
ad “templates”: Templates are similar to files with the difference that variables will be replaced in templates. They are then processed with the template tasks and locations can be referenced relatively to this folder.
ad “variables”: Variables placed in here will be added to the play. They override any default variables.
ad “dependencies”: Role dependencies allow you to transitively pull in other roles, e.g. a -> b -> c
ad “default variables”: Role default variables allow you to define default variables for included and dependent roles. These variables have the lowest priority and can thus be overridden easily.
ad “files”: Placing files within a role comes with great convenience: copy and script tasks can reference files relatively to this folder
ad “templates”: Templates are similar to files with the difference that variables will be replaced in templates. They are then processed with the template tasks and locations can be referenced relatively to this folder.
ad “variables”: Variables placed in here will be added to the play. They override any default variables.
ad “dependencies”: Role dependencies allow you to transitively pull in other roles, e.g. a -> b -> c
ad “default variables”: Role default variables allow you to define default variables for included and dependent roles. These variables have the lowest priority and can thus be overridden easily.
ad “files”: Placing files within a role comes with great convenience: copy and script tasks can reference files relatively to this folder
ad “templates”: Templates are similar to files with the difference that variables will be replaced in templates. They are then processed with the template tasks and locations can be referenced relatively to this folder.
ad “variables”: Variables placed in here will be added to the play. They override any default variables.
ad “dependencies”: Role dependencies allow you to transitively pull in other roles, e.g. a -> b -> c
ad “default variables”: Role default variables allow you to define default variables for included and dependent roles. These variables have the lowest priority and can thus be overridden easily.
ad “files”: Placing files within a role comes with great convenience: copy and script tasks can reference files relatively to this folder
ad “templates”: Templates are similar to files with the difference that variables will be replaced in templates. They are then processed with the template tasks and locations can be referenced relatively to this folder.
ad “variables”: Variables placed in here will be added to the play. They override any default variables.
ad “dependencies”: Role dependencies allow you to transitively pull in other roles, e.g. a -> b -> c
ad “default variables”: Role default variables allow you to define default variables for included and dependent roles. These variables have the lowest priority and can thus be overridden easily.
ad “files”: Placing files within a role comes with great convenience: copy and script tasks can reference files relatively to this folder
ad “templates”: Templates are similar to files with the difference that variables will be replaced in templates. They are then processed with the template tasks and locations can be referenced relatively to this folder.
ad “variables”: Variables placed in here will be added to the play. They override any default variables.