SlideShare ist ein Scribd-Unternehmen logo
1 von 54
Network Automation:
Ansible 101
APRICOT - Feb 28th, 2017
Bronwyn Lewis and Matt Peterson
Our assumptions
➔ New to the world of “DevOps”
➔ No prior Ansible knowledge
➔ Want to stop hand-crafting
your network configs
Introduction
➔ Tutorial dependencies
➔ Introductions
➔ DevOps intro
Agenda
Tutorial
➔ Ansible intro & concepts
➔ Configuration templating
➔ Homework, next steps
Tutorial repository
https://git.io/vZKZH
Required knowledge
1. basic familiarity with the command line
2. use of a command line text editor (e.g. vim or nano)
http://git.io/vZKZH
Required
➔ Linux, MacOS, or Win10
➔ Python 2.7
➔ Ansible 2.2
Technical requirements
Recommendations
➔ Ubuntu 16.04
➔ VM (VirtualBox, Vagrant)
http://git.io/vZKZH
Introductions
whois Bronwyn Lewis
● Technical advisor at SFMIX
● Networking, systems, and automation
@ SFMIX and PCH for 3+ years
● Background in operations, project
management, & international affairs
whois Matt Peterson
● Principal at Two P (network / systems)
● President at SFMIX (San Francisco IXP)
● Previously: Cumulus Networks, Tumblr,
Square, Burning Man
Got {Net}DevOps?
DevOps
● Unite people and {organization appropriate} methods
○ Typically Developers & Operations staff
○ Shared service(s) availability responsibility
● Not a specific software program, license, certification
{Net}DevOps
Leverage common DevOps tenants within Networking
● Configuration management (today’s focus)
● Infrastructure as code
● Reactive to infrastructure as a whole
● Consistency (sometimes viewed as transparency)
This is not a DevOps talk
● DevOps Kung Fu
https://github.com/chef/devops-kungfu
● Phoenix Project / IT Revolution
http://itrevolution.com/
● DevOps Cafe podcast
http://devopscafe.org/
Automation Tools
while true ; do cat ~/.history ; done
Automation tools aren’t new
● Expect (1990)
● CFEngine (1993)
● Puppet (2005)
● NETCONF (2006)
● OpenConfig (2014)
● Lots of homegrown tools
And much, much more...
Today’s frameworks
What’s great about frameworks?
Technical Benefits
- procedural
- repeatable
- idempotent
Other Benefits
- open source (majority)
- enterprise support
- community
Why Ansible?
1. agent’less
2. low risk (run it locally)
3. small investment
4. easy to learn (abstraction!)
Abstraction
instructions:
what: update pkgs
where: myServer1, myServer5
when: 23.00UTC
reference:
pkgs: openssh, apache
How Ansible works
localhost
*default assumption, unless module
exists for target host OS
*
remote host(s)
→
SSH
←
(But we’re running it locally.)
localhost
Terminology
WARNING!
Visually boring, but
important information
packed slides ahead.
(Sorry.)
JSON
● Data exchange format
● More powerful than CSV
○ Data can imply it’s a list,
integer, string, etc.
{
"roles": {
"noc": {
"name": "Alice"
},
"dev": {
"name": "Ian"
}
}
}
YAML
● Human readable data
format, subset of JSON
● Always starts with ---
● Filename extension .yml
or .yaml
# EXAMPLE DATA FILE 1
---
roles:
- { who: dev, name: Ian }
- { who: noc, name: Alice }
# EXAMPLE DATA FILE 2
---
roles:
noc:
name: Alice
dev:
name: Ian
Jinja2
● Python template engine
● Enumerates files using
variable data
● Supports conditionals:
○ If statements
○ Loops
○ Piping
● Ansible standard file
extension .j2
# EXAMPLE TEMPLATE
Employees:
{% for k,v in roles %}
Role: {% k %}
Name: {% v %}
{% endfor %}
Hosts
● Group host addresses,
assign names, specify
variables, etc.
● Default is /etc/ansible/hosts
○ can override this easily
# EXAMPLE HOSTS LIST
[dev]
test-switch1 mgmt_ip=10.1.10.1
100.0.0.42
dev-router4
[prod]
mywebsite.com
172.16.0.56 name=dev42.prod
172.16.0.17
Playbooks
● Specifies execution
● Single or multiple OK
● You can write all tasks and
vars in a playbook...
○ … but not recommended
---
- name: Generate configs
hosts: localhost
gather_facts: no
roles:
- router
- switch
Facts
● Gathers information on the
remote host(s)
○ Hardware, OS, uptime,
MAC address & more
● You can use this info like a
regular variable data point
# EXAMPLE SYSTEM FACTS
"ansible_architecture":
"x86_64",
"ansible_bios_date":
"09/20/2012",
"ansible_bios_version":
"6.00",
Inventory
● Allows you to pass in
specific data with
different playbooks
● Can specify hosts,
group vars, and
host-specific vars
● Can be accessed
across multiple roles
[EXAMPLE STRUCTURE]
myplaybook.yml
roles
inventory
hosts
group_vars
sites.yml
Roles
● A built-in structure for
compartmentalizing
● Roles make it easy /
clean to manage
execution
● Makes scaling and
collaboration easier!
[EXAMPLE STRUCTURE]
ansible
myplaybook.yml
roles
router
tasks
templates
switch
tasks
Hands-on
General outline
● Inventory + Roles
● Variables
● Templates
○ IP Address Filter
● Tasks
● Hosts
● Playbook
Hello world
Hello world
(before)
Hello world
(after)
Structure
├── myplaybook.yml
├── inventory
│ ├── group_vars
│ │ └── sites.yml
│ └── hosts
└── roles
├── router
│ ├── tasks
│ │ └── main.yml
│ ├── templates
│ │ └── template1.j2
│ └── vars
│ └── main.yml
└── switch
● Lots of ways to structure
○ Use roles?
○ Use an inventory?
○ Global, group, host variables?
● Depends on your situation
● No “right” way
Reference files
Copy these from workspace/reference/
config1: we’ll use this as our 1st template
config2: we’ll use this as our 2nd template
config1-dhcp: advanced example template
config2-dhcp: advanced example template
ipaddress: RFC 5737 IP addresses (for demo/docs)
variables: we’ll use these as our demo vars
Inventory + roles
● Inventory is an easy way to share variables
across roles, as well as managing hosts &
host-specific variables
● Roles make managing multiple templates and
sets of tasks easier by compartmentalizing them
Variables
● Variables can be formatted individually, as a flat
list, as a dictionary, or as an array
● Specific formatting can vary
⚠ Formatting impacts how you pass variables into
templates and tasks — be careful here! ⚠
Templates
● You can template anything!
● Lots of neat advanced features, including:
○ If, when, and for statements/loops
○ Variable manipulation via filters
Tasks
● Procedural list of actions to execute, which
combines templates and vars
● Conditions can be included, and are based on
vars (i.e., only do X when Y is present)
IP address filter
● The ipaddr() filter is included in Ansible 1.9<
● Provides an interface to the netaddr Python
package; does a lot of neat things including:
○ subnet manipulation
○ address validation
○ address conversion
○ MAC address formatting
Hosts
● What host we should be running the tasks on -
normally this would be a remote host, but for us:
localhost
Playbook
● Brings it together:
○ Hosts
○ Roles
■ Tasks
■ Templates
○ Variables
● And executes!
---
- name: Create files
hosts: localhost
connection: local
gather_facts: no
roles:
- router
Running a play
ansible-playbook -i inventory myplaybook.yml
[command] [flag] [dir] [playbook]
You’ve got configs!
And if it didn’t work...
Common issues:
● Missing packages?
● Missing variables?
● Formatting weirdness?
● Typos?
Ansible can provide clues.
Ansible Debugging 101
Common Ansible debugging issues include:
One or more undefined variables: 'dict object'
has no attribute 'hostname'
One or more undefined variables: 'hostname' is
undefined
ERROR: Syntax Error while loading YAML script
So… what’s next?
● Think how you can apply this to your work
● Start small; doesn’t need to be overly complex
● Check out more resources...
Some resources
● http://jedelman.com/
● https://blog.tylerc.me/
● https://pynet.twb-tech.com/
● http://packetpushers.net/
● http://keepingitclassless.net/
● http://ansible-tips-and-tricks.rtfd.org/
books blogs/sites
… and more!
Join us for 102 after the break...
● Advanced templating techniques
● Inventory + advanced variable & hosts management
● Dynamic inventory
● And more!
Thanks!
1. Questions? Comments?
2. Come talk to us!
3. Email or tweet us
me@bronwynlewis.com @bronwyn
matt@peterson.org @dorkmatt

Weitere ähnliche Inhalte

Was ist angesagt?

Best practices for ansible
Best practices for ansibleBest practices for ansible
Best practices for ansibleGeorge Shuklin
 
Ansible presentation
Ansible presentationAnsible presentation
Ansible presentationJohn Lynch
 
Rust: Systems Programming for Everyone
Rust: Systems Programming for EveryoneRust: Systems Programming for Everyone
Rust: Systems Programming for EveryoneC4Media
 
Ansible presentation
Ansible presentationAnsible presentation
Ansible presentationSuresh Kumar
 
DevOps with Ansible
DevOps with AnsibleDevOps with Ansible
DevOps with AnsibleSwapnil Jain
 
An Introduction To Jenkins
An Introduction To JenkinsAn Introduction To Jenkins
An Introduction To JenkinsKnoldus Inc.
 
Docker and the Linux Kernel
Docker and the Linux KernelDocker and the Linux Kernel
Docker and the Linux KernelDocker, Inc.
 
Introduction to Ansible
Introduction to AnsibleIntroduction to Ansible
Introduction to AnsibleKnoldus Inc.
 
Automation with ansible
Automation with ansibleAutomation with ansible
Automation with ansibleKhizer Naeem
 
Podman, Buildah, and Quarkus - The Latest in Linux Containers Technologies
Podman, Buildah, and Quarkus - The Latest in Linux Containers Technologies Podman, Buildah, and Quarkus - The Latest in Linux Containers Technologies
Podman, Buildah, and Quarkus - The Latest in Linux Containers Technologies Daniel Oh
 
An introduction to Rust: the modern programming language to develop safe and ...
An introduction to Rust: the modern programming language to develop safe and ...An introduction to Rust: the modern programming language to develop safe and ...
An introduction to Rust: the modern programming language to develop safe and ...Claudio Capobianco
 
Intro to containerization
Intro to containerizationIntro to containerization
Intro to containerizationBalint Pato
 
IT Automation with Ansible
IT Automation with AnsibleIT Automation with Ansible
IT Automation with AnsibleRayed Alrashed
 
Introduction à l’intégration continue avec Jenkins
Introduction à l’intégration continue avec JenkinsIntroduction à l’intégration continue avec Jenkins
Introduction à l’intégration continue avec JenkinsEric Hogue
 

Was ist angesagt? (20)

Best practices for ansible
Best practices for ansibleBest practices for ansible
Best practices for ansible
 
Ansible presentation
Ansible presentationAnsible presentation
Ansible presentation
 
Ansible
AnsibleAnsible
Ansible
 
Rust: Systems Programming for Everyone
Rust: Systems Programming for EveryoneRust: Systems Programming for Everyone
Rust: Systems Programming for Everyone
 
Configuration Management in Ansible
Configuration Management in Ansible Configuration Management in Ansible
Configuration Management in Ansible
 
Ansible presentation
Ansible presentationAnsible presentation
Ansible presentation
 
DevOps with Ansible
DevOps with AnsibleDevOps with Ansible
DevOps with Ansible
 
An Introduction To Jenkins
An Introduction To JenkinsAn Introduction To Jenkins
An Introduction To Jenkins
 
Docker and the Linux Kernel
Docker and the Linux KernelDocker and the Linux Kernel
Docker and the Linux Kernel
 
Introduction to Ansible
Introduction to AnsibleIntroduction to Ansible
Introduction to Ansible
 
Ansible
AnsibleAnsible
Ansible
 
Automation with ansible
Automation with ansibleAutomation with ansible
Automation with ansible
 
Automating with Ansible
Automating with AnsibleAutomating with Ansible
Automating with Ansible
 
Jenkins
JenkinsJenkins
Jenkins
 
Podman, Buildah, and Quarkus - The Latest in Linux Containers Technologies
Podman, Buildah, and Quarkus - The Latest in Linux Containers Technologies Podman, Buildah, and Quarkus - The Latest in Linux Containers Technologies
Podman, Buildah, and Quarkus - The Latest in Linux Containers Technologies
 
An introduction to Rust: the modern programming language to develop safe and ...
An introduction to Rust: the modern programming language to develop safe and ...An introduction to Rust: the modern programming language to develop safe and ...
An introduction to Rust: the modern programming language to develop safe and ...
 
Intro to containerization
Intro to containerizationIntro to containerization
Intro to containerization
 
Helm intro
Helm introHelm intro
Helm intro
 
IT Automation with Ansible
IT Automation with AnsibleIT Automation with Ansible
IT Automation with Ansible
 
Introduction à l’intégration continue avec Jenkins
Introduction à l’intégration continue avec JenkinsIntroduction à l’intégration continue avec Jenkins
Introduction à l’intégration continue avec Jenkins
 

Andere mochten auch

Ansible Automation to Rule Them All
Ansible Automation to Rule Them AllAnsible Automation to Rule Them All
Ansible Automation to Rule Them AllTim Fairweather
 
The Death of Transit and Beyond
The Death of Transit and BeyondThe Death of Transit and Beyond
The Death of Transit and BeyondAPNIC
 
Technical and Business Considerations for DNSSEC Deployment
Technical and Business Considerations for DNSSEC DeploymentTechnical and Business Considerations for DNSSEC Deployment
Technical and Business Considerations for DNSSEC DeploymentAPNIC
 
Ansible loves Python, Python Philadelphia meetup
Ansible loves Python, Python Philadelphia meetupAnsible loves Python, Python Philadelphia meetup
Ansible loves Python, Python Philadelphia meetupGreg DeKoenigsberg
 
Evolving the network for 5G
Evolving the network for 5GEvolving the network for 5G
Evolving the network for 5GAPNIC
 
MPLS-based Metro Ethernet Networks
MPLS-based Metro Ethernet NetworksMPLS-based Metro Ethernet Networks
MPLS-based Metro Ethernet NetworksAPNIC
 
Build cloud like Rackspace with OpenStack Ansible
Build cloud like Rackspace with OpenStack AnsibleBuild cloud like Rackspace with OpenStack Ansible
Build cloud like Rackspace with OpenStack AnsibleJirayut Nimsaeng
 
OpenStack Ansible for private cloud at Kaidee
OpenStack Ansible for private cloud at KaideeOpenStack Ansible for private cloud at Kaidee
OpenStack Ansible for private cloud at KaideeJirayut Nimsaeng
 
CFEngine, Puppet, Chef, SAltStack and Ansible Failover'14
CFEngine, Puppet, Chef, SAltStack and Ansible Failover'14CFEngine, Puppet, Chef, SAltStack and Ansible Failover'14
CFEngine, Puppet, Chef, SAltStack and Ansible Failover'14Serguei Gitinsky
 
New Relic Plugin for Cassandra | Blue Medora
New Relic Plugin for Cassandra | Blue MedoraNew Relic Plugin for Cassandra | Blue Medora
New Relic Plugin for Cassandra | Blue MedoraBlue Medora
 
VMware vROps Management Pack for Amazon DynamoDB
VMware vROps Management Pack for Amazon DynamoDBVMware vROps Management Pack for Amazon DynamoDB
VMware vROps Management Pack for Amazon DynamoDBBlue Medora
 
Ironic 140622212631-phpapp02
Ironic 140622212631-phpapp02Ironic 140622212631-phpapp02
Ironic 140622212631-phpapp02Narender Kumar
 
VMware vROps Management Pack for Hadoop
VMware vROps Management Pack for HadoopVMware vROps Management Pack for Hadoop
VMware vROps Management Pack for HadoopBlue Medora
 
Flexible, simple deployments with OpenStack-Ansible
Flexible, simple deployments with OpenStack-AnsibleFlexible, simple deployments with OpenStack-Ansible
Flexible, simple deployments with OpenStack-AnsibleMajor Hayden
 
Managing sensitive data with Ansible vault
Managing sensitive data with Ansible vaultManaging sensitive data with Ansible vault
Managing sensitive data with Ansible vaultPascal Stauffer
 
Analyzing SAP Performance with VMware vRealize Operations (vROps)
Analyzing SAP Performance with VMware vRealize Operations (vROps)Analyzing SAP Performance with VMware vRealize Operations (vROps)
Analyzing SAP Performance with VMware vRealize Operations (vROps)Blue Medora
 
Business Automation and Service Delivery Platform for Openstack based cloud p...
Business Automation and Service Delivery Platform for Openstack based cloud p...Business Automation and Service Delivery Platform for Openstack based cloud p...
Business Automation and Service Delivery Platform for Openstack based cloud p...RackNap
 
VMware vROps Management Pack for Amazon RDS
VMware vROps Management Pack for Amazon RDSVMware vROps Management Pack for Amazon RDS
VMware vROps Management Pack for Amazon RDSBlue Medora
 

Andere mochten auch (20)

Ansible Automation to Rule Them All
Ansible Automation to Rule Them AllAnsible Automation to Rule Them All
Ansible Automation to Rule Them All
 
The Death of Transit and Beyond
The Death of Transit and BeyondThe Death of Transit and Beyond
The Death of Transit and Beyond
 
Technical and Business Considerations for DNSSEC Deployment
Technical and Business Considerations for DNSSEC DeploymentTechnical and Business Considerations for DNSSEC Deployment
Technical and Business Considerations for DNSSEC Deployment
 
Ansible loves Python, Python Philadelphia meetup
Ansible loves Python, Python Philadelphia meetupAnsible loves Python, Python Philadelphia meetup
Ansible loves Python, Python Philadelphia meetup
 
Evolving the network for 5G
Evolving the network for 5GEvolving the network for 5G
Evolving the network for 5G
 
MPLS-based Metro Ethernet Networks
MPLS-based Metro Ethernet NetworksMPLS-based Metro Ethernet Networks
MPLS-based Metro Ethernet Networks
 
Build cloud like Rackspace with OpenStack Ansible
Build cloud like Rackspace with OpenStack AnsibleBuild cloud like Rackspace with OpenStack Ansible
Build cloud like Rackspace with OpenStack Ansible
 
OpenStack Ansible for private cloud at Kaidee
OpenStack Ansible for private cloud at KaideeOpenStack Ansible for private cloud at Kaidee
OpenStack Ansible for private cloud at Kaidee
 
CFEngine, Puppet, Chef, SAltStack and Ansible Failover'14
CFEngine, Puppet, Chef, SAltStack and Ansible Failover'14CFEngine, Puppet, Chef, SAltStack and Ansible Failover'14
CFEngine, Puppet, Chef, SAltStack and Ansible Failover'14
 
Ansible & Vagrant
Ansible & VagrantAnsible & Vagrant
Ansible & Vagrant
 
Openstack ansible
Openstack ansibleOpenstack ansible
Openstack ansible
 
New Relic Plugin for Cassandra | Blue Medora
New Relic Plugin for Cassandra | Blue MedoraNew Relic Plugin for Cassandra | Blue Medora
New Relic Plugin for Cassandra | Blue Medora
 
VMware vROps Management Pack for Amazon DynamoDB
VMware vROps Management Pack for Amazon DynamoDBVMware vROps Management Pack for Amazon DynamoDB
VMware vROps Management Pack for Amazon DynamoDB
 
Ironic 140622212631-phpapp02
Ironic 140622212631-phpapp02Ironic 140622212631-phpapp02
Ironic 140622212631-phpapp02
 
VMware vROps Management Pack for Hadoop
VMware vROps Management Pack for HadoopVMware vROps Management Pack for Hadoop
VMware vROps Management Pack for Hadoop
 
Flexible, simple deployments with OpenStack-Ansible
Flexible, simple deployments with OpenStack-AnsibleFlexible, simple deployments with OpenStack-Ansible
Flexible, simple deployments with OpenStack-Ansible
 
Managing sensitive data with Ansible vault
Managing sensitive data with Ansible vaultManaging sensitive data with Ansible vault
Managing sensitive data with Ansible vault
 
Analyzing SAP Performance with VMware vRealize Operations (vROps)
Analyzing SAP Performance with VMware vRealize Operations (vROps)Analyzing SAP Performance with VMware vRealize Operations (vROps)
Analyzing SAP Performance with VMware vRealize Operations (vROps)
 
Business Automation and Service Delivery Platform for Openstack based cloud p...
Business Automation and Service Delivery Platform for Openstack based cloud p...Business Automation and Service Delivery Platform for Openstack based cloud p...
Business Automation and Service Delivery Platform for Openstack based cloud p...
 
VMware vROps Management Pack for Amazon RDS
VMware vROps Management Pack for Amazon RDSVMware vROps Management Pack for Amazon RDS
VMware vROps Management Pack for Amazon RDS
 

Ähnlich wie Network Automation: Ansible 101

Improving Operations Efficiency with Puppet
Improving Operations Efficiency with PuppetImproving Operations Efficiency with Puppet
Improving Operations Efficiency with PuppetNicolas Brousse
 
Introduction to Docker (and a bit more) at LSPE meetup Sunnyvale
Introduction to Docker (and a bit more) at LSPE meetup SunnyvaleIntroduction to Docker (and a bit more) at LSPE meetup Sunnyvale
Introduction to Docker (and a bit more) at LSPE meetup SunnyvaleJérôme Petazzoni
 
Docker 0.11 at MaxCDN meetup in Los Angeles
Docker 0.11 at MaxCDN meetup in Los AngelesDocker 0.11 at MaxCDN meetup in Los Angeles
Docker 0.11 at MaxCDN meetup in Los AngelesJérôme Petazzoni
 
Puppet Camp Silicon Valley 2015: How TubeMogul reached 10,000 Puppet Deployme...
Puppet Camp Silicon Valley 2015: How TubeMogul reached 10,000 Puppet Deployme...Puppet Camp Silicon Valley 2015: How TubeMogul reached 10,000 Puppet Deployme...
Puppet Camp Silicon Valley 2015: How TubeMogul reached 10,000 Puppet Deployme...Nicolas Brousse
 
Introduction to Docker, December 2014 "Tour de France" Bordeaux Special Edition
Introduction to Docker, December 2014 "Tour de France" Bordeaux Special EditionIntroduction to Docker, December 2014 "Tour de France" Bordeaux Special Edition
Introduction to Docker, December 2014 "Tour de France" Bordeaux Special EditionJérôme Petazzoni
 
Devops with Python by Yaniv Cohen DevopShift
Devops with Python by Yaniv Cohen DevopShiftDevops with Python by Yaniv Cohen DevopShift
Devops with Python by Yaniv Cohen DevopShiftYaniv cohen
 
Docker and-containers-for-development-and-deployment-scale12x
Docker and-containers-for-development-and-deployment-scale12xDocker and-containers-for-development-and-deployment-scale12x
Docker and-containers-for-development-and-deployment-scale12xrkr10
 
Ansible and CloudStack
Ansible and CloudStackAnsible and CloudStack
Ansible and CloudStackShapeBlue
 
Lightweight Virtualization with Linux Containers and Docker | YaC 2013
Lightweight Virtualization with Linux Containers and Docker | YaC 2013Lightweight Virtualization with Linux Containers and Docker | YaC 2013
Lightweight Virtualization with Linux Containers and Docker | YaC 2013dotCloud
 
Lightweight Virtualization with Linux Containers and Docker I YaC 2013
Lightweight Virtualization with Linux Containers and Docker I YaC 2013Lightweight Virtualization with Linux Containers and Docker I YaC 2013
Lightweight Virtualization with Linux Containers and Docker I YaC 2013Docker, Inc.
 
Docker 1 0 1 0 1: a Docker introduction, actualized for the stable release of...
Docker 1 0 1 0 1: a Docker introduction, actualized for the stable release of...Docker 1 0 1 0 1: a Docker introduction, actualized for the stable release of...
Docker 1 0 1 0 1: a Docker introduction, actualized for the stable release of...Jérôme Petazzoni
 
Ansiblefest 2018 Network automation journey at roblox
Ansiblefest 2018 Network automation journey at robloxAnsiblefest 2018 Network automation journey at roblox
Ansiblefest 2018 Network automation journey at robloxDamien Garros
 
High performance json- postgre sql vs. mongodb
High performance json- postgre sql vs. mongodbHigh performance json- postgre sql vs. mongodb
High performance json- postgre sql vs. mongodbWei Shan Ang
 
Docker Intro at the Google Developer Group and Google Cloud Platform Meet Up
Docker Intro at the Google Developer Group and Google Cloud Platform Meet UpDocker Intro at the Google Developer Group and Google Cloud Platform Meet Up
Docker Intro at the Google Developer Group and Google Cloud Platform Meet UpJérôme Petazzoni
 
Why kernelspace sucks?
Why kernelspace sucks?Why kernelspace sucks?
Why kernelspace sucks?OpenFest team
 
Ansible at work
Ansible at workAnsible at work
Ansible at workBas Meijer
 
Workshop : 45 minutes pour comprendre Docker avec Jérôme Petazzoni
Workshop : 45 minutes pour comprendre Docker avec Jérôme PetazzoniWorkshop : 45 minutes pour comprendre Docker avec Jérôme Petazzoni
Workshop : 45 minutes pour comprendre Docker avec Jérôme PetazzoniTheFamily
 
Introduction to Docker, December 2014 "Tour de France" Edition
Introduction to Docker, December 2014 "Tour de France" EditionIntroduction to Docker, December 2014 "Tour de France" Edition
Introduction to Docker, December 2014 "Tour de France" EditionJérôme Petazzoni
 
Automation@Brainly - Polish Linux Autumn 2014
Automation@Brainly - Polish Linux Autumn 2014Automation@Brainly - Polish Linux Autumn 2014
Automation@Brainly - Polish Linux Autumn 2014vespian_256
 

Ähnlich wie Network Automation: Ansible 101 (20)

Improving Operations Efficiency with Puppet
Improving Operations Efficiency with PuppetImproving Operations Efficiency with Puppet
Improving Operations Efficiency with Puppet
 
Introduction to Docker (and a bit more) at LSPE meetup Sunnyvale
Introduction to Docker (and a bit more) at LSPE meetup SunnyvaleIntroduction to Docker (and a bit more) at LSPE meetup Sunnyvale
Introduction to Docker (and a bit more) at LSPE meetup Sunnyvale
 
Docker 0.11 at MaxCDN meetup in Los Angeles
Docker 0.11 at MaxCDN meetup in Los AngelesDocker 0.11 at MaxCDN meetup in Los Angeles
Docker 0.11 at MaxCDN meetup in Los Angeles
 
Puppet Camp Silicon Valley 2015: How TubeMogul reached 10,000 Puppet Deployme...
Puppet Camp Silicon Valley 2015: How TubeMogul reached 10,000 Puppet Deployme...Puppet Camp Silicon Valley 2015: How TubeMogul reached 10,000 Puppet Deployme...
Puppet Camp Silicon Valley 2015: How TubeMogul reached 10,000 Puppet Deployme...
 
Introduction to Docker, December 2014 "Tour de France" Bordeaux Special Edition
Introduction to Docker, December 2014 "Tour de France" Bordeaux Special EditionIntroduction to Docker, December 2014 "Tour de France" Bordeaux Special Edition
Introduction to Docker, December 2014 "Tour de France" Bordeaux Special Edition
 
Devops with Python by Yaniv Cohen DevopShift
Devops with Python by Yaniv Cohen DevopShiftDevops with Python by Yaniv Cohen DevopShift
Devops with Python by Yaniv Cohen DevopShift
 
Docker and-containers-for-development-and-deployment-scale12x
Docker and-containers-for-development-and-deployment-scale12xDocker and-containers-for-development-and-deployment-scale12x
Docker and-containers-for-development-and-deployment-scale12x
 
Ansible and CloudStack
Ansible and CloudStackAnsible and CloudStack
Ansible and CloudStack
 
Kubernetes 101
Kubernetes 101Kubernetes 101
Kubernetes 101
 
Lightweight Virtualization with Linux Containers and Docker | YaC 2013
Lightweight Virtualization with Linux Containers and Docker | YaC 2013Lightweight Virtualization with Linux Containers and Docker | YaC 2013
Lightweight Virtualization with Linux Containers and Docker | YaC 2013
 
Lightweight Virtualization with Linux Containers and Docker I YaC 2013
Lightweight Virtualization with Linux Containers and Docker I YaC 2013Lightweight Virtualization with Linux Containers and Docker I YaC 2013
Lightweight Virtualization with Linux Containers and Docker I YaC 2013
 
Docker 1 0 1 0 1: a Docker introduction, actualized for the stable release of...
Docker 1 0 1 0 1: a Docker introduction, actualized for the stable release of...Docker 1 0 1 0 1: a Docker introduction, actualized for the stable release of...
Docker 1 0 1 0 1: a Docker introduction, actualized for the stable release of...
 
Ansiblefest 2018 Network automation journey at roblox
Ansiblefest 2018 Network automation journey at robloxAnsiblefest 2018 Network automation journey at roblox
Ansiblefest 2018 Network automation journey at roblox
 
High performance json- postgre sql vs. mongodb
High performance json- postgre sql vs. mongodbHigh performance json- postgre sql vs. mongodb
High performance json- postgre sql vs. mongodb
 
Docker Intro at the Google Developer Group and Google Cloud Platform Meet Up
Docker Intro at the Google Developer Group and Google Cloud Platform Meet UpDocker Intro at the Google Developer Group and Google Cloud Platform Meet Up
Docker Intro at the Google Developer Group and Google Cloud Platform Meet Up
 
Why kernelspace sucks?
Why kernelspace sucks?Why kernelspace sucks?
Why kernelspace sucks?
 
Ansible at work
Ansible at workAnsible at work
Ansible at work
 
Workshop : 45 minutes pour comprendre Docker avec Jérôme Petazzoni
Workshop : 45 minutes pour comprendre Docker avec Jérôme PetazzoniWorkshop : 45 minutes pour comprendre Docker avec Jérôme Petazzoni
Workshop : 45 minutes pour comprendre Docker avec Jérôme Petazzoni
 
Introduction to Docker, December 2014 "Tour de France" Edition
Introduction to Docker, December 2014 "Tour de France" EditionIntroduction to Docker, December 2014 "Tour de France" Edition
Introduction to Docker, December 2014 "Tour de France" Edition
 
Automation@Brainly - Polish Linux Autumn 2014
Automation@Brainly - Polish Linux Autumn 2014Automation@Brainly - Polish Linux Autumn 2014
Automation@Brainly - Polish Linux Autumn 2014
 

Mehr von APNIC

IP addressing and IPv6, presented by Paul Wilson at IETF 119
IP addressing and IPv6, presented by Paul Wilson at IETF 119IP addressing and IPv6, presented by Paul Wilson at IETF 119
IP addressing and IPv6, presented by Paul Wilson at IETF 119APNIC
 
draft-harrison-sidrops-manifest-number-01, presented at IETF 119
draft-harrison-sidrops-manifest-number-01, presented at IETF 119draft-harrison-sidrops-manifest-number-01, presented at IETF 119
draft-harrison-sidrops-manifest-number-01, presented at IETF 119APNIC
 
Making an RFC in Today's IETF, presented by Geoff Huston at IETF 119
Making an RFC in Today's IETF, presented by Geoff Huston at IETF 119Making an RFC in Today's IETF, presented by Geoff Huston at IETF 119
Making an RFC in Today's IETF, presented by Geoff Huston at IETF 119APNIC
 
IPv6 Operational Issues (with DNS), presented by Geoff Huston at IETF 119
IPv6 Operational Issues (with DNS), presented by Geoff Huston at IETF 119IPv6 Operational Issues (with DNS), presented by Geoff Huston at IETF 119
IPv6 Operational Issues (with DNS), presented by Geoff Huston at IETF 119APNIC
 
Is DNS ready for IPv6, presented by Geoff Huston at IETF 119
Is DNS ready for IPv6, presented by Geoff Huston at IETF 119Is DNS ready for IPv6, presented by Geoff Huston at IETF 119
Is DNS ready for IPv6, presented by Geoff Huston at IETF 119APNIC
 
Benefits of doing Internet peering and running an Internet Exchange (IX) pres...
Benefits of doing Internet peering and running an Internet Exchange (IX) pres...Benefits of doing Internet peering and running an Internet Exchange (IX) pres...
Benefits of doing Internet peering and running an Internet Exchange (IX) pres...APNIC
 
APNIC Update and RIR Policies for ccTLDs, presented at APTLD 85
APNIC Update and RIR Policies for ccTLDs, presented at APTLD 85APNIC Update and RIR Policies for ccTLDs, presented at APTLD 85
APNIC Update and RIR Policies for ccTLDs, presented at APTLD 85APNIC
 
NANOG 90: 'BGP in 2023' presented by Geoff Huston
NANOG 90: 'BGP in 2023' presented by Geoff HustonNANOG 90: 'BGP in 2023' presented by Geoff Huston
NANOG 90: 'BGP in 2023' presented by Geoff HustonAPNIC
 
DNS-OARC 42: Is the DNS ready for IPv6? presentation by Geoff Huston
DNS-OARC 42: Is the DNS ready for IPv6? presentation by Geoff HustonDNS-OARC 42: Is the DNS ready for IPv6? presentation by Geoff Huston
DNS-OARC 42: Is the DNS ready for IPv6? presentation by Geoff HustonAPNIC
 
APAN 57: APNIC Report at APAN 57, Bangkok, Thailand
APAN 57: APNIC Report at APAN 57, Bangkok, ThailandAPAN 57: APNIC Report at APAN 57, Bangkok, Thailand
APAN 57: APNIC Report at APAN 57, Bangkok, ThailandAPNIC
 
Lao Digital Week 2024: It's time to deploy IPv6
Lao Digital Week 2024: It's time to deploy IPv6Lao Digital Week 2024: It's time to deploy IPv6
Lao Digital Week 2024: It's time to deploy IPv6APNIC
 
AINTEC 2023: Networking in the Penumbra!
AINTEC 2023: Networking in the Penumbra!AINTEC 2023: Networking in the Penumbra!
AINTEC 2023: Networking in the Penumbra!APNIC
 
CNIRC 2023: Global and Regional IPv6 Deployment 2023
CNIRC 2023: Global and Regional IPv6 Deployment 2023CNIRC 2023: Global and Regional IPv6 Deployment 2023
CNIRC 2023: Global and Regional IPv6 Deployment 2023APNIC
 
AFSIG 2023: APNIC Foundation and support for Internet development
AFSIG 2023: APNIC Foundation and support for Internet developmentAFSIG 2023: APNIC Foundation and support for Internet development
AFSIG 2023: APNIC Foundation and support for Internet developmentAPNIC
 
AFNOG 1: Afghanistan IP Deployment Status
AFNOG 1: Afghanistan IP Deployment StatusAFNOG 1: Afghanistan IP Deployment Status
AFNOG 1: Afghanistan IP Deployment StatusAPNIC
 
AFSIG 2023: Internet routing and addressing
AFSIG 2023: Internet routing and addressingAFSIG 2023: Internet routing and addressing
AFSIG 2023: Internet routing and addressingAPNIC
 
AFSIG 2023: APNIC - Registry & Development
AFSIG 2023: APNIC - Registry & DevelopmentAFSIG 2023: APNIC - Registry & Development
AFSIG 2023: APNIC - Registry & DevelopmentAPNIC
 
Afghanistan IGF 2023: The ABCs and importance of cybersecurity
Afghanistan IGF 2023: The ABCs and importance of cybersecurityAfghanistan IGF 2023: The ABCs and importance of cybersecurity
Afghanistan IGF 2023: The ABCs and importance of cybersecurityAPNIC
 
IDNIC OPM 2023: IPv6 deployment planning and security considerations
IDNIC OPM 2023: IPv6 deployment planning and security considerationsIDNIC OPM 2023: IPv6 deployment planning and security considerations
IDNIC OPM 2023: IPv6 deployment planning and security considerationsAPNIC
 
IDNIC OPM 2023 - Internet Number Registry System
IDNIC OPM 2023 - Internet Number Registry SystemIDNIC OPM 2023 - Internet Number Registry System
IDNIC OPM 2023 - Internet Number Registry SystemAPNIC
 

Mehr von APNIC (20)

IP addressing and IPv6, presented by Paul Wilson at IETF 119
IP addressing and IPv6, presented by Paul Wilson at IETF 119IP addressing and IPv6, presented by Paul Wilson at IETF 119
IP addressing and IPv6, presented by Paul Wilson at IETF 119
 
draft-harrison-sidrops-manifest-number-01, presented at IETF 119
draft-harrison-sidrops-manifest-number-01, presented at IETF 119draft-harrison-sidrops-manifest-number-01, presented at IETF 119
draft-harrison-sidrops-manifest-number-01, presented at IETF 119
 
Making an RFC in Today's IETF, presented by Geoff Huston at IETF 119
Making an RFC in Today's IETF, presented by Geoff Huston at IETF 119Making an RFC in Today's IETF, presented by Geoff Huston at IETF 119
Making an RFC in Today's IETF, presented by Geoff Huston at IETF 119
 
IPv6 Operational Issues (with DNS), presented by Geoff Huston at IETF 119
IPv6 Operational Issues (with DNS), presented by Geoff Huston at IETF 119IPv6 Operational Issues (with DNS), presented by Geoff Huston at IETF 119
IPv6 Operational Issues (with DNS), presented by Geoff Huston at IETF 119
 
Is DNS ready for IPv6, presented by Geoff Huston at IETF 119
Is DNS ready for IPv6, presented by Geoff Huston at IETF 119Is DNS ready for IPv6, presented by Geoff Huston at IETF 119
Is DNS ready for IPv6, presented by Geoff Huston at IETF 119
 
Benefits of doing Internet peering and running an Internet Exchange (IX) pres...
Benefits of doing Internet peering and running an Internet Exchange (IX) pres...Benefits of doing Internet peering and running an Internet Exchange (IX) pres...
Benefits of doing Internet peering and running an Internet Exchange (IX) pres...
 
APNIC Update and RIR Policies for ccTLDs, presented at APTLD 85
APNIC Update and RIR Policies for ccTLDs, presented at APTLD 85APNIC Update and RIR Policies for ccTLDs, presented at APTLD 85
APNIC Update and RIR Policies for ccTLDs, presented at APTLD 85
 
NANOG 90: 'BGP in 2023' presented by Geoff Huston
NANOG 90: 'BGP in 2023' presented by Geoff HustonNANOG 90: 'BGP in 2023' presented by Geoff Huston
NANOG 90: 'BGP in 2023' presented by Geoff Huston
 
DNS-OARC 42: Is the DNS ready for IPv6? presentation by Geoff Huston
DNS-OARC 42: Is the DNS ready for IPv6? presentation by Geoff HustonDNS-OARC 42: Is the DNS ready for IPv6? presentation by Geoff Huston
DNS-OARC 42: Is the DNS ready for IPv6? presentation by Geoff Huston
 
APAN 57: APNIC Report at APAN 57, Bangkok, Thailand
APAN 57: APNIC Report at APAN 57, Bangkok, ThailandAPAN 57: APNIC Report at APAN 57, Bangkok, Thailand
APAN 57: APNIC Report at APAN 57, Bangkok, Thailand
 
Lao Digital Week 2024: It's time to deploy IPv6
Lao Digital Week 2024: It's time to deploy IPv6Lao Digital Week 2024: It's time to deploy IPv6
Lao Digital Week 2024: It's time to deploy IPv6
 
AINTEC 2023: Networking in the Penumbra!
AINTEC 2023: Networking in the Penumbra!AINTEC 2023: Networking in the Penumbra!
AINTEC 2023: Networking in the Penumbra!
 
CNIRC 2023: Global and Regional IPv6 Deployment 2023
CNIRC 2023: Global and Regional IPv6 Deployment 2023CNIRC 2023: Global and Regional IPv6 Deployment 2023
CNIRC 2023: Global and Regional IPv6 Deployment 2023
 
AFSIG 2023: APNIC Foundation and support for Internet development
AFSIG 2023: APNIC Foundation and support for Internet developmentAFSIG 2023: APNIC Foundation and support for Internet development
AFSIG 2023: APNIC Foundation and support for Internet development
 
AFNOG 1: Afghanistan IP Deployment Status
AFNOG 1: Afghanistan IP Deployment StatusAFNOG 1: Afghanistan IP Deployment Status
AFNOG 1: Afghanistan IP Deployment Status
 
AFSIG 2023: Internet routing and addressing
AFSIG 2023: Internet routing and addressingAFSIG 2023: Internet routing and addressing
AFSIG 2023: Internet routing and addressing
 
AFSIG 2023: APNIC - Registry & Development
AFSIG 2023: APNIC - Registry & DevelopmentAFSIG 2023: APNIC - Registry & Development
AFSIG 2023: APNIC - Registry & Development
 
Afghanistan IGF 2023: The ABCs and importance of cybersecurity
Afghanistan IGF 2023: The ABCs and importance of cybersecurityAfghanistan IGF 2023: The ABCs and importance of cybersecurity
Afghanistan IGF 2023: The ABCs and importance of cybersecurity
 
IDNIC OPM 2023: IPv6 deployment planning and security considerations
IDNIC OPM 2023: IPv6 deployment planning and security considerationsIDNIC OPM 2023: IPv6 deployment planning and security considerations
IDNIC OPM 2023: IPv6 deployment planning and security considerations
 
IDNIC OPM 2023 - Internet Number Registry System
IDNIC OPM 2023 - Internet Number Registry SystemIDNIC OPM 2023 - Internet Number Registry System
IDNIC OPM 2023 - Internet Number Registry System
 

Network Automation: Ansible 101

  • 1. Network Automation: Ansible 101 APRICOT - Feb 28th, 2017 Bronwyn Lewis and Matt Peterson
  • 2. Our assumptions ➔ New to the world of “DevOps” ➔ No prior Ansible knowledge ➔ Want to stop hand-crafting your network configs
  • 3. Introduction ➔ Tutorial dependencies ➔ Introductions ➔ DevOps intro Agenda Tutorial ➔ Ansible intro & concepts ➔ Configuration templating ➔ Homework, next steps
  • 5. Required knowledge 1. basic familiarity with the command line 2. use of a command line text editor (e.g. vim or nano) http://git.io/vZKZH
  • 6. Required ➔ Linux, MacOS, or Win10 ➔ Python 2.7 ➔ Ansible 2.2 Technical requirements Recommendations ➔ Ubuntu 16.04 ➔ VM (VirtualBox, Vagrant) http://git.io/vZKZH
  • 8. whois Bronwyn Lewis ● Technical advisor at SFMIX ● Networking, systems, and automation @ SFMIX and PCH for 3+ years ● Background in operations, project management, & international affairs
  • 9. whois Matt Peterson ● Principal at Two P (network / systems) ● President at SFMIX (San Francisco IXP) ● Previously: Cumulus Networks, Tumblr, Square, Burning Man
  • 11. DevOps ● Unite people and {organization appropriate} methods ○ Typically Developers & Operations staff ○ Shared service(s) availability responsibility ● Not a specific software program, license, certification
  • 12. {Net}DevOps Leverage common DevOps tenants within Networking ● Configuration management (today’s focus) ● Infrastructure as code ● Reactive to infrastructure as a whole ● Consistency (sometimes viewed as transparency)
  • 13. This is not a DevOps talk ● DevOps Kung Fu https://github.com/chef/devops-kungfu ● Phoenix Project / IT Revolution http://itrevolution.com/ ● DevOps Cafe podcast http://devopscafe.org/
  • 14. Automation Tools while true ; do cat ~/.history ; done
  • 15. Automation tools aren’t new ● Expect (1990) ● CFEngine (1993) ● Puppet (2005) ● NETCONF (2006) ● OpenConfig (2014) ● Lots of homegrown tools And much, much more...
  • 17. What’s great about frameworks? Technical Benefits - procedural - repeatable - idempotent Other Benefits - open source (majority) - enterprise support - community
  • 18. Why Ansible? 1. agent’less 2. low risk (run it locally) 3. small investment 4. easy to learn (abstraction!)
  • 19. Abstraction instructions: what: update pkgs where: myServer1, myServer5 when: 23.00UTC reference: pkgs: openssh, apache
  • 20. How Ansible works localhost *default assumption, unless module exists for target host OS * remote host(s) → SSH ←
  • 21. (But we’re running it locally.) localhost
  • 23. WARNING! Visually boring, but important information packed slides ahead. (Sorry.)
  • 24. JSON ● Data exchange format ● More powerful than CSV ○ Data can imply it’s a list, integer, string, etc. { "roles": { "noc": { "name": "Alice" }, "dev": { "name": "Ian" } } }
  • 25. YAML ● Human readable data format, subset of JSON ● Always starts with --- ● Filename extension .yml or .yaml # EXAMPLE DATA FILE 1 --- roles: - { who: dev, name: Ian } - { who: noc, name: Alice } # EXAMPLE DATA FILE 2 --- roles: noc: name: Alice dev: name: Ian
  • 26. Jinja2 ● Python template engine ● Enumerates files using variable data ● Supports conditionals: ○ If statements ○ Loops ○ Piping ● Ansible standard file extension .j2 # EXAMPLE TEMPLATE Employees: {% for k,v in roles %} Role: {% k %} Name: {% v %} {% endfor %}
  • 27. Hosts ● Group host addresses, assign names, specify variables, etc. ● Default is /etc/ansible/hosts ○ can override this easily # EXAMPLE HOSTS LIST [dev] test-switch1 mgmt_ip=10.1.10.1 100.0.0.42 dev-router4 [prod] mywebsite.com 172.16.0.56 name=dev42.prod 172.16.0.17
  • 28. Playbooks ● Specifies execution ● Single or multiple OK ● You can write all tasks and vars in a playbook... ○ … but not recommended --- - name: Generate configs hosts: localhost gather_facts: no roles: - router - switch
  • 29. Facts ● Gathers information on the remote host(s) ○ Hardware, OS, uptime, MAC address & more ● You can use this info like a regular variable data point # EXAMPLE SYSTEM FACTS "ansible_architecture": "x86_64", "ansible_bios_date": "09/20/2012", "ansible_bios_version": "6.00",
  • 30. Inventory ● Allows you to pass in specific data with different playbooks ● Can specify hosts, group vars, and host-specific vars ● Can be accessed across multiple roles [EXAMPLE STRUCTURE] myplaybook.yml roles inventory hosts group_vars sites.yml
  • 31. Roles ● A built-in structure for compartmentalizing ● Roles make it easy / clean to manage execution ● Makes scaling and collaboration easier! [EXAMPLE STRUCTURE] ansible myplaybook.yml roles router tasks templates switch tasks
  • 33. General outline ● Inventory + Roles ● Variables ● Templates ○ IP Address Filter ● Tasks ● Hosts ● Playbook
  • 36.
  • 38. Structure ├── myplaybook.yml ├── inventory │ ├── group_vars │ │ └── sites.yml │ └── hosts └── roles ├── router │ ├── tasks │ │ └── main.yml │ ├── templates │ │ └── template1.j2 │ └── vars │ └── main.yml └── switch ● Lots of ways to structure ○ Use roles? ○ Use an inventory? ○ Global, group, host variables? ● Depends on your situation ● No “right” way
  • 39. Reference files Copy these from workspace/reference/ config1: we’ll use this as our 1st template config2: we’ll use this as our 2nd template config1-dhcp: advanced example template config2-dhcp: advanced example template ipaddress: RFC 5737 IP addresses (for demo/docs) variables: we’ll use these as our demo vars
  • 40. Inventory + roles ● Inventory is an easy way to share variables across roles, as well as managing hosts & host-specific variables ● Roles make managing multiple templates and sets of tasks easier by compartmentalizing them
  • 41. Variables ● Variables can be formatted individually, as a flat list, as a dictionary, or as an array ● Specific formatting can vary ⚠ Formatting impacts how you pass variables into templates and tasks — be careful here! ⚠
  • 42. Templates ● You can template anything! ● Lots of neat advanced features, including: ○ If, when, and for statements/loops ○ Variable manipulation via filters
  • 43. Tasks ● Procedural list of actions to execute, which combines templates and vars ● Conditions can be included, and are based on vars (i.e., only do X when Y is present)
  • 44. IP address filter ● The ipaddr() filter is included in Ansible 1.9< ● Provides an interface to the netaddr Python package; does a lot of neat things including: ○ subnet manipulation ○ address validation ○ address conversion ○ MAC address formatting
  • 45. Hosts ● What host we should be running the tasks on - normally this would be a remote host, but for us: localhost
  • 46. Playbook ● Brings it together: ○ Hosts ○ Roles ■ Tasks ■ Templates ○ Variables ● And executes! --- - name: Create files hosts: localhost connection: local gather_facts: no roles: - router
  • 47. Running a play ansible-playbook -i inventory myplaybook.yml [command] [flag] [dir] [playbook]
  • 49. And if it didn’t work... Common issues: ● Missing packages? ● Missing variables? ● Formatting weirdness? ● Typos? Ansible can provide clues.
  • 50. Ansible Debugging 101 Common Ansible debugging issues include: One or more undefined variables: 'dict object' has no attribute 'hostname' One or more undefined variables: 'hostname' is undefined ERROR: Syntax Error while loading YAML script
  • 51. So… what’s next? ● Think how you can apply this to your work ● Start small; doesn’t need to be overly complex ● Check out more resources...
  • 52. Some resources ● http://jedelman.com/ ● https://blog.tylerc.me/ ● https://pynet.twb-tech.com/ ● http://packetpushers.net/ ● http://keepingitclassless.net/ ● http://ansible-tips-and-tricks.rtfd.org/ books blogs/sites … and more!
  • 53. Join us for 102 after the break... ● Advanced templating techniques ● Inventory + advanced variable & hosts management ● Dynamic inventory ● And more!
  • 54. Thanks! 1. Questions? Comments? 2. Come talk to us! 3. Email or tweet us me@bronwynlewis.com @bronwyn matt@peterson.org @dorkmatt