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
85
0
Share
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
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
110
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
95
The Field Guide to Understanding Declarative Systems
devopspro
0
91
How we learned to love the Data Center Operating System
devopspro
0
240
DevOps is the answer! What was the question again?
devopspro
0
160
Other Decks in Technology
See All in Technology
Keeping Ruby Running on Cygwin
fd0
0
180
国内外の生成AIセキュリティの最新動向 & AIガードレール製品「chakoshi」のご紹介 / Latest Trends in Generative AI Security (Domestic & International) & Introduction to AI Guardrail Product "chakoshi"
nttcom
4
1.5k
"おまじない"を卒業する ボイラープレート再入門
shunsuke_1b
1
120
データ定義の混乱と戦う 〜 管理会計と財務会計 〜
wonohe
0
150
独断と偏見で試してみる、 シングル or マルチエージェント どっちがいいの?
shichijoyuhi
1
170
PicoRuby as a Multi-VM Operating System
kishima
1
220
AgentCore×VPCでの設計パターンn選と勘所
har1101
4
340
「責任あるAIエージェント」こそ自社で開発しよう!
minorun365
10
2.3k
データを"持てない"環境でのアノテーション基盤設計
sansantech
PRO
1
150
Pure Intonation on Browser: Building a Sequencer with Ruby
nagachika
0
170
運用システムにおけるデータ活用とPlatform
sansantech
PRO
0
130
20260428_Product Management Summit_tadokoroyoshiro
tadokoro_yoshiro
14
15k
Featured
See All Featured
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
460
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.2k
Skip the Path - Find Your Career Trail
mkilby
1
110
A better future with KSS
kneath
240
18k
A Tale of Four Properties
chriscoyier
163
24k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
110
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
64
54k
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.5k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
220
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
65
55k
Evolving SEO for Evolving Search Engines
ryanjones
0
180
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.6k
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