Ansible Best Practices - July 30

23
Ansible Best Practices Tyler Turk – DevOps Engineer at WP Engine

description

This is a powerpoint presentation that I put together discussing best practices with Ansible, although it more specifically targets ansible playbooks. The topics include content organization, tips for writing playbooks, discussion around idempotency and it's importance, the power of jinja2 within ansible, and finishes with some lessons learned. This presentation was delivered on July 30th at WP Engine's office for the Austin Ansible MeetUp.

Transcript of Ansible Best Practices - July 30

Page 1: Ansible Best Practices - July 30

Ansible Best PracticesTyler Turk – DevOps Engineer at WP Engine

Page 2: Ansible Best Practices - July 30

Who am I?

DevOps Engineer at WP Engine

Enjoys Operations, Development, and long walks on the beach

Page 3: Ansible Best Practices - July 30

General Overview

Page 4: Ansible Best Practices - July 30

Content Organization

• Follow hierarchy best practices

• Use roles for content

• Simplify your roles

Page 5: Ansible Best Practices - July 30

Make it readable; keep it simple

• Always provide a task name

• Always define state

• Over-use comments and white-space

Page 6: Ansible Best Practices - July 30

Tag all the things

• Tags help organization

• --skip-tags=tags,to,skip

• --tags=only,run,these,tags

Page 7: Ansible Best Practices - July 30

Don’t Repeat Yourself!

• Re-use code when

possible

• Leverage jinja2

templating

• Avoid duplication unless

absolutely necessary

Page 8: Ansible Best Practices - July 30

Idempotency

Page 9: Ansible Best Practices - July 30

What is idempotence?

Idempotence is the property of

certain operations in mathematics

and computer science, that can be

applied multiple times without

changing the result beyond the initial

application

Page 10: Ansible Best Practices - July 30

Why is idempotency important?

Config Management that lacks idempotency introduces

doubt!

• Ensure no changes unless things actually change

• Some idempotency issues can be big issues (> versus >>)

• Hides the real changes in a cloud of doubt

• Reduction in speed if changes are consistently made

• Testing becomes increasingly difficult

Page 11: Ansible Best Practices - July 30

Shooting Yourself in the Foot

• Conflicting tasks for differing roles

• Remember: Don’t Repeat Yourself!

• Double check your work

Page 12: Ansible Best Practices - July 30

How do we get there?

• Fully understand requirements

• Document required processes and

procedures

• Requirement verification with

invested parties

• Review module docs to ensure it is

idempotent

Page 13: Ansible Best Practices - July 30

Some Modules Lacking Idempotency

• Shell module

• Command module

• File module with touch argument

Page 14: Ansible Best Practices - July 30

What are changed_when and failed_when?

Page 15: Ansible Best Practices - July 30

Templating

Page 17: Ansible Best Practices - July 30

Variables with Jinja2

• Avoid dictionaries if values will change

• Accessible with double curly braces

{{ i_am_a_variable }}

{{ cluster.datacenter }}

• Verify variable definition

{% if cluster.lbmaster is not defined %}

# Potential Error: No lbmaster

{% endif %}

Page 18: Ansible Best Practices - July 30

More with Jinja2

• Simple file templating with loops

• Simple file templating with if/else

• Even use variables for file

names!

• Iterate through items, globs, and

hashes

Page 19: Ansible Best Practices - July 30

Lessons Learned

Page 20: Ansible Best Practices - July 30

Lessons Learned

• Long running tasks should run

in screen!

• Leverage the community on

IRC

• Validate proper order of

operations

• Overly document playbooks

and procedures

Page 21: Ansible Best Practices - July 30

More Lessons Learned

• Burn and churn on virtual

instances for additional testing

• Consistency in playbook

development

• Implement actual testing with

ansible-lint and other CI

utilities

• Do not merge non-idempotent

pull requests

Page 22: Ansible Best Practices - July 30

Questions? What about testing? That’s next!

Page 23: Ansible Best Practices - July 30

References

Ansible Playbook Best Practiceshttp://docs.ansible.com/playbooks_best_practices.html

Ansible (Real Life) Good Practiceshttp://www.reinteractive.net/posts/167-ansible-real-life-good-practices

Jinja2 Documentationhttp://jinja.pocoo.org/docs/