by Karol Lassak | @IngwarSwenson
Karol Lassak
Przygotować VM do ćwiczeń
vagrant box add puppetlabs/ubuntu-14.04-64-nocm
Jedno z najbardziej dojrzałych narzędzi DevOps
package { 'postgresql':
ensure => 'installed',
}
service { 'postgresql':
ensure => 'running',
enable => true,
require => Package['postgresql'],
}
Nawet ludzie nie znający Puppeta są w stanie odgadnąć co może oznaczać taki zapis
Zasobem jest każdy pojedynczy deklaratywny element, który puppet może wymusić
service { 'apache2':
ensure => 'running',
enable => true,
}
Puppet posiada wiele wbudowanych zasobów
Zasoby tworzą graf w którym określamy kolejność wykonania
service { 'apache2':
ensure => 'running',
require => Package['apache2'],
}
package { 'apache2':
ensure => 'installed',
}
require, before, subscribe, notify
install -> configure ~> service
package { 'openssh-server':
ensure => 'installed',
}
file { '/etc/ssh/sshd_config.conf':
ensure => 'file',
content => template('myssh/sshd_config.conf.erb'),
require => Package['openssh-server'],
}
service { 'ssh':
ensure => 'installed',
subscribe => File['/etc/ssh/sshd_config.conf'],
}
puppetlabs/ubuntu-14.04-64-nocm
wget https://apt.puppetlabs.com/puppetlabs-release-trusty.deb
sudo dpkg -i puppetlabs-release-trusty.deb
sudo apt-get update && sudo apt-get install -y puppet
jenkins
/home/jenkins
, /home/jenkins/.ssh
puppet parser validate plik.pp
Kod puppet umieszczamy w:
mymodule # This outermost directory’s name matches the
│ # name of the module.
├── manifests # Contains all of the manifests in the module.
│ └── init.pp # Contains a class definition. This class’s
│ # name must match the module’s name.
├── metadata.json # Contains META information about module
├── spec # Contains spec tests for any plugins in the
│ # lib directory.
├── templates # Contains templates, which the module’s
│ # manifests can use.
├── files # Contains files to be sourced
├── tests # Contains examples showing how to declare
│ │ # the module's classes and defined types.
│ └── init.pp
└── lib # Contains plugins, like custom facts and
│ # custom resource types.
└── puppet
├── provider
└── type
Wiecej: http://slides.com/cardil/...
puppet module generate company/modulename
Generuje strukturę modułu
class apache ($version = 'latest') {
package {'httpd':
ensure => $version, # Using the class parameter from above
before => File['/etc/httpd.conf'],
}
file {'/etc/httpd.conf':
ensure => file,
owner => 'httpd',
content => template('apache/httpd.conf.erb'), # Template from a module
}
service {'httpd':
ensure => running,
enable => true,
subscribe => File['/etc/httpd.conf'],
}
}
# only once in catalog
# class is a resource
class { 'apache':
version => 'latest',
}
# or simply
include apache
include apache
# /etc/puppet/modules/apache/manifests/vhost.pp
define apache::vhost ($port, $docroot, $servername = $title, $vhost_name = '*') {
include apache # contains Package['httpd'] and Service['httpd']
include apache::params # contains common config settings
$vhost_dir = $apache::params::vhost_dir
file { "${vhost_dir}/${servername}.conf":
content => template('apache/vhost-default.conf.erb'),
# This template can access all of the parameters and variables from above.
owner => 'www',
group => 'www',
mode => '644',
require => Package['httpd'],
notify => Service['httpd'],
}
}
file { '/home/jenkins/.ssh/id_rsa.pub':
ensure => 'file',
mode => '0400',
# Plik w /etc/puppet/modules/myjenkins/files/id_rsa.pub
source => 'puppet:///modules/myjenkins/id_rsa.pub'
}
W modułach można umieścić pliki w katalogu: files/
file { '/etc/default/jenkins':
ensure => 'file',
mode => '0644',
# Plik w /etc/puppet/modules/myjenkins/templates/etc-jenkins.erb
content => template('myjenkins/etc-jenkins.erb')
}
W modułach można umieścić template w katalogu: templates/
## Jenkins settings file
JENKINS_USER=<% @user %>
Plik: /etc/puppet/modules/myjenkins/templates/etc-jenkins.erb
inazwisko/myjenkins
oraz inazwisko/common
i przenieść kod do klas i definicjipuppet module
puppet module list # listuje moduły
puppet search apt # szuka modułu po słowie kluczowym
puppet module install puppetlabs/apt # instaluje moduł
pisane przez Puppetlabs, testowane na wielu platformach
pisane przez innych autorów, zaakceptowane przez Puppetlabs jako jedne z najlepszych spełniających wymagania
Ilość ściągnięć, historia, kto developuje, zależności, instalacja pakietów systemu, wartości na sztywno
Puppetfile
forge 'https://forge.puppetlabs.com/'
mod 'puppetlabs/apt'
mod 'puppetlabs/firewall', '1.8.0'
gem install librarian-puppet
librarian-puppet update --verbose
Za w katalogu pliku Puppetfile
librarian-puppet
/etc/puppet/Puppetfile
librarian-puppet update --verbose
include jenkins
jenkins::plugin { 'git': }
jenkins::job { 'test-build-job':
config => template("${templates}/test-build-job.xml.erb"
}
Najprostszy XML z konfiguracją zadania
false
true
false
false
false
false
rtyler/jenkins
include jenkins
http://localhost:8080/
job('DSL-Tutorial-1-Test') {
scm {
git('git://github.com/jgritman/aws-sdk-test.git')
}
triggers {
scm('*/15 * * * *')
}
steps {
maven('-e clean test')
}
}
def jobName = 'example'
job(jobName) {
}
for(i in 0..10) {
job("DSL-Tutorial-1-Test-${i}") {
scm {
git('https://github.com/quidryan/aws-sdk-test.git')
}
steps {
maven("test -Dtest.suite=${i}")
}
}
}
def project = 'Netflix/asgard'
def branchApi = new URL("https://api.github.com/repos/${project}/branches")
def branches = new groovy.json.JsonSlurper().parse(branchApi.newReader())
branches.each {
def branchName = it.name
def jobName = "${project}-${branchName}".replaceAll('/','-')
job(jobName) {
scm {
git("https://github.com/${project}.git", branchName)
}
}
}
Pamiętacie XML z konfiguracją zadania dla Jenkinsa
false
true
false
false
false
false
job('example) {
}
Przykład XML z konfiguracją zadania z DSL
false
true
false
false
false
false
<%= @jobDslGroovy %>
true
false
IGNORE
IGNORE
JENKINS_ROOT
jenkins::job
z dowolną konfiguracją DSL