SlideShare a Scribd company logo
1 of 38
Puppet	
  at	
  Bazaarvoice	
  
Hi,	
  my	
  name	
  is	
  Dave.	
  
•  DevOps	
  Engineer	
  at	
  Bazaarvoice.	
  
•  Started	
  working	
  with	
  puppet	
  in	
  2008	
  while	
  working	
  at	
  
Bioware.	
  	
  First	
  version	
  was	
  0.24.	
  
•  At	
  Bioware,	
  puppet	
  configured	
  over	
  14k	
  nodes	
  that	
  
comprised	
  of	
  web	
  servers,	
  databases	
  and	
  game	
  
servers.	
  
•  All	
  5	
  datacenters	
  (in	
  California,	
  Virginia,	
  Ireland,	
  
Australia	
  and	
  Texas)	
  housed	
  puppet	
  managed	
  nodes	
  
that	
  all	
  reported	
  back	
  to	
  a	
  centralized	
  puppet	
  
dashboard.	
  
•  My	
  contact	
  info:	
  
–  hTp://www.linkedin.com/in/jamesbarcelo	
  
Bazaarvoice	
  Plug	
  
•  We	
  do	
  embedded	
  DevOps!	
  
•  ApplicaYon	
  teams	
  are	
  responsible	
  for	
  their	
  
applicaYon’s	
  operaYonal	
  success.	
  	
  No	
  centralized	
  
operaYons!	
  
•  2.0	
  stack	
  is	
  100%	
  in	
  Amazon!	
  
•  Conferences!	
  
•  Work	
  on	
  awesome	
  projects	
  with	
  spiffy	
  tech	
  like	
  
Cassandra	
  or	
  ElasYcSearch.	
  
•  Send	
  me	
  your	
  resume!	
  	
  
Dave.barcelo@bazzarvoice.com	
  
Preview	
  presentaYon	
  
•  Puppet	
  in	
  the	
  legacy	
  stack.	
  
•  Puppet	
  in	
  the	
  Data	
  Infrastructure	
  Team.	
  
– Focus	
  on	
  client/server.	
  
•  Puppet	
  in	
  the	
  Data	
  Services	
  Team.	
  
– Focus	
  on	
  masterless	
  puppet.	
  
Puppet	
  in	
  the	
  Legacy	
  Infrastructure	
  
•  TradiYonal	
  puppet	
  use	
  with	
  client/server.	
  
•  MulYple	
  levels	
  of	
  inheritance	
  using	
  node	
  
inheritance.	
  
•  Puppet	
  managed	
  instances	
  are	
  configured	
  
according	
  to	
  DNS	
  naming	
  convenYon:	
  
	
  
node	
  /my-­‐hostname/	
  {	
  
	
  	
  …	
  
	
  	
  …	
  
}	
  
•  Some	
  issues	
  encountered:	
  
– Very	
  hard	
  to	
  work	
  with.	
  	
  Very	
  complex.	
  
– Large	
  codebase.	
  	
  Adds	
  to	
  complexity.	
  	
  MulYple	
  
teams	
  working	
  with	
  same	
  code	
  base.	
  	
  	
  
– No	
  confidence	
  in	
  making	
  changes.	
  	
  Side	
  effects	
  
feared	
  ader	
  code	
  change.	
  A	
  jinga	
  tower	
  of	
  puppet	
  
code.	
  
– Too	
  many	
  pivot	
  points.	
  	
  Many	
  places	
  to	
  configure.	
  	
  
Adds	
  to	
  complexity.	
  
– Lots	
  of	
  code	
  rot.	
  	
  Had	
  not	
  been	
  refactored.	
  
Puppet	
  master/client	
  in	
  Data	
  
Infrastructure	
  teams	
  
Architecture	
  
•  Each	
  server	
  type	
  we	
  care	
  about	
  will	
  be	
  referenced	
  by	
  
its	
  role.	
  	
  We	
  only	
  care	
  about	
  roles,	
  not	
  hostnames.	
  
•  Centered	
  around	
  an	
  uber	
  IT	
  tools	
  server	
  that	
  runs	
  
everything	
  ops	
  (including	
  puppet)	
  to	
  do	
  work	
  in	
  an	
  
environment.	
  	
  The	
  Mothership.	
  
•  Hiera	
  and	
  parameterized	
  classes	
  will	
  be	
  used	
  to	
  create	
  
generic	
  puppet	
  modules	
  that	
  can	
  be	
  reused	
  for	
  
different	
  roles.	
  
•  Development	
  will	
  be	
  centered	
  on	
  using	
  puppet	
  
environments	
  on	
  the	
  Mothership	
  to	
  protect	
  devs	
  from	
  
stepping	
  on	
  each	
  other.	
  	
  
Mothership	
  
•  Contains	
  a	
  cocktail	
  of	
  different	
  applicaYon	
  tools	
  
for	
  doing	
  work	
  in	
  the	
  environment.	
  	
  Tools	
  
included:	
  
–  McollecYve/AcYveMQ	
  
–  Puppet	
  server	
  
–  Puppet	
  managed	
  operaYon	
  scripts.	
  
•  Motherships	
  configured	
  to	
  be	
  highly	
  available	
  in	
  
regular	
  AWS	
  fashion(Autoscaling,	
  cluster	
  mulYple	
  
acYveMQ,	
  etc).	
  
•  AdverYses	
  mulYple	
  puppet	
  environments	
  that	
  
clients	
  can	
  switch	
  between	
  via	
  –environments.	
  
What	
  is	
  a	
  Universe?	
  
Anatomy	
  of	
  a	
  Mothership	
  
Methods	
  of	
  passing	
  in	
  data	
  
Gejng	
  environment	
  data	
  into	
  puppet	
  
configuraYon.	
  	
  
•  Hiera	
  datastore.	
  
•  Puppet	
  stdlib/tags.txt	
  
•  Cloud	
  formaYon	
  parameters	
  –	
  Universe,	
  VPC	
  
Puppet	
  Stdlib/facts.d	
  	
  
•  	
  Bootstrap	
  process	
  (EC2	
  user	
  data)	
  populates	
  /
etc/facter/facts.d/tags.txt	
  with	
  mappings.	
  	
  These	
  
mappings	
  become	
  facters.	
  
•  Example	
  of	
  data	
  in	
  tags.txt:	
  
–  Universe	
  value.	
  
–  Ec2	
  metadata.	
  
/etc/facter/facts.d/tags.txt:	
  
universe=dev	
  
Tag_region=us-­‐east-­‐1	
  
Hiera	
  datastore	
  
•  Hiera	
  is	
  used	
  extensively	
  where	
  different	
  data	
  
needs	
  to	
  be	
  passed	
  into	
  puppet	
  according	
  to	
  
context.	
  	
  Different	
  contexts	
  would	
  include:	
  
– Amazon	
  region.	
  
– Instance	
  role.	
  
– Universe.	
  
•  Example	
  usage:	
  
$app_version	
  =	
  hiera(‘app_version’,	
  nil)	
  
/etc/hiera.yaml	
  
-­‐-­‐	
  
:logger:	
  console	
  
	
  
:hierarchy:	
  	
  
	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  -­‐	
  %{fqdn}	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  -­‐	
  10-­‐team/%{team}/10-­‐region/%{tag_region}/10-­‐universe/%{universe}/10-­‐roles/%{role}	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  -­‐	
  10-­‐team/%{team}/10-­‐region/%{tag_region}/10-­‐universe/%{universe}/20-­‐common	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  -­‐	
  10-­‐team/%{team}/10-­‐region/%{tag_region}/20-­‐roles/%{role}	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  -­‐	
  10-­‐team/%{team}/10-­‐region/%{tag_region}/30-­‐common	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  -­‐	
  10-­‐team/%{team}/20-­‐universe/%{universe}/10-­‐roles/%{role}	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  -­‐	
  10-­‐team/%{team}/20-­‐universe/%{universe}/20-­‐common	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  -­‐	
  10-­‐team/%{team}/30-­‐roles/%{role}	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  -­‐	
  10-­‐team/%{team}/40-­‐common	
  
	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  -­‐	
  40-­‐common	
  
	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  -­‐	
  environments	
  
	
  
:backends:	
  -­‐	
  yaml	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  -­‐	
  json	
  
	
  
:yaml:	
  
	
  	
  :datadir:	
  /etc/puppet_env/%{environment}/manifests/hieradata	
  
	
  
:json:	
  
	
  	
  :datadir:	
  /etc/puppet/env/global_hieradata	
  
Puppet	
  Environments/Universe	
  
Mothership	
  ExecuYon	
  Flow	
  
Puppet	
  code	
  on	
  the	
  Mothership	
  
•  The	
  files	
  that	
  do	
  the	
  things:	
  
– /etc/puppet/puppet.conf	
  
– /etc/puppet/env/global_hieradata/
environments.json	
  
– /etc/puppet/puppetmaster.conf	
  
– /etc/puppet_env/{puppet_env}/…	
  
•  manifests/…	
  
•  modules/…	
  
/etc/puppet/puppet.conf	
  
#	
  File	
  managed	
  by	
  Puppet.	
  
	
  
[main]	
  
	
  	
  vardir	
  =	
  /var/lib/puppet	
  
	
  	
  logdir	
  =	
  /var/log/puppet	
  
	
  	
  rundir	
  =	
  /var/run/puppet	
  
	
  	
  ssldir	
  =	
  $vardir/ssl	
  
	
  
	
  	
  usecacheonfailure	
  =	
  true	
  
	
  	
  pluginsync	
  =	
  true	
  
	
  	
  factpath	
  =	
  $vardir/lib/facter	
  
	
  	
  preferred_serializaYon_format	
  =	
  yaml	
  
	
  
[user]	
  
	
  	
  vardir	
  =	
  /var/lib/puppet	
  
	
  	
  logdir	
  =	
  /var/log/puppet	
  
	
  	
  rundir	
  =	
  /var/run/puppet	
  
	
  	
  ssldir	
  =	
  $vardir/ssl	
  
	
  
[agent]	
  
	
  	
  runinterval	
  =	
  1800	
  
	
  	
  ca_server	
  =	
  <%=	
  ca_srv	
  %>	
  
	
  	
  server	
  =	
  <%=	
  logical_srv	
  %>	
  
	
  	
  cerYficate_revocaYon	
  =	
  False	
  
	
  	
  environment	
  =	
  <%=	
  environment	
  %>	
  
	
  	
  report	
  =	
  true	
  
/etc/puppet/env/global_hieradata/
environments.json	
  
{	
  
	
  	
  "environments":	
  [	
  
	
  	
  	
  	
  {	
  
	
  	
  	
  	
  	
  	
  "cert":	
  [	
  
	
  	
  	
  	
  	
  	
  	
  	
  {	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "modulepath":	
  "/etc/puppet_env/cert/modules"	
  	
  	
  	
  	
  	
  	
  	
  },	
  
	
  	
  	
  	
  	
  	
  	
  	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "manifestdir":	
  "/etc/puppet_env/cert/manifests"	
  
	
  	
  	
  	
  	
  	
  	
  	
  },	
  
	
  	
  	
  	
  	
  	
  	
  	
  {	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "manifest":	
  "/etc/puppet_env/cert/manifests/site.pp"	
  
	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  	
  ]	
  
	
  	
  	
  	
  }	
  
}	
  
	
  
/etc/puppet/puppetmaster.conf	
  
[main]	
  
	
  	
  vardir	
  =	
  /var/lib/puppet	
  
	
  	
  logdir	
  =	
  /var/log/puppet	
  
	
  	
  rundir	
  =	
  /var/run/puppet	
  
	
  	
  ssldir	
  =	
  $vardir/ssl	
  
	
  
	
  	
  usecacheonfailure	
  =	
  true	
  
	
  	
  pluginsync	
  =	
  true	
  
	
  	
  factpath	
  =	
  $vardir/lib/facter	
  
	
  	
  preferred_serializaYon_format	
  =	
  yaml	
  
	
  	
  syslogfacility	
  =	
  local1	
  
	
  
[master]	
  
	
  	
  certname=<%=	
  certname	
  %>	
  
	
  	
  ca	
  =	
  True	
  
	
  	
  cerYficate_revocaYon=False	
  
	
  	
  dns_alt_names=<%=	
  logical_srv	
  %>	
  
	
  	
  ssl_client_header	
  =	
  SSL_CLIENT_S_DN	
  
	
  	
  ssl_client_verify_header	
  =	
  SSL_CLIENT_VERIFY	
  
	
  	
  autosign	
  =	
  true	
  
	
  
	
  	
  #	
  For	
  puppet	
  dashboard	
  reporYng.	
  
	
  	
  reports	
  =	
  store,	
  datadog_reports	
  
	
  
	
  	
  <%	
  if	
  store_configs	
  ==	
  true	
  %>	
  
	
  	
  #	
  Puppetdb.	
  
	
  	
  storeconfigs	
  =	
  true	
  
	
  	
  storeconfigs_backend	
  =	
  puppetdb	
  
	
  	
  <%	
  end	
  %>	
  
	
  
[user]	
  
	
  	
  vardir	
  =	
  /var/lib/puppet	
  
	
  	
  logdir	
  =	
  /var/log/puppet	
  
	
  	
  rundir	
  =	
  /var/run/puppet	
  
	
  	
  ssldir	
  =	
  $vardir/ssl	
  
	
  
#	
  Environments	
  
<%	
  environments.each	
  do	
  |env_val|	
  -­‐%>	
  
<%	
  env_val.keys.each	
  do	
  |env_key|	
  -­‐%>	
  
[<%=	
  env_key	
  -­‐%>]	
  
<%	
  env_val[env_key].each	
  do	
  |env_data|	
  -­‐%>	
  
<%	
  env_data.each_pair	
  do	
  |k,	
  v|	
  -­‐%>	
  
<%=	
  k	
  %>	
  =	
  <%=	
  v	
  -­‐%>	
  
<%	
  end	
  %>	
  
<%	
  end	
  %>	
  
<%	
  end	
  %>	
  
<%	
  end	
  %>	
  
	
  
/etc/puppet_env/{env}/manifests/
site.pp	
  
import	
  'roles/*.pp'	
  
	
  
node	
  default	
  {	
  
	
  	
  	
  	
  class	
  {	
  'basenode_role':	
  }	
  
	
  
	
  	
  	
  	
  class	
  {	
  "$tag_role":	
  }	
  
}	
  
	
  
/etc/puppet_env/{env}/manifests/
role/00_basenode.pp	
  
class	
  basenode_role	
  {	
  
	
  	
  class	
  {	
  ‘security’:	
  }	
  
	
  	
  class	
  {	
  ‘monitoring’:	
  }	
  
	
  	
  …..	
  
}	
  
/etc/puppet_env/{env}/manifests/
role/mothership_role.pp	
  
class	
  mothership_role	
  {	
  
	
  
	
  	
  class	
  {	
  'puppet':	
  
	
  	
  	
  	
  master	
  =>	
  true,	
  
	
  	
  	
  	
  ca_srv	
  =>	
  $tag_caserver,	
  
	
  	
  	
  	
  logical_srv	
  =>	
  $tag_puppet_server,	
  
	
  	
  }	
  
	
  
}	
  
Mothership	
  Dev	
  Workflow	
  
Masterless	
  Puppet	
  in	
  Data	
  Services	
  
Teams	
  
Architecture	
  
SYll	
  keeping	
  bits	
  of	
  the	
  Mothership	
  project:	
  
•  ApplicaYons/Services	
  scoped	
  in	
  zookeeper	
  by	
  
Universe.	
  
•  Emphasis	
  is	
  put	
  on	
  making	
  things	
  simpler.	
  	
  
Puppet	
  code	
  will	
  not	
  be	
  monolithic.	
  	
  Individual	
  
applicaYon	
  teams	
  will	
  only	
  need	
  to	
  maintain	
  
there	
  own	
  modules/manifests.	
  
•  Changes	
  to	
  modules/manifests	
  will	
  not	
  impact	
  
other	
  teams.	
  
	
  
Methods	
  of	
  passing	
  in	
  data	
  
•  The	
  usual	
  suspects:	
  
– Puppet	
  stdlib/tags.txt.	
  
– Hiera.	
  
– Cloud	
  formaYon	
  parameters	
  –	
  Universe,	
  VPC	
  
•  Some	
  new	
  ones:	
  
– EC2	
  data/metadata	
  -­‐>	
  facter.	
  
– Zookeeper.	
  
– Cloud	
  	
  formaYon	
  parameters	
  -­‐	
  DeployTag	
  
getEC2data_cache.rb	
  
•  Script	
  runs	
  out	
  of	
  /etc/facts.d	
  that	
  converts	
  
EC2	
  data/metadata	
  into	
  facts.	
  
Zookeeper/Ostrich	
  
•  Custom	
  funcYons	
  to	
  pull	
  data	
  from	
  zookeeper	
  
the	
  same	
  way	
  applicaYons	
  do	
  discovery.	
  
Masterless	
  ExecuYon	
  Flow	
  
Puppet	
  code	
  in	
  Masterless	
  
•  No	
  more	
  Mothership.	
  	
  All	
  work	
  is	
  done	
  via	
  
puppet	
  apply.	
  
– /etc/hiera.yaml	
  
– /etc/puppet/manifests/{role}.pp	
  
– /etc/puppet/manifests/00_common.pp	
  
– /etc/puppet/manifests/01_users.pp	
  
– /etc/puppet/modules/…	
  
/etc/hiera.yaml	
  
-­‐-­‐	
  
:logger:	
  console	
  
	
  
:hierarchy:	
  -­‐	
  %{fqdn}	
  
	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  -­‐	
  10-­‐universe/%{universe}/10-­‐roles/%{role}	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  -­‐	
  10-­‐universe/%{universe}/20-­‐common	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  -­‐	
  20-­‐roles/%{role}	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  -­‐	
  30-­‐common	
  
	
  
:backends:	
  -­‐	
  yaml	
  
	
  
:yaml:	
  
	
  	
  :datadir:	
  /etc/puppet/manifests/hieradata	
  
/etc/puppet/manifests/{role}.pp	
  
import	
  '00_common'	
  
	
  
node	
  default	
  {	
  
	
  
	
  	
  #	
  This	
  class	
  contains	
  common	
  modules	
  that	
  should	
  be	
  used	
  by	
  all	
  roles.	
  
	
  	
  class	
  {	
  'common':	
  }	
  
	
  
	
  	
  
	
  	
  class	
  {	
  'acYvemq’:	
  }	
  
	
  	
  -­‐>	
  
	
  	
  class	
  {	
  'mcollecYve':	
  
	
  	
  	
  	
  server	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  =>	
  true,	
  
	
  	
  	
  	
  client	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  =>	
  true,	
  
	
  	
  }	
  
	
  
}	
  
/etc/puppet/manifests/
00_common.pp	
  
import	
  '01_users'	
  
#####################################	
  
#	
  Common	
  
#####################################	
  
	
  
	
  
class	
  common	
  {	
  
	
  
	
  	
  	
  	
  class	
  {	
  'stdlib':	
  }	
  
	
  
	
  	
  	
  	
  
	
  	
  	
  	
  file	
  {	
  '/opt/bazaarvoice':	
  ensure	
  =>	
  directory,	
  }	
  
	
  
	
  	
  	
  	
  #	
  Authorized	
  keys	
  for	
  project	
  developers.	
  
	
  	
  	
  	
  class	
  {	
  'user_setup':	
  stage	
  =>	
  setup,	
  }	
  
	
  
host	
  {	
  'internal_ip':	
  
	
  	
  	
  	
  	
  	
  	
  	
  ensure	
  =>	
  'present',	
  
	
  	
  	
  	
  	
  	
  	
  	
  name	
  =>	
  $fqdn,	
  
	
  	
  	
  	
  	
  	
  	
  	
  ip	
  =>	
  $ipaddress,	
  
	
  	
  	
  	
  }	
  
	
  
	
  	
  	
  	
  class	
  {	
  'prompt':	
  }	
  
}	
  
/etc/puppet/manifests/01_users.pp	
  
class	
  user_setup	
  {	
  
	
  
	
  	
  	
  	
  include	
  users	
  
	
  
	
  	
  	
  	
  users::user	
  {	
  'dbarcelo':	
  
	
  	
  	
  	
  	
  	
  groups	
  =>	
  'wheel',	
  
	
  	
  	
  	
  	
  	
  sshKey	
  =>	
  'ssh-­‐dss	
  AAAAB3NzaC1kc3MAAACBANL1zoZdYJp/6vQ4G5iNQXjdJ7NGmK0J2eqHbztvuD0CBPyqMuEtuYKRg14tFd4iwp5EpnT4UWpv8kXF/
dkEN3b5xgN/R+1hYq7/3mnRLchMFTl0tyryLuARC9zTI003mQrXd/
W9jzXaNlCTpxh8Ihj2Ov3lvAAX65tN9nijxhCTAAAAFQCgMU0obmTLo5CRYtRwDCkj1mb2hQAAAIAiZF9axkCvMa9vwigDiAf3rNMbut1gtqtwdzux8c9T1inApKV5
sccjg5POKm+4WmWTBOtQfYR8cNot2Mn/mO+MRiKH8sYapYnU2es+KRBmhdARE+N7EqdD0WqoP7NrsNVbObHwDQBNkODuc3ZPyTQuqv/
w4poTXaS5u5M1XZbgZwAAAIEAjt4r7SN1I/m0V/
TvedTVxJvKln4wZkFxyI5CAgpsAr435kwSLM08R9Hd0/5Vy9L…YpH1aZTBaoTqmTCtnv3mp1coXoscEp5nE0llfm+4DX3YvWnR80S/OeMUe71Ucm1ORwFpST/
K4WKQoZ30TAVVsc8nYy2hyD7hyozjzsS09o=	
  dave.barcelo@dbarcelo-­‐mbpro'	
  
	
  	
  	
  	
  }	
  
	
  	
  	
  	
  users::user	
  {	
  'lwadhwani':	
  
	
  	
  	
  	
  	
  	
  groups	
  =>	
  'wheel',	
  
	
  	
  	
  	
  	
  	
  sshKey	
  =>	
  'ssh-­‐rsa	
  AAAAB3NzaC1yc2EAAAABIwAAAQEAysFCPpffw9LIOqAEFZxOOb52m2FbHhumBFc07o8sm3c4cmdLq/
bBtr5TyuQp89zVNEaTGRbw1nMpQCDno4i5ipTvCLoKkOE1PRdtyJw6PGu6VV/0U1ghK+1xmveM2jDX/otj5hjnQiRm1+Fx/
orYwNBkywDlDHZQCGxalWaFgXVyReCRUqq0jBwj3EKJfsQgoxuSrh7F6GjsQ6DUOsA3wBfewS25hPmhulEqvga4/P58BMHemL9d4Ugu98Vg7fgaur/b1adX
+LzbmE6C2T4Gn1kzAOEct6bFgLPRj3n5/EaspdOsZ/Nnik0LUvIwZNHgDCLgkS0D8aMIsiUrB4OqSw==	
  luveen@Pantalaimon'	
  
	
  	
  	
  	
  }	
  
}	
  
/etc/puppet/modules/…	
  
•  Do	
  stuff!	
  
•  Code	
  is	
  sYll	
  generic	
  but	
  it	
  does	
  not	
  have	
  to	
  be.	
  
Masterless	
  Dev	
  Workflow	
  

More Related Content

What's hot

Puppet Camp Portland 2015: Introduction to Hiera (Beginner)
Puppet Camp Portland 2015: Introduction to Hiera (Beginner)Puppet Camp Portland 2015: Introduction to Hiera (Beginner)
Puppet Camp Portland 2015: Introduction to Hiera (Beginner)Puppet
 
More tips n tricks
More tips n tricksMore tips n tricks
More tips n tricksbcoca
 
Puppet at janrain
Puppet at janrainPuppet at janrain
Puppet at janrainPuppet
 
Introduction To Django (Strange Loop 2011)
Introduction To Django (Strange Loop 2011)Introduction To Django (Strange Loop 2011)
Introduction To Django (Strange Loop 2011)Jacob Kaplan-Moss
 
Ansible leveraging 2.0
Ansible leveraging 2.0Ansible leveraging 2.0
Ansible leveraging 2.0bcoca
 
Getting Hiera and Hiera
Getting Hiera and HieraGetting Hiera and Hiera
Getting Hiera and HieraPuppet
 
Using hiera with puppet
Using hiera with puppetUsing hiera with puppet
Using hiera with puppetScott Lackey
 
Moving from Django Apps to Services
Moving from Django Apps to ServicesMoving from Django Apps to Services
Moving from Django Apps to ServicesCraig Kerstiens
 
The Puppet Debugging Kit: Building Blocks for Exploration and Problem Solving...
The Puppet Debugging Kit: Building Blocks for Exploration and Problem Solving...The Puppet Debugging Kit: Building Blocks for Exploration and Problem Solving...
The Puppet Debugging Kit: Building Blocks for Exploration and Problem Solving...Puppet
 
Introducing Assetic: Asset Management for PHP 5.3
Introducing Assetic: Asset Management for PHP 5.3Introducing Assetic: Asset Management for PHP 5.3
Introducing Assetic: Asset Management for PHP 5.3Kris Wallsmith
 
4069180 Caching Performance Lessons From Facebook
4069180 Caching Performance Lessons From Facebook4069180 Caching Performance Lessons From Facebook
4069180 Caching Performance Lessons From Facebookguoqing75
 
Hacking ansible
Hacking ansibleHacking ansible
Hacking ansiblebcoca
 
Php on the desktop and php gtk2
Php on the desktop and php gtk2Php on the desktop and php gtk2
Php on the desktop and php gtk2Elizabeth Smith
 
Burn down the silos! Helping dev and ops gel on high availability websites
Burn down the silos! Helping dev and ops gel on high availability websitesBurn down the silos! Helping dev and ops gel on high availability websites
Burn down the silos! Helping dev and ops gel on high availability websitesLindsay Holmwood
 
Puppet Camp Berlin 2015: Martin Alfke | The Power of Puppet 4
Puppet Camp Berlin 2015: Martin Alfke | The Power of Puppet 4Puppet Camp Berlin 2015: Martin Alfke | The Power of Puppet 4
Puppet Camp Berlin 2015: Martin Alfke | The Power of Puppet 4NETWAYS
 
Facebook的缓存系统
Facebook的缓存系统Facebook的缓存系统
Facebook的缓存系统yiditushe
 

What's hot (20)

Puppet Camp Portland 2015: Introduction to Hiera (Beginner)
Puppet Camp Portland 2015: Introduction to Hiera (Beginner)Puppet Camp Portland 2015: Introduction to Hiera (Beginner)
Puppet Camp Portland 2015: Introduction to Hiera (Beginner)
 
More tips n tricks
More tips n tricksMore tips n tricks
More tips n tricks
 
Puppet at janrain
Puppet at janrainPuppet at janrain
Puppet at janrain
 
Introduction To Django (Strange Loop 2011)
Introduction To Django (Strange Loop 2011)Introduction To Django (Strange Loop 2011)
Introduction To Django (Strange Loop 2011)
 
Power of Puppet 4
Power of Puppet 4Power of Puppet 4
Power of Puppet 4
 
Ansible leveraging 2.0
Ansible leveraging 2.0Ansible leveraging 2.0
Ansible leveraging 2.0
 
Getting Hiera and Hiera
Getting Hiera and HieraGetting Hiera and Hiera
Getting Hiera and Hiera
 
Using hiera with puppet
Using hiera with puppetUsing hiera with puppet
Using hiera with puppet
 
Moving from Django Apps to Services
Moving from Django Apps to ServicesMoving from Django Apps to Services
Moving from Django Apps to Services
 
The Puppet Debugging Kit: Building Blocks for Exploration and Problem Solving...
The Puppet Debugging Kit: Building Blocks for Exploration and Problem Solving...The Puppet Debugging Kit: Building Blocks for Exploration and Problem Solving...
The Puppet Debugging Kit: Building Blocks for Exploration and Problem Solving...
 
Introducing Assetic: Asset Management for PHP 5.3
Introducing Assetic: Asset Management for PHP 5.3Introducing Assetic: Asset Management for PHP 5.3
Introducing Assetic: Asset Management for PHP 5.3
 
4069180 Caching Performance Lessons From Facebook
4069180 Caching Performance Lessons From Facebook4069180 Caching Performance Lessons From Facebook
4069180 Caching Performance Lessons From Facebook
 
Hacking ansible
Hacking ansibleHacking ansible
Hacking ansible
 
Puppet @ Seat
Puppet @ SeatPuppet @ Seat
Puppet @ Seat
 
Php on the desktop and php gtk2
Php on the desktop and php gtk2Php on the desktop and php gtk2
Php on the desktop and php gtk2
 
Spl in the wild
Spl in the wildSpl in the wild
Spl in the wild
 
Snakes on a Treadmill
Snakes on a TreadmillSnakes on a Treadmill
Snakes on a Treadmill
 
Burn down the silos! Helping dev and ops gel on high availability websites
Burn down the silos! Helping dev and ops gel on high availability websitesBurn down the silos! Helping dev and ops gel on high availability websites
Burn down the silos! Helping dev and ops gel on high availability websites
 
Puppet Camp Berlin 2015: Martin Alfke | The Power of Puppet 4
Puppet Camp Berlin 2015: Martin Alfke | The Power of Puppet 4Puppet Camp Berlin 2015: Martin Alfke | The Power of Puppet 4
Puppet Camp Berlin 2015: Martin Alfke | The Power of Puppet 4
 
Facebook的缓存系统
Facebook的缓存系统Facebook的缓存系统
Facebook的缓存系统
 

Similar to Puppet at Bazaarvoice

Our Puppet Story (GUUG FFG 2015)
Our Puppet Story (GUUG FFG 2015)Our Puppet Story (GUUG FFG 2015)
Our Puppet Story (GUUG FFG 2015)DECK36
 
From SaltStack to Puppet and beyond...
From SaltStack to Puppet and beyond...From SaltStack to Puppet and beyond...
From SaltStack to Puppet and beyond...Yury Bushmelev
 
Improving Operations Efficiency with Puppet
Improving Operations Efficiency with PuppetImproving Operations Efficiency with Puppet
Improving Operations Efficiency with PuppetNicolas Brousse
 
Strategies for Puppet code upgrade and refactoring
Strategies for Puppet code upgrade and refactoringStrategies for Puppet code upgrade and refactoring
Strategies for Puppet code upgrade and refactoringAlessandro Franceschi
 
PuppetDB: Sneaking Clojure into Operations
PuppetDB: Sneaking Clojure into OperationsPuppetDB: Sneaking Clojure into Operations
PuppetDB: Sneaking Clojure into Operationsgrim_radical
 
Puppet getting started by Dirk Götz
Puppet getting started by Dirk GötzPuppet getting started by Dirk Götz
Puppet getting started by Dirk GötzNETWAYS
 
Harmonious Development: Via Vagrant and Puppet
Harmonious Development: Via Vagrant and PuppetHarmonious Development: Via Vagrant and Puppet
Harmonious Development: Via Vagrant and PuppetAchieve Internet
 
Puppet for dummies - PHPBenelux UG edition
Puppet for dummies - PHPBenelux UG editionPuppet for dummies - PHPBenelux UG edition
Puppet for dummies - PHPBenelux UG editionJoshua Thijssen
 
Webinar - Managing Files with Puppet
Webinar - Managing Files with PuppetWebinar - Managing Files with Puppet
Webinar - Managing Files with PuppetOlinData
 
Puppet: Eclipsecon ALM 2013
Puppet: Eclipsecon ALM 2013Puppet: Eclipsecon ALM 2013
Puppet: Eclipsecon ALM 2013grim_radical
 
Developing IT infrastructures with Puppet
Developing IT infrastructures with PuppetDeveloping IT infrastructures with Puppet
Developing IT infrastructures with PuppetAlessandro Franceschi
 
Fixing Growing Pains With Puppet Data Patterns
Fixing Growing Pains With Puppet Data PatternsFixing Growing Pains With Puppet Data Patterns
Fixing Growing Pains With Puppet Data PatternsMartin Jackson
 
Php on the Web and Desktop
Php on the Web and DesktopPhp on the Web and Desktop
Php on the Web and DesktopElizabeth Smith
 
Puppet Camp Silicon Valley 2015: How TubeMogul reached 10,000 Puppet Deployme...
Puppet Camp Silicon Valley 2015: How TubeMogul reached 10,000 Puppet Deployme...Puppet Camp Silicon Valley 2015: How TubeMogul reached 10,000 Puppet Deployme...
Puppet Camp Silicon Valley 2015: How TubeMogul reached 10,000 Puppet Deployme...Nicolas Brousse
 
Performance Tuning Your Puppet Infrastructure - PuppetConf 2014
Performance Tuning Your Puppet Infrastructure - PuppetConf 2014Performance Tuning Your Puppet Infrastructure - PuppetConf 2014
Performance Tuning Your Puppet Infrastructure - PuppetConf 2014Puppet
 
Delegated Configuration with Multiple Hiera Databases - PuppetConf 2014
Delegated Configuration with Multiple Hiera Databases - PuppetConf 2014Delegated Configuration with Multiple Hiera Databases - PuppetConf 2014
Delegated Configuration with Multiple Hiera Databases - PuppetConf 2014Puppet
 
Cloud patterns applied
Cloud patterns appliedCloud patterns applied
Cloud patterns appliedLars Fronius
 
Symfony finally swiped right on envvars
Symfony finally swiped right on envvarsSymfony finally swiped right on envvars
Symfony finally swiped right on envvarsSam Marley-Jarrett
 

Similar to Puppet at Bazaarvoice (20)

Our Puppet Story (GUUG FFG 2015)
Our Puppet Story (GUUG FFG 2015)Our Puppet Story (GUUG FFG 2015)
Our Puppet Story (GUUG FFG 2015)
 
From SaltStack to Puppet and beyond...
From SaltStack to Puppet and beyond...From SaltStack to Puppet and beyond...
From SaltStack to Puppet and beyond...
 
Improving Operations Efficiency with Puppet
Improving Operations Efficiency with PuppetImproving Operations Efficiency with Puppet
Improving Operations Efficiency with Puppet
 
Strategies for Puppet code upgrade and refactoring
Strategies for Puppet code upgrade and refactoringStrategies for Puppet code upgrade and refactoring
Strategies for Puppet code upgrade and refactoring
 
PuppetDB: Sneaking Clojure into Operations
PuppetDB: Sneaking Clojure into OperationsPuppetDB: Sneaking Clojure into Operations
PuppetDB: Sneaking Clojure into Operations
 
Puppet getting started by Dirk Götz
Puppet getting started by Dirk GötzPuppet getting started by Dirk Götz
Puppet getting started by Dirk Götz
 
Harmonious Development: Via Vagrant and Puppet
Harmonious Development: Via Vagrant and PuppetHarmonious Development: Via Vagrant and Puppet
Harmonious Development: Via Vagrant and Puppet
 
Puppet for dummies - PHPBenelux UG edition
Puppet for dummies - PHPBenelux UG editionPuppet for dummies - PHPBenelux UG edition
Puppet for dummies - PHPBenelux UG edition
 
Webinar - Managing Files with Puppet
Webinar - Managing Files with PuppetWebinar - Managing Files with Puppet
Webinar - Managing Files with Puppet
 
Puppet: From 0 to 100 in 30 minutes
Puppet: From 0 to 100 in 30 minutesPuppet: From 0 to 100 in 30 minutes
Puppet: From 0 to 100 in 30 minutes
 
Puppet: Eclipsecon ALM 2013
Puppet: Eclipsecon ALM 2013Puppet: Eclipsecon ALM 2013
Puppet: Eclipsecon ALM 2013
 
Developing IT infrastructures with Puppet
Developing IT infrastructures with PuppetDeveloping IT infrastructures with Puppet
Developing IT infrastructures with Puppet
 
Fixing Growing Pains With Puppet Data Patterns
Fixing Growing Pains With Puppet Data PatternsFixing Growing Pains With Puppet Data Patterns
Fixing Growing Pains With Puppet Data Patterns
 
Php on the Web and Desktop
Php on the Web and DesktopPhp on the Web and Desktop
Php on the Web and Desktop
 
Puppet Camp Silicon Valley 2015: How TubeMogul reached 10,000 Puppet Deployme...
Puppet Camp Silicon Valley 2015: How TubeMogul reached 10,000 Puppet Deployme...Puppet Camp Silicon Valley 2015: How TubeMogul reached 10,000 Puppet Deployme...
Puppet Camp Silicon Valley 2015: How TubeMogul reached 10,000 Puppet Deployme...
 
Having Fun with Play
Having Fun with PlayHaving Fun with Play
Having Fun with Play
 
Performance Tuning Your Puppet Infrastructure - PuppetConf 2014
Performance Tuning Your Puppet Infrastructure - PuppetConf 2014Performance Tuning Your Puppet Infrastructure - PuppetConf 2014
Performance Tuning Your Puppet Infrastructure - PuppetConf 2014
 
Delegated Configuration with Multiple Hiera Databases - PuppetConf 2014
Delegated Configuration with Multiple Hiera Databases - PuppetConf 2014Delegated Configuration with Multiple Hiera Databases - PuppetConf 2014
Delegated Configuration with Multiple Hiera Databases - PuppetConf 2014
 
Cloud patterns applied
Cloud patterns appliedCloud patterns applied
Cloud patterns applied
 
Symfony finally swiped right on envvars
Symfony finally swiped right on envvarsSymfony finally swiped right on envvars
Symfony finally swiped right on envvars
 

More from Puppet

Puppet camp2021 testing modules and controlrepo
Puppet camp2021 testing modules and controlrepoPuppet camp2021 testing modules and controlrepo
Puppet camp2021 testing modules and controlrepoPuppet
 
Puppetcamp r10kyaml
Puppetcamp r10kyamlPuppetcamp r10kyaml
Puppetcamp r10kyamlPuppet
 
2021 04-15 operational verification (with notes)
2021 04-15 operational verification (with notes)2021 04-15 operational verification (with notes)
2021 04-15 operational verification (with notes)Puppet
 
Puppet camp vscode
Puppet camp vscodePuppet camp vscode
Puppet camp vscodePuppet
 
Modules of the twenties
Modules of the twentiesModules of the twenties
Modules of the twentiesPuppet
 
Applying Roles and Profiles method to compliance code
Applying Roles and Profiles method to compliance codeApplying Roles and Profiles method to compliance code
Applying Roles and Profiles method to compliance codePuppet
 
KGI compliance as-code approach
KGI compliance as-code approachKGI compliance as-code approach
KGI compliance as-code approachPuppet
 
Enforce compliance policy with model-driven automation
Enforce compliance policy with model-driven automationEnforce compliance policy with model-driven automation
Enforce compliance policy with model-driven automationPuppet
 
Keynote: Puppet camp compliance
Keynote: Puppet camp complianceKeynote: Puppet camp compliance
Keynote: Puppet camp compliancePuppet
 
Automating it management with Puppet + ServiceNow
Automating it management with Puppet + ServiceNowAutomating it management with Puppet + ServiceNow
Automating it management with Puppet + ServiceNowPuppet
 
Puppet: The best way to harden Windows
Puppet: The best way to harden WindowsPuppet: The best way to harden Windows
Puppet: The best way to harden WindowsPuppet
 
Simplified Patch Management with Puppet - Oct. 2020
Simplified Patch Management with Puppet - Oct. 2020Simplified Patch Management with Puppet - Oct. 2020
Simplified Patch Management with Puppet - Oct. 2020Puppet
 
Accelerating azure adoption with puppet
Accelerating azure adoption with puppetAccelerating azure adoption with puppet
Accelerating azure adoption with puppetPuppet
 
Puppet catalog Diff; Raphael Pinson
Puppet catalog Diff; Raphael PinsonPuppet catalog Diff; Raphael Pinson
Puppet catalog Diff; Raphael PinsonPuppet
 
ServiceNow and Puppet- better together, Kevin Reeuwijk
ServiceNow and Puppet- better together, Kevin ReeuwijkServiceNow and Puppet- better together, Kevin Reeuwijk
ServiceNow and Puppet- better together, Kevin ReeuwijkPuppet
 
Take control of your dev ops dumping ground
Take control of your  dev ops dumping groundTake control of your  dev ops dumping ground
Take control of your dev ops dumping groundPuppet
 
100% Puppet Cloud Deployment of Legacy Software
100% Puppet Cloud Deployment of Legacy Software100% Puppet Cloud Deployment of Legacy Software
100% Puppet Cloud Deployment of Legacy SoftwarePuppet
 
Puppet User Group
Puppet User GroupPuppet User Group
Puppet User GroupPuppet
 
Continuous Compliance and DevSecOps
Continuous Compliance and DevSecOpsContinuous Compliance and DevSecOps
Continuous Compliance and DevSecOpsPuppet
 
The Dynamic Duo of Puppet and Vault tame SSL Certificates, Nick Maludy
The Dynamic Duo of Puppet and Vault tame SSL Certificates, Nick MaludyThe Dynamic Duo of Puppet and Vault tame SSL Certificates, Nick Maludy
The Dynamic Duo of Puppet and Vault tame SSL Certificates, Nick MaludyPuppet
 

More from Puppet (20)

Puppet camp2021 testing modules and controlrepo
Puppet camp2021 testing modules and controlrepoPuppet camp2021 testing modules and controlrepo
Puppet camp2021 testing modules and controlrepo
 
Puppetcamp r10kyaml
Puppetcamp r10kyamlPuppetcamp r10kyaml
Puppetcamp r10kyaml
 
2021 04-15 operational verification (with notes)
2021 04-15 operational verification (with notes)2021 04-15 operational verification (with notes)
2021 04-15 operational verification (with notes)
 
Puppet camp vscode
Puppet camp vscodePuppet camp vscode
Puppet camp vscode
 
Modules of the twenties
Modules of the twentiesModules of the twenties
Modules of the twenties
 
Applying Roles and Profiles method to compliance code
Applying Roles and Profiles method to compliance codeApplying Roles and Profiles method to compliance code
Applying Roles and Profiles method to compliance code
 
KGI compliance as-code approach
KGI compliance as-code approachKGI compliance as-code approach
KGI compliance as-code approach
 
Enforce compliance policy with model-driven automation
Enforce compliance policy with model-driven automationEnforce compliance policy with model-driven automation
Enforce compliance policy with model-driven automation
 
Keynote: Puppet camp compliance
Keynote: Puppet camp complianceKeynote: Puppet camp compliance
Keynote: Puppet camp compliance
 
Automating it management with Puppet + ServiceNow
Automating it management with Puppet + ServiceNowAutomating it management with Puppet + ServiceNow
Automating it management with Puppet + ServiceNow
 
Puppet: The best way to harden Windows
Puppet: The best way to harden WindowsPuppet: The best way to harden Windows
Puppet: The best way to harden Windows
 
Simplified Patch Management with Puppet - Oct. 2020
Simplified Patch Management with Puppet - Oct. 2020Simplified Patch Management with Puppet - Oct. 2020
Simplified Patch Management with Puppet - Oct. 2020
 
Accelerating azure adoption with puppet
Accelerating azure adoption with puppetAccelerating azure adoption with puppet
Accelerating azure adoption with puppet
 
Puppet catalog Diff; Raphael Pinson
Puppet catalog Diff; Raphael PinsonPuppet catalog Diff; Raphael Pinson
Puppet catalog Diff; Raphael Pinson
 
ServiceNow and Puppet- better together, Kevin Reeuwijk
ServiceNow and Puppet- better together, Kevin ReeuwijkServiceNow and Puppet- better together, Kevin Reeuwijk
ServiceNow and Puppet- better together, Kevin Reeuwijk
 
Take control of your dev ops dumping ground
Take control of your  dev ops dumping groundTake control of your  dev ops dumping ground
Take control of your dev ops dumping ground
 
100% Puppet Cloud Deployment of Legacy Software
100% Puppet Cloud Deployment of Legacy Software100% Puppet Cloud Deployment of Legacy Software
100% Puppet Cloud Deployment of Legacy Software
 
Puppet User Group
Puppet User GroupPuppet User Group
Puppet User Group
 
Continuous Compliance and DevSecOps
Continuous Compliance and DevSecOpsContinuous Compliance and DevSecOps
Continuous Compliance and DevSecOps
 
The Dynamic Duo of Puppet and Vault tame SSL Certificates, Nick Maludy
The Dynamic Duo of Puppet and Vault tame SSL Certificates, Nick MaludyThe Dynamic Duo of Puppet and Vault tame SSL Certificates, Nick Maludy
The Dynamic Duo of Puppet and Vault tame SSL Certificates, Nick Maludy
 

Recently uploaded

How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhisoniya singh
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking MenDelhi Call girls
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure servicePooja Nehwal
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...shyamraj55
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfEnterprise Knowledge
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitecturePixlogix Infotech
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Allon Mureinik
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxOnBoard
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024Scott Keck-Warren
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...HostedbyConfluent
 
Google AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAGGoogle AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAGSujit Pal
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 3652toLead Limited
 

Recently uploaded (20)

How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC Architecture
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptx
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
 
Google AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAGGoogle AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAG
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
 

Puppet at Bazaarvoice

  • 2. Hi,  my  name  is  Dave.   •  DevOps  Engineer  at  Bazaarvoice.   •  Started  working  with  puppet  in  2008  while  working  at   Bioware.    First  version  was  0.24.   •  At  Bioware,  puppet  configured  over  14k  nodes  that   comprised  of  web  servers,  databases  and  game   servers.   •  All  5  datacenters  (in  California,  Virginia,  Ireland,   Australia  and  Texas)  housed  puppet  managed  nodes   that  all  reported  back  to  a  centralized  puppet   dashboard.   •  My  contact  info:   –  hTp://www.linkedin.com/in/jamesbarcelo  
  • 3. Bazaarvoice  Plug   •  We  do  embedded  DevOps!   •  ApplicaYon  teams  are  responsible  for  their   applicaYon’s  operaYonal  success.    No  centralized   operaYons!   •  2.0  stack  is  100%  in  Amazon!   •  Conferences!   •  Work  on  awesome  projects  with  spiffy  tech  like   Cassandra  or  ElasYcSearch.   •  Send  me  your  resume!     Dave.barcelo@bazzarvoice.com  
  • 4. Preview  presentaYon   •  Puppet  in  the  legacy  stack.   •  Puppet  in  the  Data  Infrastructure  Team.   – Focus  on  client/server.   •  Puppet  in  the  Data  Services  Team.   – Focus  on  masterless  puppet.  
  • 5. Puppet  in  the  Legacy  Infrastructure   •  TradiYonal  puppet  use  with  client/server.   •  MulYple  levels  of  inheritance  using  node   inheritance.   •  Puppet  managed  instances  are  configured   according  to  DNS  naming  convenYon:     node  /my-­‐hostname/  {      …      …   }  
  • 6. •  Some  issues  encountered:   – Very  hard  to  work  with.    Very  complex.   – Large  codebase.    Adds  to  complexity.    MulYple   teams  working  with  same  code  base.       – No  confidence  in  making  changes.    Side  effects   feared  ader  code  change.  A  jinga  tower  of  puppet   code.   – Too  many  pivot  points.    Many  places  to  configure.     Adds  to  complexity.   – Lots  of  code  rot.    Had  not  been  refactored.  
  • 7. Puppet  master/client  in  Data   Infrastructure  teams  
  • 8. Architecture   •  Each  server  type  we  care  about  will  be  referenced  by   its  role.    We  only  care  about  roles,  not  hostnames.   •  Centered  around  an  uber  IT  tools  server  that  runs   everything  ops  (including  puppet)  to  do  work  in  an   environment.    The  Mothership.   •  Hiera  and  parameterized  classes  will  be  used  to  create   generic  puppet  modules  that  can  be  reused  for   different  roles.   •  Development  will  be  centered  on  using  puppet   environments  on  the  Mothership  to  protect  devs  from   stepping  on  each  other.    
  • 9. Mothership   •  Contains  a  cocktail  of  different  applicaYon  tools   for  doing  work  in  the  environment.    Tools   included:   –  McollecYve/AcYveMQ   –  Puppet  server   –  Puppet  managed  operaYon  scripts.   •  Motherships  configured  to  be  highly  available  in   regular  AWS  fashion(Autoscaling,  cluster  mulYple   acYveMQ,  etc).   •  AdverYses  mulYple  puppet  environments  that   clients  can  switch  between  via  –environments.  
  • 10. What  is  a  Universe?  
  • 11. Anatomy  of  a  Mothership  
  • 12. Methods  of  passing  in  data   Gejng  environment  data  into  puppet   configuraYon.     •  Hiera  datastore.   •  Puppet  stdlib/tags.txt   •  Cloud  formaYon  parameters  –  Universe,  VPC  
  • 13. Puppet  Stdlib/facts.d     •   Bootstrap  process  (EC2  user  data)  populates  / etc/facter/facts.d/tags.txt  with  mappings.    These   mappings  become  facters.   •  Example  of  data  in  tags.txt:   –  Universe  value.   –  Ec2  metadata.   /etc/facter/facts.d/tags.txt:   universe=dev   Tag_region=us-­‐east-­‐1  
  • 14. Hiera  datastore   •  Hiera  is  used  extensively  where  different  data   needs  to  be  passed  into  puppet  according  to   context.    Different  contexts  would  include:   – Amazon  region.   – Instance  role.   – Universe.   •  Example  usage:   $app_version  =  hiera(‘app_version’,  nil)  
  • 15. /etc/hiera.yaml   -­‐-­‐   :logger:  console     :hierarchy:                              -­‐  %{fqdn}                          -­‐  10-­‐team/%{team}/10-­‐region/%{tag_region}/10-­‐universe/%{universe}/10-­‐roles/%{role}                          -­‐  10-­‐team/%{team}/10-­‐region/%{tag_region}/10-­‐universe/%{universe}/20-­‐common                          -­‐  10-­‐team/%{team}/10-­‐region/%{tag_region}/20-­‐roles/%{role}                          -­‐  10-­‐team/%{team}/10-­‐region/%{tag_region}/30-­‐common                          -­‐  10-­‐team/%{team}/20-­‐universe/%{universe}/10-­‐roles/%{role}                          -­‐  10-­‐team/%{team}/20-­‐universe/%{universe}/20-­‐common                          -­‐  10-­‐team/%{team}/30-­‐roles/%{role}                          -­‐  10-­‐team/%{team}/40-­‐common                            -­‐  40-­‐common                            -­‐  environments     :backends:  -­‐  yaml                        -­‐  json     :yaml:      :datadir:  /etc/puppet_env/%{environment}/manifests/hieradata     :json:      :datadir:  /etc/puppet/env/global_hieradata  
  • 18. Puppet  code  on  the  Mothership   •  The  files  that  do  the  things:   – /etc/puppet/puppet.conf   – /etc/puppet/env/global_hieradata/ environments.json   – /etc/puppet/puppetmaster.conf   – /etc/puppet_env/{puppet_env}/…   •  manifests/…   •  modules/…  
  • 19. /etc/puppet/puppet.conf   #  File  managed  by  Puppet.     [main]      vardir  =  /var/lib/puppet      logdir  =  /var/log/puppet      rundir  =  /var/run/puppet      ssldir  =  $vardir/ssl        usecacheonfailure  =  true      pluginsync  =  true      factpath  =  $vardir/lib/facter      preferred_serializaYon_format  =  yaml     [user]      vardir  =  /var/lib/puppet      logdir  =  /var/log/puppet      rundir  =  /var/run/puppet      ssldir  =  $vardir/ssl     [agent]      runinterval  =  1800      ca_server  =  <%=  ca_srv  %>      server  =  <%=  logical_srv  %>      cerYficate_revocaYon  =  False      environment  =  <%=  environment  %>      report  =  true  
  • 20. /etc/puppet/env/global_hieradata/ environments.json   {      "environments":  [          {              "cert":  [                  {                    "modulepath":  "/etc/puppet_env/cert/modules"                },                  {                      "manifestdir":  "/etc/puppet_env/cert/manifests"                  },                  {                    "manifest":  "/etc/puppet_env/cert/manifests/site.pp"                  }              ]          }   }    
  • 21. /etc/puppet/puppetmaster.conf   [main]      vardir  =  /var/lib/puppet      logdir  =  /var/log/puppet      rundir  =  /var/run/puppet      ssldir  =  $vardir/ssl        usecacheonfailure  =  true      pluginsync  =  true      factpath  =  $vardir/lib/facter      preferred_serializaYon_format  =  yaml      syslogfacility  =  local1     [master]      certname=<%=  certname  %>      ca  =  True      cerYficate_revocaYon=False      dns_alt_names=<%=  logical_srv  %>      ssl_client_header  =  SSL_CLIENT_S_DN      ssl_client_verify_header  =  SSL_CLIENT_VERIFY      autosign  =  true        #  For  puppet  dashboard  reporYng.      reports  =  store,  datadog_reports        <%  if  store_configs  ==  true  %>      #  Puppetdb.      storeconfigs  =  true      storeconfigs_backend  =  puppetdb      <%  end  %>     [user]      vardir  =  /var/lib/puppet      logdir  =  /var/log/puppet      rundir  =  /var/run/puppet      ssldir  =  $vardir/ssl     #  Environments   <%  environments.each  do  |env_val|  -­‐%>   <%  env_val.keys.each  do  |env_key|  -­‐%>   [<%=  env_key  -­‐%>]   <%  env_val[env_key].each  do  |env_data|  -­‐%>   <%  env_data.each_pair  do  |k,  v|  -­‐%>   <%=  k  %>  =  <%=  v  -­‐%>   <%  end  %>   <%  end  %>   <%  end  %>   <%  end  %>    
  • 22. /etc/puppet_env/{env}/manifests/ site.pp   import  'roles/*.pp'     node  default  {          class  {  'basenode_role':  }            class  {  "$tag_role":  }   }    
  • 23. /etc/puppet_env/{env}/manifests/ role/00_basenode.pp   class  basenode_role  {      class  {  ‘security’:  }      class  {  ‘monitoring’:  }      …..   }  
  • 24. /etc/puppet_env/{env}/manifests/ role/mothership_role.pp   class  mothership_role  {        class  {  'puppet':          master  =>  true,          ca_srv  =>  $tag_caserver,          logical_srv  =>  $tag_puppet_server,      }     }  
  • 26. Masterless  Puppet  in  Data  Services   Teams  
  • 27. Architecture   SYll  keeping  bits  of  the  Mothership  project:   •  ApplicaYons/Services  scoped  in  zookeeper  by   Universe.   •  Emphasis  is  put  on  making  things  simpler.     Puppet  code  will  not  be  monolithic.    Individual   applicaYon  teams  will  only  need  to  maintain   there  own  modules/manifests.   •  Changes  to  modules/manifests  will  not  impact   other  teams.    
  • 28. Methods  of  passing  in  data   •  The  usual  suspects:   – Puppet  stdlib/tags.txt.   – Hiera.   – Cloud  formaYon  parameters  –  Universe,  VPC   •  Some  new  ones:   – EC2  data/metadata  -­‐>  facter.   – Zookeeper.   – Cloud    formaYon  parameters  -­‐  DeployTag  
  • 29. getEC2data_cache.rb   •  Script  runs  out  of  /etc/facts.d  that  converts   EC2  data/metadata  into  facts.  
  • 30. Zookeeper/Ostrich   •  Custom  funcYons  to  pull  data  from  zookeeper   the  same  way  applicaYons  do  discovery.  
  • 32. Puppet  code  in  Masterless   •  No  more  Mothership.    All  work  is  done  via   puppet  apply.   – /etc/hiera.yaml   – /etc/puppet/manifests/{role}.pp   – /etc/puppet/manifests/00_common.pp   – /etc/puppet/manifests/01_users.pp   – /etc/puppet/modules/…  
  • 33. /etc/hiera.yaml   -­‐-­‐   :logger:  console     :hierarchy:  -­‐  %{fqdn}                            -­‐  10-­‐universe/%{universe}/10-­‐roles/%{role}                          -­‐  10-­‐universe/%{universe}/20-­‐common                          -­‐  20-­‐roles/%{role}                          -­‐  30-­‐common     :backends:  -­‐  yaml     :yaml:      :datadir:  /etc/puppet/manifests/hieradata  
  • 34. /etc/puppet/manifests/{role}.pp   import  '00_common'     node  default  {        #  This  class  contains  common  modules  that  should  be  used  by  all  roles.      class  {  'common':  }            class  {  'acYvemq’:  }      -­‐>      class  {  'mcollecYve':          server                    =>  true,          client                    =>  true,      }     }  
  • 35. /etc/puppet/manifests/ 00_common.pp   import  '01_users'   #####################################   #  Common   #####################################       class  common  {            class  {  'stdlib':  }                    file  {  '/opt/bazaarvoice':  ensure  =>  directory,  }            #  Authorized  keys  for  project  developers.          class  {  'user_setup':  stage  =>  setup,  }     host  {  'internal_ip':                  ensure  =>  'present',                  name  =>  $fqdn,                  ip  =>  $ipaddress,          }            class  {  'prompt':  }   }  
  • 36. /etc/puppet/manifests/01_users.pp   class  user_setup  {            include  users            users::user  {  'dbarcelo':              groups  =>  'wheel',              sshKey  =>  'ssh-­‐dss  AAAAB3NzaC1kc3MAAACBANL1zoZdYJp/6vQ4G5iNQXjdJ7NGmK0J2eqHbztvuD0CBPyqMuEtuYKRg14tFd4iwp5EpnT4UWpv8kXF/ dkEN3b5xgN/R+1hYq7/3mnRLchMFTl0tyryLuARC9zTI003mQrXd/ W9jzXaNlCTpxh8Ihj2Ov3lvAAX65tN9nijxhCTAAAAFQCgMU0obmTLo5CRYtRwDCkj1mb2hQAAAIAiZF9axkCvMa9vwigDiAf3rNMbut1gtqtwdzux8c9T1inApKV5 sccjg5POKm+4WmWTBOtQfYR8cNot2Mn/mO+MRiKH8sYapYnU2es+KRBmhdARE+N7EqdD0WqoP7NrsNVbObHwDQBNkODuc3ZPyTQuqv/ w4poTXaS5u5M1XZbgZwAAAIEAjt4r7SN1I/m0V/ TvedTVxJvKln4wZkFxyI5CAgpsAr435kwSLM08R9Hd0/5Vy9L…YpH1aZTBaoTqmTCtnv3mp1coXoscEp5nE0llfm+4DX3YvWnR80S/OeMUe71Ucm1ORwFpST/ K4WKQoZ30TAVVsc8nYy2hyD7hyozjzsS09o=  dave.barcelo@dbarcelo-­‐mbpro'          }          users::user  {  'lwadhwani':              groups  =>  'wheel',              sshKey  =>  'ssh-­‐rsa  AAAAB3NzaC1yc2EAAAABIwAAAQEAysFCPpffw9LIOqAEFZxOOb52m2FbHhumBFc07o8sm3c4cmdLq/ bBtr5TyuQp89zVNEaTGRbw1nMpQCDno4i5ipTvCLoKkOE1PRdtyJw6PGu6VV/0U1ghK+1xmveM2jDX/otj5hjnQiRm1+Fx/ orYwNBkywDlDHZQCGxalWaFgXVyReCRUqq0jBwj3EKJfsQgoxuSrh7F6GjsQ6DUOsA3wBfewS25hPmhulEqvga4/P58BMHemL9d4Ugu98Vg7fgaur/b1adX +LzbmE6C2T4Gn1kzAOEct6bFgLPRj3n5/EaspdOsZ/Nnik0LUvIwZNHgDCLgkS0D8aMIsiUrB4OqSw==  luveen@Pantalaimon'          }   }  
  • 37. /etc/puppet/modules/…   •  Do  stuff!   •  Code  is  sYll  generic  but  it  does  not  have  to  be.