Automating Docker 
Containers with Puppet 
Kylo Ginsberg 
kylo@puppetlabs.com 
@kylog 
irc: kylo
Puppet?
So you can write: 
package { ‘ntp’:! 
ensure => installed,! 
}! 
file { ‘/etc/ntp.conf’:! 
ensure => file,! 
source => ‘/root/example/ntp.conf’,! 
mode => ‘0444’,! 
}! 
service { ‘ntp’:! 
ensure => running,! 
}
Forge
Instead write 
include ‘::ntp' 
or customize: 
class { '::ntp':! 
servers => [ 'ntp1.corp.com', 'ntp2.corp.com' ],! 
}
Puppet 
System Configuration 
Declarative Language 
Resource Abstraction
Two ways to run code: 
puppet apply 
puppet agent
Docker and Puppet 
1. Building containers! 
2. Running containers! 
3. Running inside containers
Building: puppet apply 
FROM ubuntu:14.04 
! 
RUN apt-get -y update 
RUN apt-get -y install ruby 
RUN gem install puppet 
RUN puppet module install puppetlabs/ntp 
RUN puppet apply -e 'include "::ntp"'
Building: puppet agent 
FROM ubuntu:14.04 
! 
RUN apt-get -y update 
RUN apt-get -y install ruby 
RUN gem install puppet 
RUN puppet agent -t —server my_host
Building: puppet apply 
FROM jamtur01/puppetbase 
MAINTAINER James Turnbull "james@lovedthanlost.net" 
! 
RUN apt-get -y -q install wget git-core 
ADD Puppetfile / 
RUN librarian-puppet install 
RUN puppet apply --modulepath=/modules -e "class 
{ 'nginx': }" 
RUN echo "daemon off;" >> /etc/nginx/nginx.conf 
EXPOSE 80 
CMD ["nginx"]
System?
Running docker with puppet 
docker::run { 'helloworld': 
image => 'ubuntu:precise', 
command => '/bin/sh -c "while true; do echo hello 
world; sleep 1; done"', 
}
Puppet Agent on a 
Container?
Container == VM ?
Puppet Agent on a 
Container? 
Only if you’re treating it as a VM
Container == PID? 
No syslogd, no sshd, no puppet agent
Container == PID?
Bye
Idempotence 
The state looked like this 
I ran the function again 
The state looked like this

Automating Docker Containers with Puppet 2014 10-13

  • 1.
    Automating Docker Containerswith Puppet Kylo Ginsberg kylo@puppetlabs.com @kylog irc: kylo
  • 2.
  • 3.
    So you canwrite: package { ‘ntp’:! ensure => installed,! }! file { ‘/etc/ntp.conf’:! ensure => file,! source => ‘/root/example/ntp.conf’,! mode => ‘0444’,! }! service { ‘ntp’:! ensure => running,! }
  • 4.
  • 5.
    Instead write include‘::ntp' or customize: class { '::ntp':! servers => [ 'ntp1.corp.com', 'ntp2.corp.com' ],! }
  • 6.
    Puppet System Configuration Declarative Language Resource Abstraction
  • 7.
    Two ways torun code: puppet apply puppet agent
  • 8.
    Docker and Puppet 1. Building containers! 2. Running containers! 3. Running inside containers
  • 9.
    Building: puppet apply FROM ubuntu:14.04 ! RUN apt-get -y update RUN apt-get -y install ruby RUN gem install puppet RUN puppet module install puppetlabs/ntp RUN puppet apply -e 'include "::ntp"'
  • 10.
    Building: puppet agent FROM ubuntu:14.04 ! RUN apt-get -y update RUN apt-get -y install ruby RUN gem install puppet RUN puppet agent -t —server my_host
  • 11.
    Building: puppet apply FROM jamtur01/puppetbase MAINTAINER James Turnbull "james@lovedthanlost.net" ! RUN apt-get -y -q install wget git-core ADD Puppetfile / RUN librarian-puppet install RUN puppet apply --modulepath=/modules -e "class { 'nginx': }" RUN echo "daemon off;" >> /etc/nginx/nginx.conf EXPOSE 80 CMD ["nginx"]
  • 12.
  • 13.
    Running docker withpuppet docker::run { 'helloworld': image => 'ubuntu:precise', command => '/bin/sh -c "while true; do echo hello world; sleep 1; done"', }
  • 14.
    Puppet Agent ona Container?
  • 15.
  • 16.
    Puppet Agent ona Container? Only if you’re treating it as a VM
  • 17.
    Container == PID? No syslogd, no sshd, no puppet agent
  • 18.
  • 19.
  • 20.
    Idempotence The statelooked like this I ran the function again The state looked like this