Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Does your configuration code smell?
Search
DevOps Pro
June 01, 2016
Technology
99
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Does your configuration code smell?
by Tushar Sharma
DevOps Pro Vilnius 2016
DevOps Pro
June 01, 2016
More Decks by DevOps Pro
See All by DevOps Pro
Practical Application Logging and Monitoring
devopspro
0
130
Google Cloud Platform for DevOps Professionals
devopspro
0
310
Dev vs Ops transformation to Agility DevOps culture
devopspro
1
260
Using Test Automation for Continuous Integration, Delivery and Quality
devopspro
0
120
How the hell do I run my microservices in production, and will it scale?
devopspro
0
140
Accelerating innovation through AWS Cloud technology
devopspro
0
110
The Field Guide to Understanding Declarative Systems
devopspro
0
110
How we learned to love the Data Center Operating System
devopspro
0
260
DevOps is the answer! What was the question again?
devopspro
0
170
Other Decks in Technology
See All in Technology
ADKで始める業務改善 - AIエージェント開発時の考えと設計
harappa80
2
280
AgentCore Runtime上にAgentic Coding基盤を構築・展開する際の設計ポイントと限界点 / Design considerations and limitations when building an agentic coding platform on AgentCore Runtime
har1101
5
710
AIエージェントの自己改善をどう設計するか / How to Design Self-Improvement for AI Agents
22mi
26
17k
バイブコーディング時代のWebアプリ開発入門~Cloud Runで学ぶセキュアなビルドとデプロイ
waiwai2111
1
150
LLMに渡さなかった仕事
nanaism
0
1.4k
サーバーレスをどこまで使う? WebRTC対戦ゲームで選んだVPSとの共存設計
kaidouji85
0
380
AI Agent入門〜今更聞けないAgentの話〜
hiromimaganuma
0
110
ほんとうの信頼性はヒーローが死んでからはじまる / True reliability begins after the hero dies
vtryo
0
120
特殊変数大全
dak2
0
110
What the customer really needed
kawaguti
PRO
3
220
SREへの勘違いに気づいた後の話
tomodakengo
0
150
Issue 駆動でスペシャリストの意図を届ける、AI 実装のアクセシビリティ向上
thkt
0
140
Featured
See All Featured
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.6k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.6k
Code Review Best Practice
trishagee
74
20k
Documentation Writing (for coders)
carmenintech
77
5.5k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
340
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
203
76k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
530
Abbi's Birthday
coloredviolet
4
10k
sira's awesome portfolio website redesign presentation
elsirapls
0
420
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
Scaling GitHub
holman
464
140k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
Transcript
Does Your Configuration Code Smell? Tushar Sharma
“Smells” Code Smell …certain structures in the code that suggest
(sometimes they scream for) the possibility of refactoring.
None
“Smells” Design Smells “Design smells are certain structures in the
design that indicate violation of fundamental design principles and negatively impact design quality.”
“Smells” Configuration Smells
“Infrastructure as Code” (IaC)
Puppet example package { 'apache2': require => Exec['apt-update'], ensure =>
installed, } service { 'apache2': ensure => running, } user { 'tushar': ensure => present, uid => '1000', gid => '1000', shell => '/bin/bash', home => '/home/tushar' } Configuration management tools: Ansible, Chef, CFEngine, Puppet
Software System IaC and Traditional SE Production code Infrastructure, configuration
code, tools and services Apply traditional software engineering practices
Configuration smells “Configuration smells are the characteristics of a configuration
program or script that violate the recommended best practices and potentially affect the program’s quality in a negative way.”
Implementation configuration smells
Implementation configuration smells import 'classes/*' # TODO: fix deprecated statement
class app-studio (String $version = ‘latest') { $primary_config_file = 'config' $source_config = 'config.source' if $version == ’44’ or $version == ‘4.2’ or $version != ‘4.5’ or $version == ‘4.9’{ case $::operatingsystem { 'debian': { apt::source { 'packages.dotdeb.org-repo.app': location => 'http://repo.app.com/dotdeb/', release => $::lsbdistcodename, repos => 'all', include_src => true include_src => true } } Deprecated Statement Usage
Implementation configuration smells import 'classes/*' # TODO: fix deprecated statement
class app-studio (String $version = ‘latest') { $primary_config_file = 'config' $source_config = 'config.source' if $version == ’44’ or $version == ‘4.2’ or $version != ‘4.5’ or $version == ‘4.9’{ case $::operatingsystem { 'debian': { apt::source { 'packages.dotdeb.org-repo.app': location => 'http://repo.app.com/dotdeb/', release => $::lsbdistcodename, repos => 'all', include_src => true include_src => true } } Incomplete Task
Implementation configuration smells import 'classes/*' # TODO: fix deprecated statement
class app-studio (String $version = ‘latest') { $primary_config_file = 'config' $source_config = 'config.source' if $version == ’44’ or $version == ‘4.2’ or $version != ‘4.5’ or $version == ‘4.9’{ case $::operatingsystem { 'debian': { apt::source { 'packages.dotdeb.org-repo.app': location => 'http://repo.app.com/dotdeb/', release => $::lsbdistcodename, repos => 'all', include_src => true include_src => true } } Long Statement Complex Expression
Implementation configuration smells import 'classes/*' # TODO: fix deprecated statement
class app-studio (String $version = ‘latest') { $primary_config_file = 'config' $source_config = 'config.source' if $version == ’44’ or $version == ‘4.2’ or $version != ‘4.5’ or $version == ‘4.9’{ case $::operatingsystem { 'debian': { apt::source { 'packages.dotdeb.org-repo.app': location => 'http://repo.app.com/dotdeb/', release => $::lsbdistcodename, repos => 'all', include_src => true include_src => true } } Missing Default Case
Implementation configuration smells import 'classes/*' # TODO: fix deprecated statement
class app-studio (String $version = ‘latest') { $primary_config_file = 'config' $source_config = 'config.source' if $version == ’44’ or $version == ‘4.2’ or $version != ‘4.5’ or $version == ‘4.9’{ case $::operatingsystem { 'debian': { apt::source { 'packages.dotdeb.org-repo.app': location => 'http://repo.app.com/dotdeb/', release => $::lsbdistcodename, repos => 'all', include_src => true include_src => true } } Duplicate Entity
Implementation configuration smells elsif $version in ['33', '3.3'] { }
if $::kernelversion =~ /^(2.2)/ { $appversion = '3.5' } elsif $::kernelversion =~ /^(2.1)/ { exec {"download_app_studio": command => "wget $url", timeout => 0, } } $version = '3.4' ? {undef => $primary_config_file, default => $source_config} file { "/root/.app": mode => '644', ensure => present } } Missing Conditional
Implementation configuration smells elsif $version in ['33', '3.3'] { }
if $::kernelversion =~ /^(2.2)/ { $appversion = '3.5' } elsif $::kernelversion =~ /^(2.1)/ { exec {"download_app_studio": command => "wget $url", timeout => 0, } } $version = '3.4' ? {undef => $primary_config_file, default => $source_config} file { "/root/.app": mode => '644', ensure => present } } Improper Quote Usage
Implementation configuration smells elsif $version in ['33', '3.3'] { }
if $::kernelversion =~ /^(2.2)/ { $appversion = '3.5' } elsif $::kernelversion =~ /^(2.1)/ { exec {"download_app_studio": command => "wget $url", timeout => 0, } } $version = '3.4' ? {undef => $primary_config_file, default => $source_config} file { "/root/.app": mode => '644', ensure => present } } Unguarded Variable
Implementation configuration smells elsif $version in ['33', '3.3'] { }
if $::kernelversion =~ /^(2.2)/ { $appversion = '3.5' } elsif $::kernelversion =~ /^(2.1)/ { exec {"download_app_studio": command => "wget $url", timeout => 0, } } $version = '3.4' ? {undef => $primary_config_file, default => $source_config} file { "/root/.app": mode => '644', ensure => present } } Improper Alignment
Implementation configuration smells elsif $version in ['33', '3.3'] { }
if $::kernelversion =~ /^(2.2)/ { $appversion = '3.5' } elsif $::kernelversion =~ /^(2.1)/ { exec {"download_app_studio": command => "wget $url", timeout => 0, } } $version = '3.4' ? {undef => $primary_config_file, default => $source_config} file { "/root/.app": mode => '644', ensure => present } } Invalid Property Value
Implementation configuration smells elsif $version in ['33', '3.3'] { }
if $::kernelversion =~ /^(2.2)/ { $appversion = '3.5' } elsif $::kernelversion =~ /^(2.1)/ { exec {"download_app_studio": command => "wget $url", timeout => 0, } } $version = '3.4' ? {undef => $primary_config_file, default => $source_config} file { "/root/.app": mode => '644', ensure => present } } Misplaced Attribute
Design configuration smells
class package::web { … } class package::mail { … }
class package::environment { … } class package::user { … } package.pp
class apache { package { 'apache2': … } service {
'apache2': … } service { 'mysql': … } package { 'php5': … } file { ‘/etc/apache2/ports.conf': … } user { ‘mitchell': … } } apache.pp
Multifaceted Abstraction • Each abstraction should be designed to
specify the properties of a single piece of software.
class web { } init.pp
Unnecessary Abstraction A class, ‘define’, or module must contain declarations
or statements specifying the properties of a desired system.
class web { exec { ‘hadoop-yarn’: … } exec {
‘apache-util-set’: … } exec { ‘smail-invoke’: … } exec { ‘postfix-set’: … } } init.pp
Imperative Abstraction An abstraction containing numerous imperative statements suffers from
imperative abstraction smell.
package { 'apache2': … } service { 'apache2': … }
service { 'mysql': … } package { 'php5': … } file { ‘/etc/apache2/ports.conf': … } user { ‘mitchell': … } init.pp
Missing Abstraction A module suffers from the missing abstraction smell
when resources and language elements are declared and used without encapsulating them in an abstraction.
class apache { package { 'apache2': … } service {
'apache2': … } file { ‘/etc/apache2/ports.conf': … } … } web.pp class apache { package { 'apache2': … } service { 'apache2': … } file { ‘/etc/apache2/ports.conf': … } … } server.pp
Duplicate Block A duplicate block of statements more than a
threshold indicates that probably a suitable abstraction definition is missing.
package { 'apache2': … } service { 'apache2': … }
service { 'mysql': … } package { 'php5': … } file { ‘/etc/apache2/ports.conf': … } user { ‘mitchell': … } package { 'apache2': … } service { 'apache2': … } service { 'mysql': … } package { 'php5': … } file { ‘/etc/apache2/ports.conf': … } user { ‘mitchell': … } package { 'apache2': … } service { 'apache2': … } service { 'mysql': … } package { 'php5': … } file { ‘/etc/apache2/ports.conf': … } user { ‘mitchell': … } init.pp
Insufficient Modularisation An abstraction suffers from this smell when it
is large or complex and thus can be modularized further.
None
Unstructured Module Each module in a configuration repository must have
a well-defined and consistent module structure. RepoName Manifests Modules README … Apache Adobe … files lib manifests spec templates tests README …
None
Dense Structure This smell arises when a configuration code repository
has excessive and dense dependencies.
None
Weekend Modularity This smell arises when a module exhibits high
coupling and low cohesion. Modularity ratio (A) = Cohesion(A) Coupling(A)
Implications of smells The straw that broke the camel's back
Detecting configuration smells Implementation configuration smells • Puppet-lint [1] •
Additional custom rules in Puppeteer Design configuration smells • Puppeteer [2] — an open source tool 1. http://puppet-lint.com/ 2. https://github.com/tushartushar/Puppeteer
Mining GitHub Repositories Repositories 4,621 Puppet files 142,662 Class declarations
132,323 Define declarations 39,263 File resources 117,286 Package resources 49,841 Service resources 18,737 Exec declarations 43,468 Lines of code (Puppet only) 8,948,611 http://www.tusharma.in/research/does-your-configuration-code-smell-msr-2016/
Let us summarize M E L S U P E
E R I I P T U I N M Y I I A A B N C
Let us summarize M E L S U P E
E R I I P T U I A N M Y I I A A B N C
Let us summarize S M E L S U P
E E R L I I P T U I A N M Y I I A A B N C
Let us summarize S M E L S U P
P E E R L I I P T U I A N M Y I I T A A B N C
Thank you!! Courtesy: spikedmath.com Tushar Sharma
[email protected]
@Sharma__Tushar