Zachu / Jani Korhonen

Linuxin keskitetty hallinta – Viikko 45

Tuntitehtävä

Tehtävänanto: Tee moduli joka asentaa sshd:n ja muuttaa sen porttia.

$ tree

.
└── ssh
    ├── manifests
    │   └── init.pp
    └── files
        └── sshd_config

$ cat ssh/manifests/init.pp

class ssh {
        package {'ssh':
                ensure => present,
        }
        service {'ssh':
                ensure => running,
                subscribe => File['/etc/ssh/sshd_config'],
                require => Package['ssh'],
        }
        file {'/etc/ssh/sshd_config':
                ensure => file,
                source => 'puppet:///modules/ssh/sshd_config',
                require => Package['ssh'],
        }
}

$ cat ssh/files/sshd_config

Port 2222
Protocol 2
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
UsePrivilegeSeparation yes

KeyRegenerationInterval 3600
ServerKeyBits 768

SyslogFacility AUTH
LogLevel INFO

LoginGraceTime 120
PermitRootLogin yes
StrictModes yes

RSAAuthentication yes
PubkeyAuthentication yes

IgnoreRhosts yes
RhostsRSAAuthentication no
HostbasedAuthentication no

PermitEmptyPasswords no

ChallengeResponseAuthentication no

X11Forwarding yes
X11DisplayOffset 10
PrintMotd no
PrintLastLog yes
TCPKeepAlive yes

AcceptEnv LANG LC_*

Subsystem sftp /usr/lib/openssh/sftp-server

UsePAM yes

Tai templatella

$ tree

.
└── ssh
    ├── manifests
    │   └── init.pp
    └── templates
        └── sshd_config.erb

$ cat ssh/manifests/init.pp

class ssh {
        $sshd_port=2222

        package {'ssh':
                ensure => present,
        }
        service {'ssh':
                ensure => running,
                subscribe => File['/etc/ssh/sshd_config'],
                require => Package['ssh'],
        }
        file {'/etc/ssh/sshd_config':
                ensure => file,
                content => template('ssh/sshd_config.erb'),
                require => Package['ssh'],
        }
}

$ cat ssh/templates/sshd_config.erb

Port <%= sshd_port %>
Protocol 2
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
UsePrivilegeSeparation yes

KeyRegenerationInterval 3600
ServerKeyBits 768

SyslogFacility AUTH
LogLevel INFO

LoginGraceTime 120
PermitRootLogin yes
StrictModes yes

RSAAuthentication yes
PubkeyAuthentication yes

IgnoreRhosts yes
RhostsRSAAuthentication no
HostbasedAuthentication no

PermitEmptyPasswords no

ChallengeResponseAuthentication no

X11Forwarding yes
X11DisplayOffset 10
PrintMotd no
PrintLastLog yes
TCPKeepAlive yes

AcceptEnv LANG LC_*

Subsystem sftp /usr/lib/openssh/sftp-server

UsePAM yes

Tai augeaksella

$ tree

.
└── ssh
    └── manifests
        └── init.pp

$ cat ssh/manifests/init.pp

class ssh {
        $sshd_port=2222

        package {'ssh':
                ensure => present,
        }
        service {'ssh':
                ensure => running,
                subscribe => Augeas['sshd_config'],
                require => Package['ssh'],
        }
        augeas { 'sshd_config':
                require => Package['ssh'],
                changes => [
                        "set /files/etc/ssh/sshd_config/Port ${sshd_port}",
                ],
        }
}

Ajaminen

$ sudo puppet apply --modulepath . -e 'include ssh'

Testaus

$ ssh -p 2222 localhost

Parametrisoitu luokka

Muutetaan viimeinen augeasta hyväksikäyttävä moduli vielä käyttämään parametrisoitua luokkaa hyväkseen. Dokumentoidaan moduli vielä oikeaoppisesti, ja olemme lähes valmiit siirtymään tuotantoon

$ cat ssh/manifests/init.pp

# = Class: ssh
#
# Installs and manages SSH daemon and optionally change the sshd port
#
# == Parameters:
#
# $sshd_port::  Port where SSH-daemon listens. Defaults to 22. Valid values:
#               port number
# 
# == Requires:
# 
# Nothing.
# 
# == Sample Usage:
#
# class {'ssh':
#       sshd_port => 2222,
# }
# class {'ssh':}
#

class ssh($sshd_port=22) {
        package {'ssh':
                ensure => present,
        }
        service {'ssh':
                ensure => running,
                subscribe => Augeas['sshd_config'],
                require => Package['ssh'],
        }
        augeas { 'sshd_config':
                require => Package['ssh'],
                changes => [
                        "set /files/etc/ssh/sshd_config/Port ${sshd_port}",
                ],
        }
}

Ajaminen

Komentoriviltä ajaminen muuttuu parametrisoidulla luokalla luonnollisesti hieman, koska parametrit pitää tosissaan antaa luokalle.

$ sudo puppet apply --modulepath . -e 'class{"ssh":sshd_port=>2222}'

Testaus

$ ssh -p 2222 localhost

Defined type

Defined typejä voi käyttää silloin, kun määritellään esimerkiksi jotain toistuvaa konfiguraatiotiedostoa. Tällainen voisi olla esimerkiksi Apachen VirtualHost-konfiguraatio, eli Apachen sivustot. Seuraavaksi seuraa seuraavaa: Apachen vhostien konfigurointimoduuli:

$ tree

.
└── apache
    ├── manifests
    │   ├── init.pp
    │   └── sites.pp
    └── templates
        └── vhost.erb

$ cat apache/manifests/init.pp

class apache{
	package {'apache2':
		ensure => installed,
	}
	service {'apache2':
		ensure => running,
		require => Package['apache2'],
	}

	define vhost ($serverName,$documentRoot="/var/www/${title}",$port=80) {
		include apache

		file {"/etc/apache2/sites-available/${serverName}":
			ensure => file,
			content => template('apache/vhost.erb'),
			require => Package['apache2'],
		}
		file {"/etc/apache2/sites-enabled/${serverName}":
			ensure => link,
			target => "/etc/apache2/sites-available/${serverName}",
			notify => Service['apache2'],
			require => Package['apache2'],
		}
		file {"${documentRoot}":
			ensure => directory,
		}
	}
}

$ cat apache/manifests/sites.pp

apache::vhost {'foobar':
        serverName => 'foo.bar',
}
apache::vhost {'omglol':
        documentRoot => '/var/www/jee',
        port => '8080',
        serverName => 'omg.lol',
}

$ cat apache/templates/vhost.erb

<VirtualHost *:<%= port %>>
        DocumentRoot <%= documentRoot %>
        ServerName <%= serverRoot %>
</VirtualHost>

Ajaminen

$ sudo sudo puppet apply --modulepath . apache/manifests/sites.pp

Testaus

Edellä tehdyssä apachen konfiguraatiossa ei otettu kantaa Apachen kuuntelemiin portteihin. Tästä syystä toinen sivusto, joka käyttää porttia 8080 ei toimi. Myöskään moduulissa ei otettu kantaa sivuston ServerNamejen olemassaoloon, mutta vastaavien hostien lisääminen tiedostoon /etc/hosts korjaa asian.

$ curl http://foo.bar/
$ curl http://omg.lol:8080/

Awaseroot-blogiin tutustuminen

Oikeastaan lähestulkoon ainoa minulle mielekkään oloinen blogipostaus Awaseroot-blogissa oli Puppet module for /etc/fstab mounts. Teinkin mounttaamisesta oman luokan. Käytän seuraavassa esimerkissä kovalevyosiota, jonka nimi on “Omega”.

$ cat omega/manifests/init.p

class omega {
	mount {'/mnt/Omega/':
		device => 'LABEL=Omega',
		fstype => 'auto',
		ensure => 'mounted',
		options => 'defaults',
		require => File['/mnt/Omega'],
	}
	file {'/mnt/Omega':
		ensure => 'directory',
	}
}

Ajaminen

$ sudo puppet apply --modulepath . -e 'include "omega"'

Testaus

$ df /mnt/Omega/
Filesystem     1K-blocks      Used Available Use% Mounted on
/dev/sdc1      976759804 876909920  99849884  90% /mnt/Omega

Kirjoita vastaus

Sähköpostia ei julkaista. Vaaditut kentät on merkitty *-merkillä.

Voit käyttää seuraavia HTML-tageja: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

Under heavy construction :(