On Github ingwarsw / cmw2016_jenkins_by_devops
by Karol Lassak | @IngwarSwenson
Karol Lassak
Przygotować VM do ćwiczeń
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
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'], }
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
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
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
forge 'https://forge.puppetlabs.com/' mod 'puppetlabs/apt' mod 'puppetlabs/firewall', '1.8.0'
include jenkins
jenkins::plugin { 'git': }
jenkins::job { 'test-build-job': config => template("${templates}/test-build-job.xml.erb" }
Najprostszy XML z konfiguracją zadania
falsetruefalsefalsefalsefalse
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
falsetruefalsefalsefalsefalse
job('example) { }
Przykład XML z konfiguracją zadania z DSL
falsetruefalsefalsefalsefalse<%= @jobDslGroovy %>truefalseIGNOREIGNOREJENKINS_ROOT.jobdsl.plugin.executedslscripts>