SlideShare a Scribd company logo
Copyright © 2020 HashiCorp
Head in the Clouds: Testing
Infrastructure-as-Code
Config Management Camp 2020
Peter Souter
Sr. Technical Account Manager - HashiCorp
Introductions
Who is this bloke?
Technical Account Manager at HashiCorp
Peter Souter
Based in...
London, UK
This is my 6th CfgMgmentCamp!
Been coming since 2014 (missed 2018 - 👶)
Worn a lot of hats in my time...
Developer, Consultant, Pre-Sales, TAM
Interested in...
Making people’s operational life easier and
more secure
DEVOPS ALL THE THINGS
What are we here to talk about?
Config Management Camp 2020
Infrastructure-as-code
Treating the tooling that manages
your infrastructure with the same
way you would treat any other
code.
1. Easy to regenerate from scratch
2. Code review and collaboration
3. Easier to conceptualise as a code model
4. Auditing and policies
5. Iteratively improve over time
6. Modularise, reuse and hide complexity
7. Testing
Qui bono?
Who benefits?
1. Easy to regenerate from scratch
2. Code review and collaboration
3. Easier to conceptualise as a code model
4. Auditing and policies
5. Iteratively improve over time
6. Modularise, reuse and hide complexity
7. Testing
Qui bono?
Who benefits?
“Why should we test our
infrastructure as code anyways?”
1. Easy to regenerate from scratch
2. Code review and collaboration
3. Easier to conceptualise as a code model
4. Auditing and policies
5. Iteratively improve over time
6. Modularise, reuse and hide complexity
7. Testing
Qui bono?
Who benefits?
1. Easy to regenerate from scratch
2. Code review and collaboration
3. Easier to conceptualise as a code model
4. Auditing and policies
5. Iteratively improve over time
6. Modularise, reuse and hide complexity
7. Testing
Qui bono?
Who benefits?
1. Easy to regenerate from scratch
2. Code review and collaboration
3. Easier to conceptualise as a code model
4. Auditing and policies
5. Iteratively improve over time
6. Modularise, reuse and hide complexity
7. Testing
Qui bono?
Who benefits?
1. Easy to regenerate from scratch
2. Code review and collaboration
3. Easier to conceptualise as a code model
4. Auditing and policies
5. Iteratively improve over time
6. Modularise, reuse and hide complexity
7. Testing
Qui bono?
Who benefits?
1. Easy to regenerate from scratch
2. Code review and collaboration
3. Easier to conceptualise as a code model
4. Auditing and policies
5. Iteratively improve over time
6. Modularise, reuse and hide complexity
7. Testing
Qui bono?
Who benefits?
1. Easy to regenerate from scratch
2. Code review and collaboration
3. Easier to conceptualise as a code model
4. Auditing and policies
5. Iteratively improve over time
6. Modularise, reuse and hide complexity
7. Testing
Qui bono?
Who benefits?
“The concern of velocity loss of added testing is very much
worthwhile in my experience. It’s why we have a known, stable
configuration and deployment codebase and can move on to more
relevant business problems. In their absence, I’ve without
exception had to firefight tooling, silent regressions, and human
error burning out teams and reducing confidence in automation
from across teams. Infrastructure as code without testing to me
is self-sabotage”
- Devon Kim, @djk29a, HashiConf 2019 Slack
Lets have
a brief history
lesson...
And before we start,
let me give my
caveats...
I’m not on the engineering team!
Nothing I say is gospel, nor can I
commit to any future roadmap
Configuration management tools install and
manage software on a machine that already
exists. Terraform is not a configuration
management tool, and it allows existing
tooling to focus on their strengths:
bootstrapping and initializing resources.
- https://www.terraform.io/intro/vs/chef-puppet.html
Config Management Camp 2020?
Infra
Head in the Clouds: Testing Infra as Code - Config Management 2020
Head in the Clouds: Testing Infra as Code - Config Management 2020
“Pre-prod”
VM Lab
Head in the Clouds: Testing Infra as Code - Config Management 2020
DA CLOUD
Head in the Clouds: Testing Infra as Code - Config Management 2020
Head in the Clouds: Testing Infra as Code - Config Management 2020
?
Head in the Clouds: Testing Infra as Code - Config Management 2020
Head in the Clouds: Testing Infra as Code - Config Management 2020
“How do we test the
cloud?”
Two types of people interested in
testing IaC and it’s interactions
with DA CLOUD: Producers and
Consumers
A little background on
testing...
https://martinfowler.com/articles/practical-test-pyramid.html
Unit Testing
Acceptance
Testing
Integration
Testing
Head in the Clouds: Testing Infra as Code - Config Management 2020
The terraform seemed to
generate the environment
correctly last time I tried…
meh, ship it!
Let’s eat the cone from
the bottom...
Head in the Clouds: Testing Infra as Code - Config Management 2020
Let's start with the
most simple “tests”...
Compiling/Type Checking
TERMINAL
Chef: Ruby syntax check
$ ruby -c my_cookbook_file.rb
Syntax OK!
TERMINAL
TERMINAL
Terraform: validate
$ terraform validate
Error: Unsupported block type
on main.tf line 30, in resource "aws_instance" "foobar":
30: tags {
Blocks of type "tags" are not expected here. Did you mean to define argument "tags"?
If so, use the equals sign to assign it a value.
TERMINAL
TERMINAL
Ansible: --check
$ ansible-playbook apache.yml --check
ERROR! Syntax Error while loading YAML.
did not find expected '-' indicator
TERMINAL
TERMINAL
Puppet: parser validate
$ puppet parser validate
Error: Could not parse for environment production:
Syntax error at 'owner' at /tmp/foo.pp:5:5
TERMINAL
Linting
Terraform: tflint
TERMINAL
$ tflint
1 issue(s) found:
Error: instance_type is not a valid value (aws_instance_invalid_type)
on main.tf line 28:
28: instance_type = "t9.micro"
https://github.com/wata727/tflint
Chef: foodcritic
TERMINAL
$ foodcritic -C ./cookbooks/mysql
cookbooks/<cookbook Name>/attributes/server.rb
FC002: Avoid string interpolation where not required
85| default['<Cookbook Name>']['conf_dir'] = "#{mysql['basedir']}"
https://docs.chef.io/foodcritic.html
Puppet: puppet-lint
TERMINAL
$ puppet-lint /etc/puppet/modules
foo/manifests/bar.pp - ERROR: trailing whitespace found on line 1
apache/manifests/server.pp - WARNING: variable not enclosed in {} on line 56
http://puppet-lint.com/
Ansible: ansible-lint
TERMINAL
$ ansible-lint geerlingguy.apache
[ANSIBLE0013] Use shell only when shell functionality is required
/Users/chouseknecht/.ansible/roles/geerlingguy.apache/tasks/main.yml:19
Task/Handler: Get installed version of Apache.
[ANSIBLE0011] All tasks should be named
/Users/chouseknecht/.ansible/roles/geerlingguy.apache/tasks/main.yml:29
Task/Handler: include_vars apache-22.yml
https://docs.ansible.com/ansible-lint/
Ok, so now lets get deeper:
Unit Tests
Acceptance tests make sure that
you're building the right thing
Unit tests make sure that you're
building the thing right
https://stackoverflow.com/questions/4139095/unit-tests-vs-acceptance-tests
Head in the Clouds: Testing Infra as Code - Config Management 2020
Red
Green
Refactor
A unit tests is for the logic you have
written, not to test the language
Don’t just write
tautological unit tests,
test the edge cases
Producers and consumers
have different intents for
unit-tests
Puppet - https://rspec-puppet.com/
TERMINAL
context 'repo enabled' do
context 'on CentOS' do
let(:facts) do
{
:operatingsystem => 'CentOS',
}
end
let(:params) {{ 'manage_repo' => true }}
it { is_expected.to contain_class('fish::Repo::Centos')}
it do
is_expected.to contain_yumrepo('shells_fish_release_2').with(
:descr => 'Fish shell - 2.x release series (CentOS_7)',
:baseurl => 'https://download.opensuse.org/repositories/shells:/fish:/release:/2/CentOS_7/',
:enabled => '1',
:gpgcheck => '1',
:gpgkey => "https://download.opensuse.org/repositories/shells:/fish:/release:/2/CentOS_7/repodata/repomd.xml.key",
)
end
end
Chef - https://docs.chef.io/chefspec.html
TERMINAL
context 'amazonlinux' do
cached(:chef_run) { ChefSpec::SoloRunner.new(platform: 'amazon', version: '2018.03').converge(described_recipe) }
it 'creates yum_repository[amzn-main]' do
expect(chef_run).to create_yum_repository('amzn-main')
end
it 'creates yum_repository[amzn-main-debuginfo]' do
expect(chef_run).to create_yum_repository('amzn-main-debuginfo')
end
it 'creates yum_repository[amzn-nosrc]' do
expect(chef_run).to create_yum_repository('amzn-nosrc')
end
end
Unit testing for Terraform:
Nothing official yet...
The Future…
Core Unit Testing?
https://github.com/hashicorp/terraform/issues/21628
Possibly… but we have a big backlog!
In the meantime, some
possible contenders...
clarity
https://github.com/xchapter7x/clarity/tree
▪ Self-contained binary
▪ Gherkin style features
▪ Behaviour-Driven Development
▪ Parses HCL for running its checks
▪ Provides its own Terraform specific
matchers
clarity example
TERMINAL
$ clarity single_instance.feature
Feature: Single Instance in AWS
Scenario: Creation of a single AWS micro instance # single_instance.feature:3
Given Terraform # terraform.go:76 -> *Match
And a " aws_instance" of type " resource" # terraform.go:242 -> *Match
Then attribute " instance_type" equals "t1.micro" # terraform.go:351 -> *Match
And it occurs exactly 1 times # terraform.go:489 -> *Match
1 scenarios ( 1 passed)
4 steps (4 passed)
1.613589ms
terraform-compliance
https://github.com/eerkunt/terraform-compliance
▪ Python CLI application
▪ Gherkin style features
▪ Behaviour-Driven Development
▪ Parses plan outputs for it’s checks
▪ Provides its own Terraform specific
matchers
terraform-compliance example
TERMINAL
$ terraform-compliance -p plan.out -f terraform_compliance/
terraform-compliance v1.0.51 initiated
Scenario Outline: Ensure that specific tags are defined
Given I have resource that supports tags defined
When it contains tags
Then it must contain <tags>
And its value must match the "<value>" regex
Examples:
| tags | value |
| Name | .+ |
1 features (1 passed)
1 scenarios (1 passed)
4 steps (4 passed)
Run 1570975178 finished within a moment
terraform_validate
https://github.com/elmundio87/terraform_validate
▪ Written as Python
▪ Standard unit testing
▪ Parses HCL for it’s checks
▪ Provides it’s own Terraform
specific matchers
terraform_validate example
TERMINAL
$ python3 test/*.py
+ terraform_validate
======================================================================
FAIL: test_tags (__main__.TestResources)
Checks resources for required tags.
----------------------------------------------------------------------
Traceback (most recent call last):
File "test/terraform_validate_tests.py", line 27, in test_tags
should_have_properties(required_tags)
File
"/usr/local/lib/python3.7/site-packages/terraform_validate/terraform_validate.py",
line 207, in should_have_properties
raise AssertionError("n".join(sorted(errors)))
AssertionError: [ aws_instance.foobar.tags] should have property: 'Date'
----------------------------------------------------------------------
Ran 1 test in 0.031s
FAILED (failures=1)
Pros
Fast to run
Easy to write
No environment or
credentials required
Cons
Doesn’t test actual outcome
IaC Unit
Testing
Ok, now the hard part:
Integration and Acceptance
People use
them interchangeably...
https://stackoverflow.com/questions/4904096/whats-the-difference-between-unit-functional-acceptance-and-integration-test
Acceptance tests are an external client that encompasses
enough information on how to drive the system under test (SUT)
in order to bring it to the point of asserting something.
Integration tests on the other hand, are used for testing the
internals of the system and are geared towards validating
contracts between modules of code.
http://blog.jonasbandi.net/2010/09/acceptance-vs-integration-tests.html
Either way:
How can we test against
“DA CLOUD”, something we don’t
directly control?
Approach 1:
Mock the API’s with fixtures
https://docs.pytest.org/en/latest/fixture.html
The purpose of test fixtures
is to provide a fixed baseline
upon which tests can reliably
and repeatedly execute.
These are often
pretty close to unit tests...
ACME Provider (Lets Encrypt)
https://www.terraform.io/docs/providers/acme/index.html
▪ We don’t want to fire
requests at a real ACME
CA provider
▪ Instead use a fixture
▪ Golang httptest
ACME Provider - Fixture mocking example
ACME Provider - Fixture mocking example
Pros
No dependency on cloud
Quick to run
Cons
Can be a lot of work to
maintain fixtures
Won’t test drift or changes in
actual cloud
Fixture
Mocking
Approach 2:
Simulated Cloud
With the rise of Serverless/Lamba
frameworks, devs needed
something local to test against and
people started making Cloud
Simulators
Azurite
https://docs.microsoft.com/en-us/azure/storage/co
mmon/storage-use-azurite
DynamoDB Local
https://docs.aws.amazon.com/amazondynamodb/l
atest/developerguide/DynamoDBLocal.html
GCP Emulator
https://cloud.google.com/sdk/gcloud/reference/be
ta/emulators/
Localstack
https://localstack.cloud
▪ “Cloud in a box”
▪ Can run in Docker
▪ Provides real working
versions of AWS APIs
🚨
Live
Demo
Warning!
🚨
Head in the Clouds: Testing Infra as Code - Config Management 2020
Head in the Clouds: Testing Infra as Code - Config Management 2020
Head in the Clouds: Testing Infra as Code - Config Management 2020
Head in the Clouds: Testing Infra as Code - Config Management 2020
Head in the Clouds: Testing Infra as Code - Config Management 2020
Head in the Clouds: Testing Infra as Code - Config Management 2020
Head in the Clouds: Testing Infra as Code - Config Management 2020
Pros
No dependency on cloud
More debugging and “real
life” experience than a
mocked service
Cons
Won’t exist for every service
Relies on simulated service
to keep in line with real
cloud
Still not _really_ testing an
actual Cloud service
Fixture
Mocking
Approach 3:
Don’t mock anything, do it for real!
Head in the Clouds: Testing Infra as Code - Config Management 2020
Head in the Clouds: Testing Infra as Code - Config Management 2020
Head in the Clouds: Testing Infra as Code - Config Management 2020
Head in the Clouds: Testing Infra as Code - Config Management 2020
Pull-request acceptance tests for Azure Provider
Full Suite example for Azure Provider:
Full Suite example for Azure Provider:
Head in the Clouds: Testing Infra as Code - Config Management 2020
From a producer point of view,
you’re testing the tool
As a consumer, you probably want
an integration test of your real full
stack of pieces
Ultimately,
you care
about state
terratest
https://github.com/gruntwork-io/terratest
▪ Full acceptance framework for
Terraform
▪ Developed by Gruntworks
▪ Used to test large module
deployments
▪ Written in Golang
▪ Helper methods for validating
state
At Gruntwork we test dozens of modules with terratest. We have
hooks to CircleCI to run tests on each commit. For us, the ROI is
huge - we've caught many regressions & problems thanks to
the tests.
It can definitely result in long test times. In some of our larger
repos, test can take 45-60 minutes. What I normally do is
add/update a test, run just that test locally to make sure it's
working, then let the full suite run in CircleCI.
- Ben Whaley, Gruntworks, HashiConf 2020 Slack
terratest example
TERMINAL
$ go test -v test/terraform_basic_example_test.go
=== RUN TestTerraformAWSInstanceType
=== PAUSE TestTerraformAWSInstanceType
=== CONT TestTerraformAWSInstanceType
TestTerraformAWSInstanceType 2020-10-13T16:09:10+01:00 retry.go:72: terraform [init -upgrade=false]
TestTerraformAWSInstanceType 2020-10-13T16:09:10+01:00 command.go:87: Running command terraform with args
[init -upgrade=false]
TestTerraformAWSInstanceType 2020-10-13T16:09:21+01:00 command.go:158: aws_instance.foobar: Creating...
TestTerraformAWSInstanceType 2020-10-13T16:09:31+01:00 command.go:158: aws_instance.foobar: Still
creating... [10s elapsed]
TestTerraformAWSInstanceType 2020-10-13T16:09:41+01:00 command.go:158: aws_instance.foobar: Still
creating... [20s elapsed]
TestTerraformAWSInstanceType 2020-10-13T16:09:43+01:00 command.go:158: aws_instance.foobar: Creation
complete after 21s [id=i-08d65b4371c14fc4e]
TestTerraformAWSInstanceType 2020-10-13T16:09:43+01:00 command.go:158:
TestTerraformAWSInstanceType 2020-10-13T16:09:43+01:00 command.go:158: Apply complete! Resources: 1
added, 0 changed, 0 destroyed.
TestTerraformAWSInstanceType 2020-10-13T16:09:43+01:00 command.go:158:
TestTerraformAWSInstanceType 2020-10-13T16:09:43+01:00 command.go:158: Outputs:
TestTerraformAWSInstanceType 2020-10-13T16:09:43+01:00 command.go:158:
TestTerraformAWSInstanceType 2020-10-13T16:09:43+01:00 command.go:158: instance_type = t1.micro
ok command-line-arguments 84.607s
Cons
Slower
Can be Costly
Can interfere with real
infrastructure
Pros
End-to-end testing
Interacts with real APIs
Closest to the real thing
Acceptance
and
Integration
Testing
Beyond conventional
testing...
Observability
Not going to go too deeply
into this...
Head in the Clouds: Testing Infra as Code - Config Management 2020
Is it working beyond our
test suite?
https://www.weave.works/blog/gitops-part-3-observability
For more information...
https://www.youtube.com/watch?v=fOdtgHu_KeA&list=PLgeeFA2rwFRMIblCQi_8BkXyZALQSjSSO&index=3&t=0s
From Cfgmgmtcamp 2019
Governance
Every organisation has policies
Naming conventions, tagging, price
guides, cost centres and limits, legal
requirements and regulations etc.
Generally under the umbrella of
Governance
Head in the Clouds: Testing Infra as Code - Config Management 2020
If we can reflect
Policies-as-code
we get the same
benefits we get from
Infrastructure-as-code
HashiCorp Sentinel
https://www.hashicorp.com/sentinel/
“An embeddable policy as code
framework to enable fine-grained,
logic-based policy decisions that can
be extended to source external
information to make decisions.”
TERMINAL
Sentinel example for Terraform
CODE EDITOR
import "tfplan"
main = rule {
all tfplan.resources.aws_security_group as _, instances {
all instances as _, sg {
all sg.applied.egress as egress {
egress.cidr_blocks not contains "0.0.0.0/0"
}
}
🚨
Live
Demo
Warning
🚨
Head in the Clouds: Testing Infra as Code - Config Management 2020
Head in the Clouds: Testing Infra as Code - Config Management 2020
Head in the Clouds: Testing Infra as Code - Config Management 2020
Head in the Clouds: Testing Infra as Code - Config Management 2020
What have we learnt?
The benefits of testing IaC
Regardless of what tool you’re using, Infrastructure-as-code without testing
is “self-sabotage”
Unit Testing for IaC
Allowing quick feedback loops and TDD
Acceptance and Integration testing for IaC
Allowing you assurance that your IaC final state reflects what you expect
Beyond conventional testing
Using observability to check things are running ok after deployment...
The benefits of Policy-as-code
How reflecting organisational governance as PoC can speed up deployment
Thank You
psouter@hashicorp.com
@petersouter
www.hashicorp.com
13
8

More Related Content

PDF
Inspec one tool to rule them all
PDF
Monitoring a Vault and Consul cluster - 24th May 2018
PPTX
Testing Terraform
PDF
RSpec 2 Best practices
PDF
Bringing modern PHP development to IBM i (ZendCon 2016)
PPTX
Puppet camp chicago-automated_testing2
ODP
FOSDEM 2012: Practical implementation of promise theory in CFEngine
PDF
Atmosphere 2014
Inspec one tool to rule them all
Monitoring a Vault and Consul cluster - 24th May 2018
Testing Terraform
RSpec 2 Best practices
Bringing modern PHP development to IBM i (ZendCon 2016)
Puppet camp chicago-automated_testing2
FOSDEM 2012: Practical implementation of promise theory in CFEngine
Atmosphere 2014

What's hot (20)

PDF
Trying Continuous Delivery - pyconjp 2012
PPTX
PSGI and Plack from first principles
PDF
SDPHP - Percona Toolkit (It's Basically Magic)
PDF
"Swoole: double troubles in c", Alexandr Vronskiy
PDF
How to Develop Puppet Modules: From Source to the Forge With Zero Clicks
PDF
Lies, Damn Lies, and Benchmarks
PPTX
Why you should be using the shiny new C# 6.0 features now!
PDF
Release with confidence
PDF
Kubernetes: Wie Chefkoch.de mit Containern arbeitet
PDF
Minimal MVC in JavaScript
PDF
A Modest Introduction To Swift
PDF
Selenium sandwich-3: Being where you aren't.
PDF
PostgreSQL High-Availability and Geographic Locality using consul
PDF
A Hands-on Introduction on Terraform Best Concepts and Best Practices
PDF
Node.js cluster
PDF
Effective Benchmarks
PDF
Application Layer in PHP
ODP
Chef training - Day2
PDF
Testing your infrastructure with litmus
PDF
Unit Testing Lots of Perl
Trying Continuous Delivery - pyconjp 2012
PSGI and Plack from first principles
SDPHP - Percona Toolkit (It's Basically Magic)
"Swoole: double troubles in c", Alexandr Vronskiy
How to Develop Puppet Modules: From Source to the Forge With Zero Clicks
Lies, Damn Lies, and Benchmarks
Why you should be using the shiny new C# 6.0 features now!
Release with confidence
Kubernetes: Wie Chefkoch.de mit Containern arbeitet
Minimal MVC in JavaScript
A Modest Introduction To Swift
Selenium sandwich-3: Being where you aren't.
PostgreSQL High-Availability and Geographic Locality using consul
A Hands-on Introduction on Terraform Best Concepts and Best Practices
Node.js cluster
Effective Benchmarks
Application Layer in PHP
Chef training - Day2
Testing your infrastructure with litmus
Unit Testing Lots of Perl
Ad

Similar to Head in the Clouds: Testing Infra as Code - Config Management 2020 (20)

PDF
End to End immutable infrastructure testing
PDF
Test Driven Development with Chef
PDF
20141210 rakuten techtalk
PPTX
[GEMINI EXTERNAL DECK] Introduction to Gemini.pptx
PPTX
drupal ci cd concept cornel univercity.pptx
KEY
Winning the Erlang Edit•Build•Test Cycle
PDF
PHP Mega Meetup, Sep, 2020, Anti patterns in php
PPT
Sauce Labs Beta Program Overview
PDF
PHP SA 2014 - Releasing Your Open Source Project
PDF
[xp2013] Narrow Down What to Test
PDF
Us 17-krug-hacking-severless-runtimes
PDF
TDD with Puppet Tutorial presented at Cascadia IT Conference 2014-03-07
PPTX
Joomla! Day Chicago 2011 Presentation - Steven Pignataro
PDF
North Virginia Coldfusion User Group Meetup - Testbox - July 19th 2017
PDF
Writing Readable Code
PDF
Stop Being Lazy and Test Your Software
KEY
Your Own Metric System
PDF
Serverless in production, an experience report (LNUG)
PDF
Attacking Pipelines--Security meets Continuous Delivery
PDF
Serverless in Production, an experience report (cloudXchange)
End to End immutable infrastructure testing
Test Driven Development with Chef
20141210 rakuten techtalk
[GEMINI EXTERNAL DECK] Introduction to Gemini.pptx
drupal ci cd concept cornel univercity.pptx
Winning the Erlang Edit•Build•Test Cycle
PHP Mega Meetup, Sep, 2020, Anti patterns in php
Sauce Labs Beta Program Overview
PHP SA 2014 - Releasing Your Open Source Project
[xp2013] Narrow Down What to Test
Us 17-krug-hacking-severless-runtimes
TDD with Puppet Tutorial presented at Cascadia IT Conference 2014-03-07
Joomla! Day Chicago 2011 Presentation - Steven Pignataro
North Virginia Coldfusion User Group Meetup - Testbox - July 19th 2017
Writing Readable Code
Stop Being Lazy and Test Your Software
Your Own Metric System
Serverless in production, an experience report (LNUG)
Attacking Pipelines--Security meets Continuous Delivery
Serverless in Production, an experience report (cloudXchange)
Ad

More from Peter Souter (10)

PDF
I don't know what I'm Doing: A newbie guide for Golang for DevOps
PDF
Consul Connect - EPAM SEC - 22nd september 2018
PDF
Maintaining Layer 8
PDF
Knee deep in the undef - Tales from refactoring old Puppet codebases
PDF
Compliance and auditing with Puppet
PDF
Lock it down
PDF
Hardening Your Config Management - Security and Attack Vectors in Config Mana...
PDF
Puppet module anti patterns
PDF
Little Puppet Tools To Make Your Life Better
PDF
Testing servers like software
I don't know what I'm Doing: A newbie guide for Golang for DevOps
Consul Connect - EPAM SEC - 22nd september 2018
Maintaining Layer 8
Knee deep in the undef - Tales from refactoring old Puppet codebases
Compliance and auditing with Puppet
Lock it down
Hardening Your Config Management - Security and Attack Vectors in Config Mana...
Puppet module anti patterns
Little Puppet Tools To Make Your Life Better
Testing servers like software

Recently uploaded (20)

PDF
Machine learning based COVID-19 study performance prediction
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PDF
Agricultural_Statistics_at_a_Glance_2022_0.pdf
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PPTX
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
PDF
Chapter 3 Spatial Domain Image Processing.pdf
PDF
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PPTX
Cloud computing and distributed systems.
PDF
Approach and Philosophy of On baking technology
PDF
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
PDF
Unlocking AI with Model Context Protocol (MCP)
PPTX
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
PDF
Electronic commerce courselecture one. Pdf
PDF
Encapsulation_ Review paper, used for researhc scholars
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PPTX
Understanding_Digital_Forensics_Presentation.pptx
PDF
NewMind AI Weekly Chronicles - August'25 Week I
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PDF
cuic standard and advanced reporting.pdf
Machine learning based COVID-19 study performance prediction
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
Agricultural_Statistics_at_a_Glance_2022_0.pdf
Reach Out and Touch Someone: Haptics and Empathic Computing
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
Chapter 3 Spatial Domain Image Processing.pdf
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
Per capita expenditure prediction using model stacking based on satellite ima...
Cloud computing and distributed systems.
Approach and Philosophy of On baking technology
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
Unlocking AI with Model Context Protocol (MCP)
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
Electronic commerce courselecture one. Pdf
Encapsulation_ Review paper, used for researhc scholars
Dropbox Q2 2025 Financial Results & Investor Presentation
Understanding_Digital_Forensics_Presentation.pptx
NewMind AI Weekly Chronicles - August'25 Week I
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
cuic standard and advanced reporting.pdf

Head in the Clouds: Testing Infra as Code - Config Management 2020