cmdb driven by perl - netbsd

136
CMDB Driven by Perl Road to a Perl ”driven” Configuration Management Database Jens Rehsack Niederrhein Perl Mongers The Perl Conference in Amsterdam Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 1 / 44

Upload: others

Post on 08-Nov-2021

7 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: CMDB Driven by Perl - NetBSD

CMDB Driven by PerlRoad to a Perl ”driven” Configuration Management Database

Jens Rehsack

Niederrhein Perl Mongers

The Perl Conference in Amsterdam

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 1 / 44

Page 2: CMDB Driven by Perl - NetBSD

Overview

Part I

Introduction

1 IntroductionMotivation

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 2 / 44

Page 3: CMDB Driven by Perl - NetBSD

Introduction Motivation

Motivation

ProgressProgress isn’t made by early risers. It’s made by lazy men trying to

find easier ways to do something.(Robert A. Heinlein)

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 3 / 44

Page 4: CMDB Driven by Perl - NetBSD

Introduction Motivation

Motivation

EfficiencyBusiness success is because of Perl. It enables us to deliver right

solutions in days instead of months.(Elizabeth Mattijsen)

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 4 / 44

Page 5: CMDB Driven by Perl - NetBSD

Introduction Motivation

Goal

AutomationFull flavoured systems management

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 5 / 44

Page 6: CMDB Driven by Perl - NetBSD

Introduction Motivation

Goal

AutomationFull flavoured systems management

Installation without Administrator interaction

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 5 / 44

Page 7: CMDB Driven by Perl - NetBSD

Introduction Motivation

Goal

AutomationFull flavoured systems management

Installation without Administrator interaction

Control sensors and alarming

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 5 / 44

Page 8: CMDB Driven by Perl - NetBSD

Introduction Motivation

Goal

AutomationFull flavoured systems management

Installation without Administrator interaction

Control sensors and alarming

Ensured system state by actual-theoretical comparison

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 5 / 44

Page 9: CMDB Driven by Perl - NetBSD

Introduction Motivation

Goal

AutomationFull flavoured systems management

Installation without Administrator interaction

Control sensors and alarming

Ensured system state by actual-theoretical comparison

Faster reaction in emergency cases by organized component moving

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 5 / 44

Page 10: CMDB Driven by Perl - NetBSD

Introduction Motivation

Goal

AutomationFull flavoured systems management

Installation without Administrator interaction

Control sensors and alarming

Ensured system state by actual-theoretical comparison

Faster reaction in emergency cases by organized component moving

Have an up-to-date ”Operation Handbook” as well as archiving them

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 5 / 44

Page 11: CMDB Driven by Perl - NetBSD

Overview

Part II

Challenge

2 BeginningTaking overAfter reportingMine SweeperBaby Steps

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 6 / 44

Page 12: CMDB Driven by Perl - NetBSD

Beginning Taking over

Begin with reporting

Begin with reporting

In the beginning was the (Installation-)Report

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 7 / 44

Page 13: CMDB Driven by Perl - NetBSD

Beginning Taking over

Begin with reporting

Begin with reporting

In the beginning was the (Installation-)Report

Technical Sales defined an XML Document for Change Requests and StatusReports

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 7 / 44

Page 14: CMDB Driven by Perl - NetBSD

Beginning Taking over

Begin with reporting

Begin with reporting

In the beginning was the (Installation-)Report

Technical Sales defined an XML Document for Change Requests and StatusReports

Based on work of forerunner a 70% solution could be delivered

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 7 / 44

Page 15: CMDB Driven by Perl - NetBSD

Beginning Taking over

Begin with reporting

Begin with reporting

In the beginning was the (Installation-)Report

Technical Sales defined an XML Document for Change Requests and StatusReports

Based on work of forerunner a 70% solution could be delivered

Document Definition lacks entity-relations

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 7 / 44

Page 16: CMDB Driven by Perl - NetBSD

Beginning Taking over

Begin with reporting

Begin with reporting

In the beginning was the (Installation-)Report

Technical Sales defined an XML Document for Change Requests and StatusReports

Based on work of forerunner a 70% solution could be delivered

Document Definition lacks entity-relations

Document Definition misses technolgy requirements

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 7 / 44

Page 17: CMDB Driven by Perl - NetBSD

Beginning Taking over

Begin with reporting

Begin with reporting

In the beginning was the (Installation-)Report

Technical Sales defined an XML Document for Change Requests and StatusReports

Based on work of forerunner a 70% solution could be delivered

Document Definition lacks entity-relations

Document Definition misses technolgy requirements

⇒ Appears to be a dead end

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 7 / 44

Page 18: CMDB Driven by Perl - NetBSD

Beginning After reporting

From reporting to . . .

Mind the goalAlice: Would you tell me, please, which way I ought to go from here?The Cheshire Cat: That depends a good deal on where you want to

get to.(Lewis Carroll)

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 8 / 44

Page 19: CMDB Driven by Perl - NetBSD

Beginning Mine Sweeper

Where do I begin

To write the workflow how great Perl 5 can beThe project was in a state where a developer created a particular Reportbased on the existing snapshot.

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 9 / 44

Page 20: CMDB Driven by Perl - NetBSD

Beginning Mine Sweeper

Where do I begin

To write the workflow how great Perl 5 can beThe project was in a state where a developer created a particular Reportbased on the existing snapshot.

This solution did not maintain an abstraction layer for gathered data - everytime when the report needs an extension, an end-to-end (snapshot toXML-Tag) enhancement had to be created.

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 9 / 44

Page 21: CMDB Driven by Perl - NetBSD

Beginning Mine Sweeper

Where do I begin

To write the workflow how great Perl 5 can beThe project was in a state where a developer created a particular Reportbased on the existing snapshot.

This solution did not maintain an abstraction layer for gathered data - everytime when the report needs an extension, an end-to-end (snapshot toXML-Tag) enhancement had to be created.

Changes shall be deployed from the same report format as installations arereported.

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 9 / 44

Page 22: CMDB Driven by Perl - NetBSD

Beginning Mine Sweeper

Where do I begin

To write the workflow how great Perl 5 can beThe project was in a state where a developer created a particular Reportbased on the existing snapshot.

This solution did not maintain an abstraction layer for gathered data - everytime when the report needs an extension, an end-to-end (snapshot toXML-Tag) enhancement had to be created.

Changes shall be deployed from the same report format as installations arereported.

We have to be able to say at any moment what is operated on the platform.

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 9 / 44

Page 23: CMDB Driven by Perl - NetBSD

Beginning Baby Steps

Baby Steps

Improve knowledgeBased on identified issues the first goal had to be to identify all entities and theirrelations together

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 10 / 44

Page 24: CMDB Driven by Perl - NetBSD

Beginning Baby Steps

Baby Steps

Improve knowledgeBased on identified issues the first goal had to be to identify all entities and theirrelations together

SurroundedProblem: The entire platform was completely unstructured

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 10 / 44

Page 25: CMDB Driven by Perl - NetBSD

Beginning Baby Steps

Baby Steps

Multiple Beginnings

The already known ”(Installation-)Report”

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 11 / 44

Page 26: CMDB Driven by Perl - NetBSD

Beginning Baby Steps

Baby Steps

Multiple Beginnings

The already known ”(Installation-)Report”

Platform Snapshot (SCM Repository of selected configuration files)

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 11 / 44

Page 27: CMDB Driven by Perl - NetBSD

Beginning Baby Steps

Baby Steps

Multiple Beginnings

The already known ”(Installation-)Report”

Platform Snapshot (SCM Repository of selected configuration files)

Puppet Classes (without Hiera) mixed with Configuration Items (withinHiera) and prepared configuration files (unsupervised)

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 11 / 44

Page 28: CMDB Driven by Perl - NetBSD

Beginning Baby Steps

Baby Steps

Multiple Beginnings

The already known ”(Installation-)Report”

Platform Snapshot (SCM Repository of selected configuration files)

Puppet Classes (without Hiera) mixed with Configuration Items (withinHiera) and prepared configuration files (unsupervised)

Hiera is Puppet’s built-in key/value data lookup system. By default, it usessimple YAML or JSON files, although one can extend it to work withalmost any data source.

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 11 / 44

Page 29: CMDB Driven by Perl - NetBSD

OverviewPart III

Sweat

3 World DominationSeparation

4 ConcernsIdentifying

5 Tuck In!MI:5Home ImprovementClean PictureControlReflecting RelationshipsMeanwhileMerging PicturesFuture and PastFeaturesMeanwhile IIJens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 12 / 44

Page 30: CMDB Driven by Perl - NetBSD

World Domination Separation

Circle in the Sand

:platform

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 13 / 44

Page 31: CMDB Driven by Perl - NetBSD

World Domination Separation

Circle in the Sand

:platform

:snapshot

collect

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 13 / 44

Page 32: CMDB Driven by Perl - NetBSD

World Domination Separation

Circle in the Sand

:platform

:snapshot

:scan db

collect

scan

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 13 / 44

Page 33: CMDB Driven by Perl - NetBSD

World Domination Separation

Circle in the Sand

:platform

:snapshot

:scan db:cmdb

collect

scan

process-scan

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 13 / 44

Page 34: CMDB Driven by Perl - NetBSD

World Domination Separation

Circle in the Sand

:platform

:snapshot

:scan db:cmdb

:hiera

collect

scan

process-scan

yaml-gen

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 13 / 44

Page 35: CMDB Driven by Perl - NetBSD

World Domination Separation

Circle in the Sand

:platform

:snapshot

:scan db:cmdb

:hiera

collect

scan

process-scan

yaml-gen

puppet run

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 13 / 44

Page 36: CMDB Driven by Perl - NetBSD

World Domination Separation

Circle in the Sand

:platform

:snapshot

:scan db:cmdb

:hiera

collect

scan

process-scan

yaml-gen

puppet run

CRQ

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 13 / 44

Page 37: CMDB Driven by Perl - NetBSD

World Domination Separation

Circle in the Sand

:platform

:snapshot

:scan db:cmdb

:hiera

:report

collect

scan

process-scan

yaml-gen

puppet run

CRQ

export

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 13 / 44

Page 38: CMDB Driven by Perl - NetBSD

Concerns Identifying

Technical Concerns

Rough

Collecting platform parameters (to query them in structured way)

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 14 / 44

Page 39: CMDB Driven by Perl - NetBSD

Concerns Identifying

Technical Concerns

Rough

Collecting platform parameters (to query them in structured way)

Identify coherences of Configuration Items (CI)

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 14 / 44

Page 40: CMDB Driven by Perl - NetBSD

Concerns Identifying

Technical Concerns

Rough

Collecting platform parameters (to query them in structured way)

Identify coherences of Configuration Items (CI)

Define a data model

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 14 / 44

Page 41: CMDB Driven by Perl - NetBSD

Concerns Identifying

Technical Concerns

Rough

Collecting platform parameters (to query them in structured way)

Identify coherences of Configuration Items (CI)

Define a data model

Define technical requirements

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 14 / 44

Page 42: CMDB Driven by Perl - NetBSD

Concerns Identifying

Practical Concerns

PracticalValidity of CI’s

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 15 / 44

Page 43: CMDB Driven by Perl - NetBSD

Concerns Identifying

Practical Concerns

PracticalValidity of CI’s

Limits of our CI’s

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 15 / 44

Page 44: CMDB Driven by Perl - NetBSD

Concerns Identifying

Practical Concerns

PracticalValidity of CI’s

Limits of our CI’s

Data ownership of CI’s

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 15 / 44

Page 45: CMDB Driven by Perl - NetBSD

Concerns Identifying

Practical Concerns

PracticalValidity of CI’s

Limits of our CI’s

Data ownership of CI’s

Methods to persist CI’s

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 15 / 44

Page 46: CMDB Driven by Perl - NetBSD

Concerns Identifying

Practical Concerns

PracticalValidity of CI’s

Limits of our CI’s

Data ownership of CI’s

Methods to persist CI’s

Methods to access CI’s

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 15 / 44

Page 47: CMDB Driven by Perl - NetBSD

Concerns Identifying

Practical Concerns

PracticalValidity of CI’s

Limits of our CI’s

Data ownership of CI’s

Methods to persist CI’s

Methods to access CI’s

Permission management

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 15 / 44

Page 48: CMDB Driven by Perl - NetBSD

Tuck In!

OverviewPart III

Sweat

3 World DominationSeparation

4 ConcernsIdentifying

5 Tuck In!MI:5Home ImprovementClean PictureControlReflecting RelationshipsMeanwhileMerging PicturesFuture and PastFeaturesMeanwhile IIJens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 16 / 44

Page 49: CMDB Driven by Perl - NetBSD

Tuck In! MI:5

Impossible Things

Impossible ThingsAlice laughed. ”There’s no use trying,” she said: ”one can’t believe

impossible things.”

”I daresay you haven’t had much practice,” said the Queen. ”When Iwas your age, I always did it for half-an-hour a day. Why, sometimes I’vebelieved as many as six impossible things beforebreakfast.” (Lewis Carroll)

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 17 / 44

Page 50: CMDB Driven by Perl - NetBSD

Tuck In! Home Improvement

The Fool with a Tool

Try again

So we closed our eyes, took a deep breath (multiple times) and looked around fortools to store serialized data and read in structured way . . .

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 18 / 44

Page 51: CMDB Driven by Perl - NetBSD

Tuck In! Home Improvement

The Fool with a Tool

Try again

So we closed our eyes, took a deep breath (multiple times) and looked around fortools to store serialized data and read in structured way . . .

Tool TimeMongoDB allows easy storing in any format - but lacks structured querying

dedicated entities (configuration items)

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 18 / 44

Page 52: CMDB Driven by Perl - NetBSD

Tuck In! Home Improvement

The Fool with a Tool

Try again

So we closed our eyes, took a deep breath (multiple times) and looked around fortools to store serialized data and read in structured way . . .

Tool TimeMongoDB allows easy storing in any format - but lacks structured querying

dedicated entities (configuration items)

Data Files delegate relationship handling completely to business logic

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 18 / 44

Page 53: CMDB Driven by Perl - NetBSD

Tuck In! Home Improvement

The Fool with a Tool

Try again

So we closed our eyes, took a deep breath (multiple times) and looked around fortools to store serialized data and read in structured way . . .

Tool TimeMongoDB allows easy storing in any format - but lacks structured querying

dedicated entities (configuration items)

Data Files delegate relationship handling completely to business logic

AnyData2 gotcha - allows reading most confusing stuff and could be queried instructured way

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 18 / 44

Page 54: CMDB Driven by Perl - NetBSD

Tuck In! Home Improvement

. . . is still a Fool

Volatile StructurePersist structured data using SQLite

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 19 / 44

Page 55: CMDB Driven by Perl - NetBSD

Tuck In! Home Improvement

. . . is still a Fool

Volatile StructurePersist structured data using SQLite

Define a data model representing existing relations

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 19 / 44

Page 56: CMDB Driven by Perl - NetBSD

Tuck In! Home Improvement

. . . is still a Fool

Volatile StructurePersist structured data using SQLite

Define a data model representing existing relations

Develop AnyData2::Format classes representing defined ER (EntityRelationship) model

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 19 / 44

Page 57: CMDB Driven by Perl - NetBSD

Tuck In! Home Improvement

. . . is still a Fool

Volatile StructurePersist structured data using SQLite

Define a data model representing existing relations

Develop AnyData2::Format classes representing defined ER (EntityRelationship) model

Develop simple MOP inside this AnyData2 instance to manage attributes vs.columns

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 19 / 44

Page 58: CMDB Driven by Perl - NetBSD

Tuck In! Home Improvement

. . . is still a Fool

Volatile StructurePersist structured data using SQLite

Define a data model representing existing relations

Develop AnyData2::Format classes representing defined ER (EntityRelationship) model

Develop simple MOP inside this AnyData2 instance to manage attributes vs.columns

Glue everything together using SQL

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 19 / 44

Page 59: CMDB Driven by Perl - NetBSD

Tuck In! Home Improvement

. . . is still a Fool

Volatile StructurePersist structured data using SQLite

Define a data model representing existing relations

Develop AnyData2::Format classes representing defined ER (EntityRelationship) model

Develop simple MOP inside this AnyData2 instance to manage attributes vs.columns

Glue everything together using SQL

The entire ER model remains a moving target

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 19 / 44

Page 60: CMDB Driven by Perl - NetBSD

Tuck In! Clean Picture

Abstraction Layer

. . . of configured componentsFocus the goal to know what is operated

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 20 / 44

Page 61: CMDB Driven by Perl - NetBSD

Tuck In! Clean Picture

Abstraction Layer

. . . of configured componentsFocus the goal to know what is operated

Depth first search over all component configuration files

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 20 / 44

Page 62: CMDB Driven by Perl - NetBSD

Tuck In! Clean Picture

Abstraction Layer

. . . of configured componentsFocus the goal to know what is operated

Depth first search over all component configuration files

Identify relationships (remember: there is no operation model at all)

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 20 / 44

Page 63: CMDB Driven by Perl - NetBSD

Tuck In! Clean Picture

Abstraction Layer

. . . of configured componentsFocus the goal to know what is operated

Depth first search over all component configuration files

Identify relationships (remember: there is no operation model at all)

Clean up configuration when no reasonable relationships can be resolved orrelationships are conflicting

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 20 / 44

Page 64: CMDB Driven by Perl - NetBSD

Tuck In! Control

Moo in practice

Moo in practiceIt appears that the tools helping to do safe IoT device updating are the same toolshelping to coordinate CI determining:

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 21 / 44

Page 65: CMDB Driven by Perl - NetBSD

Tuck In! Control

Moo in practice

Moo in practiceIt appears that the tools helping to do safe IoT device updating are the same toolshelping to coordinate CI determining:

MooX::Cmd helps separating concerns

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 21 / 44

Page 66: CMDB Driven by Perl - NetBSD

Tuck In! Control

Moo in practice

Moo in practiceIt appears that the tools helping to do safe IoT device updating are the same toolshelping to coordinate CI determining:

MooX::Cmd helps separating concerns

MooX::ConfigFromFile helps contribute ”divine wisdom”

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 21 / 44

Page 67: CMDB Driven by Perl - NetBSD

Tuck In! Control

Moo in practice

Moo in practiceIt appears that the tools helping to do safe IoT device updating are the same toolshelping to coordinate CI determining:

MooX::Cmd helps separating concerns

MooX::ConfigFromFile helps contribute ”divine wisdom”

MooX::Options allow overriding ”divine wisdom” by ”individualwisdom”

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 21 / 44

Page 68: CMDB Driven by Perl - NetBSD

Tuck In! Control

Moo in practice

Moo in practiceIt appears that the tools helping to do safe IoT device updating are the same toolshelping to coordinate CI determining:

MooX::Cmd helps separating concerns

MooX::ConfigFromFile helps contribute ”divine wisdom”

MooX::Options allow overriding ”divine wisdom” by ”individualwisdom”

MooX::Log::Any feeds DBIx::LogAny

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 21 / 44

Page 69: CMDB Driven by Perl - NetBSD

Tuck In! Control

Moo in background

Moo in backgroundManage database connections based on concerns

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 22 / 44

Page 70: CMDB Driven by Perl - NetBSD

Tuck In! Control

Moo in background

Moo in backgroundManage database connections based on concerns

Manage CI structures based on relations

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 22 / 44

Page 71: CMDB Driven by Perl - NetBSD

Tuck In! Control

Moo in background

Moo in backgroundManage database connections based on concerns

Manage CI structures based on relations

Manage Web-API integration

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 22 / 44

Page 72: CMDB Driven by Perl - NetBSD

Tuck In! Reflecting Relationships

Craziness

CrazyI’m not crazy. My reality is just different than yours.

The Cheshire Cat(Lewis Carroll)

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 23 / 44

Page 73: CMDB Driven by Perl - NetBSD

Tuck In! Reflecting Relationships

Harmonization

Harmonize CrazinessPractically any administrator had a different background regarding to theplatform components thus a different picture of their relationships

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 24 / 44

Page 74: CMDB Driven by Perl - NetBSD

Tuck In! Reflecting Relationships

Harmonization

Harmonize CrazinessPractically any administrator had a different background regarding to theplatform components thus a different picture of their relationships

EPIC battles leads to common craziness

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 24 / 44

Page 75: CMDB Driven by Perl - NetBSD

Tuck In! Reflecting Relationships

Harmonization

Harmonize CrazinessPractically any administrator had a different background regarding to theplatform components thus a different picture of their relationships

EPIC battles leads to common craziness

ER model analysis sessions uncovered holes in picture

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 24 / 44

Page 76: CMDB Driven by Perl - NetBSD

Tuck In! Meanwhile

Civilized

March Hare: Have some wine.(Alice looked all round the table, but there was nothing on it but tea.)Alice: I don’t see any wine.

March Hare: There isn’t any.Alice: Then it wasn’t very civil of you to offer it.March Hare: It wasn’t very civil of you to sit down without being invited.

(Lewis Carroll)

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 25 / 44

Page 77: CMDB Driven by Perl - NetBSD

Tuck In! Meanwhile

Adding a Goal

CentOS 5 ends its maintenanceMany of existing tools need to be upgraded

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 26 / 44

Page 78: CMDB Driven by Perl - NetBSD

Tuck In! Meanwhile

Adding a Goal

CentOS 5 ends its maintenanceMany of existing tools need to be upgraded

Upgraded tools don’t support existing hacks anymore

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 26 / 44

Page 79: CMDB Driven by Perl - NetBSD

Tuck In! Meanwhile

Adding a Goal

CentOS 5 ends its maintenanceMany of existing tools need to be upgraded

Upgraded tools don’t support existing hacks anymore

Existing hacks must be replaced by a reasonable configuration structure

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 26 / 44

Page 80: CMDB Driven by Perl - NetBSD

Tuck In! Meanwhile

Adding a Goal

CentOS 5 ends its maintenanceMany of existing tools need to be upgraded

Upgraded tools don’t support existing hacks anymore

Existing hacks must be replaced by a reasonable configuration structure

Same problem like the report format:

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 26 / 44

Page 81: CMDB Driven by Perl - NetBSD

Tuck In! Meanwhile

Adding a Goal

CentOS 5 ends its maintenanceMany of existing tools need to be upgraded

Upgraded tools don’t support existing hacks anymore

Existing hacks must be replaced by a reasonable configuration structure

Same problem like the report format:! neither the ER model of platform components nor issues of platform where

known

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 26 / 44

Page 82: CMDB Driven by Perl - NetBSD

Tuck In! Meanwhile

Adding a Goal

CentOS 5 ends its maintenanceMany of existing tools need to be upgraded

Upgraded tools don’t support existing hacks anymore

Existing hacks must be replaced by a reasonable configuration structure

Same problem like the report format:! neither the ER model of platform components nor issues of platform where

known! nor cared about

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 26 / 44

Page 83: CMDB Driven by Perl - NetBSD

Tuck In! Meanwhile

Self Protection

DelegationWe learned from mistakes of past:

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 27 / 44

Page 84: CMDB Driven by Perl - NetBSD

Tuck In! Meanwhile

Self Protection

DelegationWe learned from mistakes of past:

No responsibility taken for filling weird puppet templates

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 27 / 44

Page 85: CMDB Driven by Perl - NetBSD

Tuck In! Meanwhile

Self Protection

DelegationWe learned from mistakes of past:

No responsibility taken for filling weird puppet templates

No external data will be managed

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 27 / 44

Page 86: CMDB Driven by Perl - NetBSD

Tuck In! Meanwhile

Self Protection

DelegationWe learned from mistakes of past:

No responsibility taken for filling weird puppet templates

No external data will be managed

No precompiled/puzzled resources are prepared

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 27 / 44

Page 87: CMDB Driven by Perl - NetBSD

Tuck In! Meanwhile

Self Protection

DelegationWe learned from mistakes of past:

No responsibility taken for filling weird puppet templates

No external data will be managed

No precompiled/puzzled resources are prepared

⇒ ER model of CMDB is presented via RESTful API

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 27 / 44

Page 88: CMDB Driven by Perl - NetBSD

Tuck In! Merging Pictures

Scan completedEarly implementation of above mentioned RESTful API run against ScanDB

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 28 / 44

Page 89: CMDB Driven by Perl - NetBSD

Tuck In! Merging Pictures

Scan completedEarly implementation of above mentioned RESTful API run against ScanDB

ScanDB represents just a view of the configuration snapshot

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 28 / 44

Page 90: CMDB Driven by Perl - NetBSD

Tuck In! Merging Pictures

Scan completedEarly implementation of above mentioned RESTful API run against ScanDB

ScanDB represents just a view of the configuration snapshot

There is no future

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 28 / 44

Page 91: CMDB Driven by Perl - NetBSD

Tuck In! Merging Pictures

Scan completedEarly implementation of above mentioned RESTful API run against ScanDB

ScanDB represents just a view of the configuration snapshot

There is no future, nor past

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 28 / 44

Page 92: CMDB Driven by Perl - NetBSD

Tuck In! Merging Pictures

Scan completedEarly implementation of above mentioned RESTful API run against ScanDB

ScanDB represents just a view of the configuration snapshot

There is no future, nor past

Time for CMDB to enter the stage

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 28 / 44

Page 93: CMDB Driven by Perl - NetBSD

Tuck In! Future and Past

Customers . . .

CREATE TABLE customer_t(

customer _id INTEGER PRIMARY KEY-- entity stuff, customer_name VARCHAR (80) UNIQUE NOT NULL-- cmdb stuff, valid _from DATETIME NOT NULL, valid _to DATETIME, modified _at DATETIME NOT NULL, modified _by VARCHAR (32) NOT NULL

);

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 29 / 44

Page 94: CMDB Driven by Perl - NetBSD

Tuck In! Future and Past

Customers . . .

CREATE TABLE customer_t(

customer _id INTEGER PRIMARY KEY-- entity stuff, customer_name VARCHAR (80) UNIQUE NOT NULL-- cmdb stuff, valid _from DATETIME NOT NULL, valid _to DATETIME, modified _at DATETIME NOT NULL, modified _by VARCHAR (32) NOT NULL

);

primary key and global identifier for this data type

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 29 / 44

Page 95: CMDB Driven by Perl - NetBSD

Tuck In! Future and Past

Customers . . .

CREATE TABLE customer_t(

customer _id INTEGER PRIMARY KEY-- entity stuff, customer_name VARCHAR (80) UNIQUE NOT NULL-- cmdb stuff, valid _from DATETIME NOT NULL, valid _to DATETIME, modified _at DATETIME NOT NULL, modified _by VARCHAR (32) NOT NULL

);

primary key and global identifier for this data type

the payload of this data type, automatically indexed

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 29 / 44

Page 96: CMDB Driven by Perl - NetBSD

Tuck In! Future and Past

Customers . . .

CREATE TABLE customer_t(

customer _id INTEGER PRIMARY KEY-- entity stuff, customer_name VARCHAR (80) UNIQUE NOT NULL-- cmdb stuff, valid _from DATETIME NOT NULL, valid _to DATETIME, modified _at DATETIME NOT NULL, modified _by VARCHAR (32) NOT NULL

);

primary key and global identifier for this data type

the payload of this data type, automatically indexed

CMDB manages history and updates using these columns

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 29 / 44

Page 97: CMDB Driven by Perl - NetBSD

Tuck In! Future and Past

VPN links to customers . . .

CREATE TABLE vpn_link_t(

vpn_link_id INTEGER PRIMARY KEY-- entity stuff, customer_id INTEGER NOT NULL, vpn_link_type VARCHAR (12), custom er_net VARCHAR (64) UNIQUE NOT NULL, servic es_net VARCHAR (64) UNIQUE NOT NULL-- cmdb stuff, valid_from DATETIME NOT NULL, valid_to DATETIME, modified_at DATETIME NOT NULL, modified_by VARCHAR (32) NOT NULL-- FK, FOREIGN KEY (customer_id) REFERENCES customer_t(customer_id)

ON UPDATE CASCADE ON DELETE CASCADE);

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 30 / 44

Page 98: CMDB Driven by Perl - NetBSD

Tuck In! Future and Past

VPN links to customers . . .

CREATE TABLE vpn_link_t(

vpn_link_id INTEGER PRIMARY KEY-- entity stuff, customer_id INTEGER NOT NULL, vpn_link_type VARCHAR (12), custom er_net VARCHAR (64) UNIQUE NOT NULL, servic es_net VARCHAR (64) UNIQUE NOT NULL-- cmdb stuff, valid_from DATETIME NOT NULL, valid_to DATETIME, modified_at DATETIME NOT NULL, modified_by VARCHAR (32) NOT NULL-- FK, FOREIGN KEY (customer_id) REFERENCES customer_t(customer_id)

ON UPDATE CASCADE ON DELETE CASCADE);

refer the customer

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 30 / 44

Page 99: CMDB Driven by Perl - NetBSD

Tuck In! Future and Past

VPN links to customers . . .

CREATE TABLE vpn_link_t(

vpn_link_id INTEGER PRIMARY KEY-- entity stuff, customer_id INTEGER NOT NULL, vpn_link_type VARCHAR (12), custom er_net VARCHAR (64) UNIQUE NOT NULL, servic es_net VARCHAR (64) UNIQUE NOT NULL-- cmdb stuff, valid_from DATETIME NOT NULL, valid_to DATETIME, modified_at DATETIME NOT NULL, modified_by VARCHAR (32) NOT NULL-- FK, FOREIGN KEY (customer_id) REFERENCES customer_t(customer_id)

ON UPDATE CASCADE ON DELETE CASCADE);

refer the customer

support Cisco, Juniper, Paolo Alto, . . .

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 30 / 44

Page 100: CMDB Driven by Perl - NetBSD

Tuck In! Future and Past

VPN links to customers . . .

CREATE TABLE vpn_link_t(

vpn_link_id INTEGER PRIMARY KEY-- entity stuff, customer_id INTEGER NOT NULL, vpn_link_type VARCHAR (12), custom er_net VARCHAR (64) UNIQUE NOT NULL, servic es_net VARCHAR (64) UNIQUE NOT NULL-- cmdb stuff, valid_from DATETIME NOT NULL, valid_to DATETIME, modified_at DATETIME NOT NULL, modified_by VARCHAR (32) NOT NULL-- FK, FOREIGN KEY (customer_id) REFERENCES customer_t(customer_id)

ON UPDATE CASCADE ON DELETE CASCADE);

refer the customer

support Cisco, Juniper, Paolo Alto, . . .

networks must be unique or network admins kill you

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 30 / 44

Page 101: CMDB Driven by Perl - NetBSD

Tuck In! Future and Past

Moo Interception

package Foo::Role:: Database ::CMDB;use Moo::Role;requires "log";

has cmdb => (is => "ro",required => 1,handles => "Foo::Role:: Database",isa => sub {

_INSTANCE_OF($_[0], "Foo:: Helper::CMDB") and $_[0]->DOES("Foo::Role:: Datand return;

die "Insufficient initialisation parameter for cmdb";},coerce => sub {

_HASH($_[0]) and return Foo:: Helper::CMDB ->new(%{$_ [0]});$_[0];

},);

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 31 / 44

Page 102: CMDB Driven by Perl - NetBSD

Tuck In! Future and Past

Moo Interception

package Foo::Role:: Database ::CMDB;use Moo::Role;requires "log";

has cmdb => (is => "ro",required => 1,handles => "Foo::Role:: Database",isa => sub {

_INSTANCE_OF($_[0], "Foo:: Helper::CMDB") and $_[0]->DOES("Foo::Role:: Datand return;

die "Insufficient initialisation parameter for cmdb";},coerce => sub {

_HASH($_[0]) and return Foo:: Helper::CMDB ->new(%{$_ [0]});$_[0];

},);

role can be consumed by any class needing access to CMDB

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 31 / 44

Page 103: CMDB Driven by Perl - NetBSD

Tuck In! Future and Past

Moo Interception

package Foo::Role:: Database ::CMDB;use Moo::Role;requires "log";

has cmdb => (is => "ro",required => 1,handles => "Foo::Role:: Database",isa => sub {

_INSTANCE_OF($_[0], "Foo:: Helper::CMDB") and $_[0]->DOES("Foo::Role:: Datand return;

die "Insufficient initialisation parameter for cmdb";},coerce => sub {

_HASH($_[0]) and return Foo:: Helper::CMDB ->new(%{$_ [0]});$_[0];

},);

role can be consumed by any class needing access to CMDB

transform hash initializer into object

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 31 / 44

Page 104: CMDB Driven by Perl - NetBSD

Tuck In! Future and Past

Hard work

package Foo:: Helper::CMDB;use Moo; extends "Foo:: Helper:: DatabaseClass";has config _tables => (is => "lazy", ...);has history_tabl es => (is => "lazy", ...);around deploy => sub { ...my @tables = @{$self ->config_tables };foreach my $tbl (@tables) {

my @h ist_coldefs =map { my $default = defined $_ ->[4] ? " DEFAULT $_ ->[4]" : "";

$pure_cols{$_ - >[1]} ? ("$_ ->[1] $_ ->[2] $default"): ("old_$_ ->[1] $_ ->[2] $default", "new_$_ ->[1] $_ ->[2] $default")

} @table_info;}unshift @hist_coldefs , "${base_name}_hist_id INTEGER PRIMARY KEY";my $hist_defs = join("\n , ", @hist_coldefs );my $hist_tbl = <<EOCHT;CREATE TABLE ${base_name}_hist (

${hist_defs});EOCHT

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 32 / 44

Page 105: CMDB Driven by Perl - NetBSD

Tuck In! Future and Past

Hard work

package Foo:: Helper::CMDB;use Moo; extends "Foo:: Helper:: DatabaseClass";has config _tables => (is => "lazy", ...);has history_tabl es => (is => "lazy", ...);around deploy => sub { ...my @tables = @{$self ->config_tables };foreach my $tbl (@tables) {

my @h ist_coldefs =map { my $default = defined $_ ->[4] ? " DEFAULT $_ ->[4]" : "";

$pure_cols{$_ - >[1]} ? ("$_ ->[1] $_ ->[2] $default"): ("old_$_ ->[1] $_ ->[2] $default", "new_$_ ->[1] $_ ->[2] $default")

} @table_info;}unshift @hist_coldefs , "${base_name}_hist_id INTEGER PRIMARY KEY";my $hist_defs = join("\n , ", @hist_coldefs );my $hist_tbl = <<EOCHT;CREATE TABLE ${base_name}_hist (

${hist_defs});EOCHT

that are all tables with trailing t in their names

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 32 / 44

Page 106: CMDB Driven by Perl - NetBSD

Tuck In! Future and Past

Hard work

package Foo:: Helper::CMDB;use Moo; extends "Foo:: Helper:: DatabaseClass";has config _tables => (is => "lazy", ...);has history_tabl es => (is => "lazy", ...);around deploy => sub { ...my @tables = @{$self ->config_tables };foreach my $tbl (@tables) {

my @h ist_coldefs =map { my $default = defined $_ ->[4] ? " DEFAULT $_ ->[4]" : "";

$pure_cols{$_ - >[1]} ? ("$_ ->[1] $_ ->[2] $default"): ("old_$_ ->[1] $_ ->[2] $default", "new_$_ ->[1] $_ ->[2] $default")

} @table_info;}unshift @hist_coldefs , "${base_name}_hist_id INTEGER PRIMARY KEY";my $hist_defs = join("\n , ", @hist_coldefs );my $hist_tbl = <<EOCHT;CREATE TABLE ${base_name}_hist (

${hist_defs});EOCHT

that are all tables with trailing t in their namescreate history table for each config table

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 32 / 44

Page 107: CMDB Driven by Perl - NetBSD

Tuck In! Future and Past

Hard work

package Foo:: Helper::CMDB;use Moo; extends "Foo:: Helper:: DatabaseClass";has config _tables => (is => "lazy", ...);has history_tabl es => (is => "lazy", ...);around deploy => sub { ...my @tables = @{$self ->config_tables };foreach my $tbl (@tables) {

my @h ist_coldefs =map { my $default = defined $_ ->[4] ? " DEFAULT $_ ->[4]" : "";

$pure_cols{$_ - >[1]} ? ("$_ ->[1] $_ ->[2] $default"): ("old_$_ ->[1] $_ ->[2] $default", "new_$_ ->[1] $_ ->[2] $default")

} @table_info;}unshift @hist_coldefs , "${base_name}_hist_id INTEGER PRIMARY KEY";my $hist_defs = join("\n , ", @hist_coldefs );my $hist_tbl = <<EOCHT;CREATE TABLE ${base_name}_hist (

${hist_defs});EOCHT

that are all tables with trailing t in their namescreate history table for each config tablememoizing old and new values on updating payload

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 32 / 44

Page 108: CMDB Driven by Perl - NetBSD

Tuck In! Future and Past

Hard work (continued) - INSERT

my $new_cols = join(", ", map { $pure_cols{$_} ? $_ : "new_$_" }grep { !$skipped{$_} } @table_cols );

my $new_vals = join(", ", map {"NEW.$_"} grep { !$skipped{$_} } @table_cols );

my $new_trgr = <<EONT;CREATE TRIGGER new_${base_name}_row AFTER INSERT ON ${base_name}_tBEGIN

INSERT INTO ${base_name}_hist ($new_cols)VALUES ($new_vals );

END;EONT

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 33 / 44

Page 109: CMDB Driven by Perl - NetBSD

Tuck In! Future and Past

Hard work (continued) - INSERT

my $new_cols = join(", ", map { $pure_cols{$_} ? $_ : "new_$_" }grep { !$skipped{$_} } @table_cols );

my $new_vals = join(", ", map {"NEW.$_"} grep { !$skipped{$_} } @table_cols );

my $new_trgr = <<EONT;CREATE TRIGGER new_${base_name}_row AFTER INSERT ON ${base_name}_tBEGIN

INSERT INTO ${base_name}_hist ($new_cols)VALUES ($new_vals );

END;EONT

⇒ ON INSERT fill history rows without filling ”OLD ” columns

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 33 / 44

Page 110: CMDB Driven by Perl - NetBSD

Tuck In! Future and Past

Hard work (continued) - UPDATE

my (@updt_cols , @rfrs_cond , @updt_vals );foreach my $colnm (grep { !$skipped{$_} } @table_cols) {

my @lcd = $pure_cols{$colnm} ? $colnm : ("old_${colnm}", "new_${colnm}");push @updt_cols , @lcd;push @rfrs_cond , $pure_cols{$colnm}

? _cmp_if_nullable("existing.${colnm}", "NEW.${colnm}"): (_cmp_if_nullable("existing.old_${colnm}", "OLD.${colnm}"),

_cmp_if_nullable("existing.new_${colnm}", "NEW.${colnm}"));push @updt_vals , $pure_cols{$colnm }?("NEW.$colnm"):("OLD.$colnm","NEW.$colnm")

}my $updt_cols = join(", ", @updt_cols );my $updt_refreshed_cols = join(", ", map { "refreshed.$_" } @updt_cols );my $updt_vals = join(", ", @updt_vals );

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 34 / 44

Page 111: CMDB Driven by Perl - NetBSD

Tuck In! Future and Past

Hard work (continued) - UPDATE

my (@updt_cols , @rfrs_cond , @updt_vals );foreach my $colnm (grep { !$skipped{$_} } @table_cols) {

my @lcd = $pure_cols{$colnm} ? $colnm : ("old_${colnm}", "new_${colnm}");push @updt_cols , @lcd;push @rfrs_cond , $pure_cols{$colnm}

? _cmp_if_nullable("existing.${colnm}", "NEW.${colnm}"): (_cmp_if_nullable("existing.old_${colnm}", "OLD.${colnm}"),

_cmp_if_nullable("existing.new_${colnm}", "NEW.${colnm}"));push @updt_vals , $pure_cols{$colnm }?("NEW.$colnm"):("OLD.$colnm","NEW.$colnm")

}my $updt_cols = join(", ", @updt_cols );my $updt_refreshed_cols = join(", ", map { "refreshed.$_" } @updt_cols );my $updt_vals = join(", ", @updt_vals );

⇒ Prepare for a bit complexer trigger

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 34 / 44

Page 112: CMDB Driven by Perl - NetBSD

Tuck In! Future and Past

Hard work (continued) - UPDATE

my (@updt_cols , @rfrs_cond , @updt_vals );foreach my $colnm (grep { !$skipped{$_} } @table_cols) {

my @lcd = $pure_cols{$colnm} ? $colnm : ("old_${colnm}", "new_${colnm}");push @updt_cols , @lcd;push @rfrs_cond , $pure_cols{$colnm}

? _cmp_if_nullable("existing.${colnm}", "NEW.${colnm}"): (_cmp_if_nullable("existing.old_${colnm}", "OLD.${colnm}"),

_cmp_if_nullable("existing.new_${colnm}", "NEW.${colnm}"));push @updt_vals , $pure_cols{$colnm }?("NEW.$colnm"):("OLD.$colnm","NEW.$colnm")

}my $updt_cols = join(", ", @updt_cols );my $updt_refreshed_cols = join(", ", map { "refreshed.$_" } @updt_cols );my $updt_vals = join(", ", @updt_vals );

⇒ Prepare for a bit complexer trigger

⇒ Distinguish between real updates and just ”touches”

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 34 / 44

Page 113: CMDB Driven by Perl - NetBSD

Tuck In! Future and Past

Hard work (continued) - UPDATE

my $updt_trgr = <<EONT;CREATE TRIGGER updt_${base_name}_row AFTER UPDATE ON ${base_name}_tBEGIN

INSERT OR REPLACE INTO ${base_name}_hist (${base_name}_hist_id , $updt_cols)VALUES (

(SELECT MAX(existing.${base_name}_hist_id) ${base_name}_hist_idFROM ${base_name}_hist existing WHERE $updt_refreshed_cond),

$updt_vals );END;EONT

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 35 / 44

Page 114: CMDB Driven by Perl - NetBSD

Tuck In! Future and Past

Hard work (continued) - UPDATE

my $updt_trgr = <<EONT;CREATE TRIGGER updt_${base_name}_row AFTER UPDATE ON ${base_name}_tBEGIN

INSERT OR REPLACE INTO ${base_name}_hist (${base_name}_hist_id , $updt_cols)VALUES (

(SELECT MAX(existing.${base_name}_hist_id) ${base_name}_hist_idFROM ${base_name}_hist existing WHERE $updt_refreshed_cond),

$updt_vals );END;EONT

⇒ ON UPDATE create history (INSERT) rows with ”OLD ” and ”NEW ”columns

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 35 / 44

Page 115: CMDB Driven by Perl - NetBSD

Tuck In! Future and Past

Hard work (continued) - UPDATE

my $updt_trgr = <<EONT;CREATE TRIGGER updt_${base_name}_row AFTER UPDATE ON ${base_name}_tBEGIN

INSERT OR REPLACE INTO ${base_name}_hist (${base_name}_hist_id , $updt_cols)VALUES (

(SELECT MAX(existing.${base_name}_hist_id) ${base_name}_hist_idFROM ${base_name}_hist existing WHERE $updt_refreshed_cond),

$updt_vals );END;EONT

⇒ ON UPDATE create history (INSERT) rows with ”OLD ” and ”NEW ”columnsexcept nothing changes (REPLACE)

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 35 / 44

Page 116: CMDB Driven by Perl - NetBSD

Tuck In! Features

”UPSERT”

MERGE INTO tablename USING table_reference ON (condition)WHEN MATCHED THENUPDATE SET column1 = value1 [, column2 = value2 ...]WHEN NOT MATCHED THENINSERT (column1 [, column2 ...]) VALUES (value1 [, value2 ...]);

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 36 / 44

Page 117: CMDB Driven by Perl - NetBSD

Tuck In! Features

”UPSERT”

MERGE INTO tablename USING table_reference ON (condition)WHEN MATCHED THENUPDATE SET column1 = value1 [, column2 = value2 ...]WHEN NOT MATCHED THENINSERT (column1 [, column2 ...]) VALUES (value1 [, value2 ...]);

SQLiteUnsupported by SQLite

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 36 / 44

Page 118: CMDB Driven by Perl - NetBSD

Tuck In! Features

”UPSERT”

MERGE INTO tablename USING table_reference ON (condition)WHEN MATCHED THENUPDATE SET column1 = value1 [, column2 = value2 ...]WHEN NOT MATCHED THENINSERT (column1 [, column2 ...]) VALUES (value1 [, value2 ...]);

SQLiteUnsupported by SQLite

INSERT OR REPLACE deletes before insert

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 36 / 44

Page 119: CMDB Driven by Perl - NetBSD

Tuck In! Features

”UPSERT”

MERGE INTO tablename USING table_reference ON (condition)WHEN MATCHED THENUPDATE SET column1 = value1 [, column2 = value2 ...]WHEN NOT MATCHED THENINSERT (column1 [, column2 ...]) VALUES (value1 [, value2 ...]);

SQLiteUnsupported by SQLite

INSERT OR REPLACE deletes before insert

→ Kills UPDATE Trigger

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 36 / 44

Page 120: CMDB Driven by Perl - NetBSD

Tuck In! Features

Perl helps out

$self ->cmdb ->upsert( customer_t => {customer_name => "Foo Enterprises", });

$self ->cmdb ->upsert( vpn_link_t => {customer_name => "Foo Enterprises",vpn_link_type => "Juniper",customer_net => "10.116.47.8/29",services_net => "10.126.47.8/29" } );

SQL created . . .

INSERT OR IGNORE INTO vpn_link_t (customer_id , vpn_link_type , customer_net , services_net , modified_by

) VALUES ((SELECT customer_id FROM customer_t WHERE customer_name =?),?, ?, ?, ?);

UPDATE vpn_link_t SET vpn_link_type =?, customer_net=?, services_net=?,modified_by =?, touched_at=CURRENT_TIMESTAMP

WHERE changes ()=0 AND customer_id =(SELECT customer_id FROM customer_t WHERE customer_name =?);

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 37 / 44

Page 121: CMDB Driven by Perl - NetBSD

Tuck In! Features

Known limitationsRestricted to CMDB

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 38 / 44

Page 122: CMDB Driven by Perl - NetBSD

Tuck In! Features

Known limitationsRestricted to CMDB

Refuse updates of identifying columns (UNIQUE constraints)

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 38 / 44

Page 123: CMDB Driven by Perl - NetBSD

Tuck In! Features

Known limitationsRestricted to CMDB

Refuse updates of identifying columns (UNIQUE constraints)

WHERE clause derived from UNIQUE constraints

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 38 / 44

Page 124: CMDB Driven by Perl - NetBSD

Tuck In! Meanwhile II

CMDB to Hiera

YAML GeneratorDevelopment team read via RESTful API the theoretical configuration set

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 39 / 44

Page 125: CMDB Driven by Perl - NetBSD

Tuck In! Meanwhile II

CMDB to Hiera

YAML GeneratorDevelopment team read via RESTful API the theoretical configuration set

Hiera YAML files are written

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 39 / 44

Page 126: CMDB Driven by Perl - NetBSD

Tuck In! Meanwhile II

CMDB to Hiera

YAML GeneratorDevelopment team read via RESTful API the theoretical configuration set

Hiera YAML files are written

Additional exports are managed via Hiera

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 39 / 44

Page 127: CMDB Driven by Perl - NetBSD

Tuck In! Meanwhile II

CMDB to Hiera

YAML GeneratorDevelopment team read via RESTful API the theoretical configuration set

Hiera YAML files are written

Additional exports are managed via Hiera

Puppet classes are rewritten to understand new ER model

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 39 / 44

Page 128: CMDB Driven by Perl - NetBSD

Overview

Part IV

Finish

6 Goals reachedCircle closed

7 Conclusion

8 Thank youThank you

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 40 / 44

Page 129: CMDB Driven by Perl - NetBSD

Goals reached Circle closed

Circle closed

:platform

:snapshot

:scan db:cmdb

:hiera

:report

collect

scan

process-scan

yaml-gen

puppet run

CRQ

export

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 41 / 44

Page 130: CMDB Driven by Perl - NetBSD

Goals reached Circle closed

Circle closed

:platform

:snapshot

:scan db:cmdb

:hiera

:report

collect

scan

process-scan

yaml-gen

puppet run

CRQ

export

scan

process-scan

yaml-gen

CRQ

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 41 / 44

Page 131: CMDB Driven by Perl - NetBSD

Goals reached Circle closed

Goals reached→ Actual-theoretical comparison done via processing scan database

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 42 / 44

Page 132: CMDB Driven by Perl - NetBSD

Goals reached Circle closed

Goals reached→ Actual-theoretical comparison done via processing scan database

→ Unmaintainted installation via cronjob possible

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 42 / 44

Page 133: CMDB Driven by Perl - NetBSD

Goals reached Circle closed

Goals reached→ Actual-theoretical comparison done via processing scan database

→ Unmaintainted installation via cronjob possible

→ Reaction in emergency cases by organized component moving done multipletimes

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 42 / 44

Page 134: CMDB Driven by Perl - NetBSD

Goals reached Circle closed

Goals reached→ Actual-theoretical comparison done via processing scan database

→ Unmaintainted installation via cronjob possible

→ Reaction in emergency cases by organized component moving done multipletimes

→ Monitoring, sensors, alarming open

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 42 / 44

Page 135: CMDB Driven by Perl - NetBSD

Conclusion

Conclusion

Can a programming language save a lifeYes, it can - but here it saves our business

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 43 / 44

Page 136: CMDB Driven by Perl - NetBSD

Thank you Thank you

Thank You For Listening

Questions?Jens Rehsack <[email protected]>Cologne

Jens Rehsack (Niederrhein.PM) CMDB Driven by Perl The Perl Conference in Amsterdam 44 / 44