Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Does your configuration code smell?
Search
DevOps Pro
June 01, 2016
Technology
0
82
Does your configuration code smell?
by Tushar Sharma
DevOps Pro Vilnius 2016
DevOps Pro
June 01, 2016
Tweet
Share
More Decks by DevOps Pro
See All by DevOps Pro
Practical Application Logging and Monitoring
devopspro
0
110
Google Cloud Platform for DevOps Professionals
devopspro
0
300
Dev vs Ops transformation to Agility DevOps culture
devopspro
1
240
Using Test Automation for Continuous Integration, Delivery and Quality
devopspro
0
100
How the hell do I run my microservices in production, and will it scale?
devopspro
0
130
Accelerating innovation through AWS Cloud technology
devopspro
0
92
The Field Guide to Understanding Declarative Systems
devopspro
0
86
How we learned to love the Data Center Operating System
devopspro
0
230
DevOps is the answer! What was the question again?
devopspro
0
160
Other Decks in Technology
See All in Technology
フィッシュボウルのやり方 / How to do a fishbowl
pauli
2
400
意外と知らない状態遷移テストの世界
nihonbuson
PRO
1
290
Strands Agents × インタリーブ思考 で変わるAIエージェント設計 / Strands Agents x Interleaved Thinking AI Agents
takanorig
5
2.2k
松尾研LLM講座2025 応用編Day3「軽量化」 講義資料
aratako
11
4.4k
投資戦略を量産せよ 2 - マケデコセミナー(2025/12/26)
gamella
0
470
100以上の新規コネクタ提供を可能にしたアーキテクチャ
ooyukioo
0
270
モダンデータスタックの理想と現実の間で~1.3億人Vポイントデータ基盤の現在地とこれから~
taromatsui_cccmkhd
2
270
[Neurogica] 採用ポジション/ Recruitment Position
neurogica
1
130
AWS re:Invent 2025~初参加の成果と学び~
kubomasataka
1
200
『君の名は』と聞く君の名は。 / Your name, you who asks for mine.
nttcom
1
120
Claude Codeを使った情報整理術
knishioka
13
9.8k
AWSインフルエンサーへの道 / load of AWS Influencer
whisaiyo
0
230
Featured
See All Featured
SEO for Brand Visibility & Recognition
aleyda
0
4.1k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
680
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
170
Music & Morning Musume
bryan
46
7k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
196
70k
Context Engineering - Making Every Token Count
addyosmani
9
560
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
0
22
Reflections from 52 weeks, 52 projects
jeffersonlam
355
21k
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
31
Facilitating Awesome Meetings
lara
57
6.7k
Visualization
eitanlees
150
16k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
0
3.4k
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