Χαϊδάρησ Δημήτρησ Επιβλέπων καθηγητήσ: Ψαρράσ Νικόλαοσ
Αυτοματιςμόσ Στην αγορϊ υπϊρχει αυξανόμενη τϊςη για την αυτοματοπούηςη των διαδικαςιών. Επύςησ, δύνεται μεγϊλη ςημαςύα ςτη δυνατότητα μαζικόσ διαχεύριςησ των ρυθμύςεων διαφόρων εφαρμογών, που εκτελούνται ςε όμοια ό ανόμοια ςυςτόματα.
Τα Πλεονεκτήματα Συνέπεια. Μεύωςη των λαθών που προϋρχονται από ανθρώπινο παρϊγοντα. Αποδοτικότητα. Λόγω τησ ύπαρξησ αυτοματιςμών. Κεντρικό διαχεύριςη. Διαθεςιμότητα. Μεύωςη του downtime. Ελάττωςη του κόςτουσ.
SysAdmin
SysAdmin
SysAdmin
SysAdmin
Puppet Agent Puppet Master
Τη δύναμη τησ αυτοματοπούηςησ των επαναλαμβανόμενων εργαςιών με ςυνϋπεια μεταξύ των εξυπηρετητών. Την ευκολύα ανϊπτυξησ νϋων εφαρμογών. Τη προςφορϊ ενεργόσ διαχεύριςησ τησ υποδομόσ.
Οριςμόσ
user { 'dchaidaris': ensure => present, gid => 'sysadmin', home => '/mnt/home/dchaidaris', user { 'dchaidaris': ensure => present, gid => 'staff', home => '/home/dchaidaris', user { 'dchaidaris': ensure => present, gid => 'sysadmin', home => '/mnt/home/dchaidaris',
Δοκιμή #puppet agent t --noop
Εφαρμογή
Αναφορά
Ποιοι Χρηςιμοποιοφν Το Puppet.
Εφαρμογή
Puppet Master master2.example.com 5.172.196.152 Puppet Agent agent1.example.com 5.172.196.144
Puppet Master master2.example.com 5.172.196.152 C:\Windows\System32\drivers\etc\hosts 5.172.196.144 wordpress.example.com 5.172.196.152 wordpress2.example.com Puppet Agent agent1.example.com 5.172.196.144
Hiera Κατϊ την ςυγγραφό κώδικα εύναι προβληματικό η ςυνύπαρξη των δεδομϋνων που χρηςιμοποιούνται ςτη ρύθμιςη των κλϊςεων με τον κώδικα Puppet. Λύςη εύναι ο διαχωριςμόσ των δεδομϋνων ρυθμύςεων και η αποθόκευςη τουσ ςε μια εξωτερικό πηγό δεδομϋνων. Αυτό τον ρόλο ϋχει το Hiera.
Προςφζρει Την εύκολη διαχεύριςη νϋων nodes, αποτρϋποντασ την επανϊληψη των ύδιων παραμϋτρων με την χρόςη προκαθοριςμϋνων τιμών για κϊποιουσ Agents. Ευκολύα ςτη χρόςη και εφαρμογό νϋων module που βρύςκονται διαθϋςιμα ςτο διαδύκτυο για λόψη. Ευκολύα ςτην δημιουργύα και διαμούραςη ςτο διαδύκτυο νϋων modules.
Δημιουργία ενόσ profile (1/3) #/etc/puppet/modules/profiles/manifests/wordpress.pp class profiles::wordpress { ## Hiera lookups $site_name = hiera('profiles::wordpress::site_name') $wordpress_user_password = hiera('profiles::wordpress::wordpress_user_password') $wordpress_root_password = hiera('profiles::wordpress::mysql_root_password') $wordpress_db_host = hiera('profiles::wordpress::wordpress_db_host') $wordpress_db_name = hiera('profiles::wordpress::wordpress_db_name') $wordpress_db_password = hiera('profiles::wordpress::wordpress_db_password') $wordpress_user = hiera('profiles::wordpress::wordpress_user') $wordpress_group = hiera('profiles::wordpress::wordpress_group') $wordpress_docroot = hiera('profiles::wordpress::wordpress_docroot') $wordpress_port = hiera('profiles::wordpress::wordpress_port')
Δημιουργία ενόσ profile (2/3) ## Create user group { 'wordpress': ensure => present, name => $wordpress_group, user { 'wordpress': ensure => present, gid => $wordpress_group, password => $wordpress_user_password, name => $wordpress_user, home => $wordpress_docroot, ## Configure mysql class { 'mysql::server': root_password => $wordpress_root_password, class { 'mysql::bindings': php_enable => true,
Δημιουργία ενόσ profile (3/3) ## Configure apache include apache include apache::mod::php apache::vhost { $site_name: port => $wordpress_port, docroot => $wordpress_docroot, ## Configure wordpress class { '::wordpress': install_dir => $wordpress_docroot, db_name => $wordpress_db_name, db_host => $wordpress_db_host, db_password => $wordpress_db_password,
/etc/puppet/hiera.yaml --- :backends: - yaml :hierarchy: - "node/%{::fqdn" - "location/%{::location" - "role/%{::role" - common :yaml: :datadir: /etc/puppet/hieradata :merge_behavior: deeper Η ιεραρχύα βαςύζεται ςε τρεισ δυναμικϋσ πηγϋσ δεδομϋνων και ςε μια ςτατικό πηγό.
Ανάθεςη τιμών για τον master2.example.com #/etc/puppet/hieradata/node/master2.example.com.yaml profiles::wordpress::site_name: 'wordpress2.example.com' profiles::wordpress::wordpress_user_password: 'wordpress2' profiles::wordpress::mysql_root_password: 'password' profiles::wordpress::wordpress_db_host: 'localhost' profiles::wordpress::wordpress_db_name: 'wordpress2' profiles::wordpress::wordpress_db_password: 'wordpress2' profiles::wordpress::wordpress_user: 'wordpress2' profiles::wordpress::wordpress_group: 'wordpress2' profiles::wordpress::wordpress_docroot: '/var/www/wordpress2' profiles::wordpress::wordpress_port: '80'
Ανάθεςη τιμών για όλουσ του υπόλοιπουσ #/etc/puppet/hieradata/common.yaml profiles::wordpress::site_name: 'wordpress.example.com' profiles::wordpress::wordpress_user_password: 'wordpress' profiles::wordpress::mysql_root_password: 'password' profiles::wordpress::wordpress_db_host: 'localhost' profiles::wordpress::wordpress_db_name: 'wordpress' profiles::wordpress::wordpress_db_password: 'wordpress' profiles::wordpress::wordpress_user: 'wordpress' profiles::wordpress::wordpress_group: 'wordpress' profiles::wordpress::wordpress_docroot: '/var/www/wordpress' profiles::wordpress::wordpress_port: '80'
Ανάθεςη κλάςεων #/etc/puppet/environments/production/manifests/site.pp node 'master2.example.com' { include profiles::wordpress node 'agent1.example.com' { include profiles::wordpress
Version - Control Το Git εύναι ϋνα ςύςτημα ελϋγχου διανεμόμενησ ϋκδοςησ και διαχεύριςησ πηγαύου κώδικα (SCM) με ϋμφαςη ςτην ταχύτητα, ςτην ακεραιότητα των δεδομϋνων και ςτην υποςτόριξη για κατανεμημϋνεσ μη γραμμικϋσ ροϋσ εργαςύασ. Ενςωμϊτωςη του με το Puppet. Δημιουργύα των branches development, testing, production. https://github.com/go2jimmys/puppet
Το Λειτουργικό Μοντζλο Deployment Configuration Language & Resource Abstraction Transactional Layer Ανϊπτυξη. Η γλώςςα διαχεύριςησ Puppet και το αφαιρετικό επύπεδο των resources. Το επύπεδο ςυναλλαγών.
Συναλλαγζσ Συλλογό γεγονότων (Hostname, IP, OS κτλπ), χρηςιμοποιώντασ το Facter. Αποςτολό τουσ ςτον Master μαζύ με αύτηςη καταλόγου. Δημιουργύα του καταλόγου ςτον Master για τον ςυγκεκριμϋνο Agent, ϋπειτα από μια διαδικαςύα ταξικόσ διαλογόσ και μεταγλώττιςησ Puppet κώδικα. Αποςτολό του καταλόγου ςτον Agent. Εφαρμογό των προσ εκτϋλεςη ενεργειών, που περιγρϊφονται ςτον κατϊλογο. Αναφορϊ τησ προόδου ςτον Master.
Indepotency Ένα περιβϊλλον υφύςταται αλλαγϋσ από το Puppet μόνο όταν απαιτούνται. Όταν δεν υπϊρχουν διαθϋςιμεσ ρυθμύςεισ προσ εφαρμογό για ϋναν Puppet Αgent ό όταν ϋχουν όδη εφαρμοςτεύ οι προβλεπόμενεσ ρυθμύςεισ, το Puppet δεν πραγματοποιεύ οποιαδόποτε αλλαγό ό ενϋργεια. Η ιδιότητα αυτό ονομϊζεται indepotency (ταυτοδύναμη ςυμπεριφορά). Βαςικό χαρακτηριςτικό του Puppet γιατύ παρϊγεται το ύδιο αποτϋλεςμα ανεξϊρτητα από το πλόθοσ των εκτελϋςεων.
Μοντζλο Ανάπτυξησ Πελϊτη εξυπηρετητό (Client Server) Αυτόνομο (Stand-Alone)
Διαδικαςία Πιςτοποίηςησ 1. Ο Αgent παρϊγει ϋνα ιδιωτικό κλειδύ που χρηςιμοποιεύ για την δημιουργύα του CSR (certificate signing request). 2. Το CSR αποςτϋλλεται μϋςω κρυπτογραφημϋνησ ςύνδεςησ SSL από τον Agent ςτον Master. 3. Ο Agent αναμϋνει την υπογραφό και την επιςτροφό του CSR από τον Master. 4. (Η ςύνδεςη τερματύζεται, αν δεν οριςτεύ η επιλογό waitforcert ςτον Master.) 5. Το πιςτοποιητικό του νϋου Agent υπογρϊφεται ςτον Master. 6. Η διαδικαςύα ολοκληρώνεται με επαναςύνδεςη του Agent ςτον Master.
Η Γλώςςα Διαχείριςησ Puppet Το Puppet χρηςιμοποιεύ μια δηλωτικό γλώςςα. Με αυτόν, περιγρϊφεται η επιθυμητό κατϊςταςη ενόσ ςυςτόματοσ. Όχι τα βόματα εκτϋλεςησ για την πραγματοπούηςησ μιασ εργαςύασ. Τα αρχεύα που περιϋχουν κώδικα Puppet, ονομϊζονται Manifest.
Η Γλώςςα Διαχείριςησ Puppet (ςυνζχεια) Resources file service Package Etc. Classes Use once. Support inheritance. Defines Use many Support arguments.
Κλάςεισ Εύναι ςυλλογϋσ από Resources. Χρηςιμοποιούνται κυρύωσ για την ομαδοπούηςη των Resources, που ςχετύζονται με μια ςυγκεκριμϋνη εφαρμογό (Apache, Postfix, SSH, etc). Οι κλϊςεισ διαφοροποιούνται ςε δύο κατηγορύεσ: Σε όςεσ δεν δέχονται παραμϋτρουσ. Σε όςεσ δέχονται παραμϋτρουσ.
Μια κλάςη δίχωσ παραμζτρουσ class base::linux { file { '/etc/passwd': owner => 'root', group => 'root', mode => '0644', file { '/etc/shadow': owner => 'root', group => 'root', mode => '0440', Ονομαςύα κλϊςησ Resource τύπου αρχεύου Attributes
Μια κλάςη με παραμζτρουσ # Μια κλάζη με παραμέηροσς. Τίθεηαι προκαθοριζμένη ηιμή ζηην παράμεηρο $version. class apache ($version = 'latest') { package {'httpd': ensure => $version, # Γίνεηαι τρήζη ηης παραμέηροσ before => File['/etc/httpd.conf'], file {'/etc/httpd.conf': ensure => file, owner => 'httpd', content => template('apache/httpd.conf.erb'), # Αρτείο Template από ένα module service {'httpd': ensure => running, enable => true, subscribe => File['/etc/httpd.conf'],
Ανάθεςη κλάςεων Οι κλϊςεισ χαρακτηρύζονται ωσ Singletons. Το Puppet επιτρϋπει την δόλωςη μόνο ενόσ resource ύδιου τύπου με το ύδιο όνομα για ϋναν Agent. Διαφορετικϊ, προκαλεύται ςφϊλμα κατϊ την μεταγλώττιςη καταλόγου και διακοπό τησ εκτϋλεςησ του Puppet. Υπϊρχουν τρεισ διαφορετικού τρόποι ανϊθεςησ κλϊςεων ςτουσ Agent Nodes: Include-like ςυμπεριφορϊ Resource-like ςυμπεριφορϊ Με χρόςη ενόσ ENC (External Node Classifier)
Include-Like ςυμπεριφορά Χρόςη των ςυναρτόςεων include, require, contain και hiera_include. Η επαναλαμβανόμενη ανϊθεςη τησ ύδιασ κλϊςησ ςε ϋναν Agent δεν παρϊγει ςφϊλμα κατϊ τη μεταγλώττιςη. Προτεινόμενη μϋθοδοσ ανϊθεςησ κλϊςεων.
Include-Like ςυμπεριφορά Για τον προςδιοριςμό των τιμών των παραμϋτρων μιασ κλϊςησ, το Puppet εκτελεύ τα παρακϊτω βόματα επαναληπτικϊ για κϊθε παρϊμετρο: 1. Αναζότηςη τησ τιμόσ τησ παραμϋτρου ςε μια εξωτερικό πηγό δεδομϋνων χρηςιμοποιώντασ το μοντϋλο <class name>::<parameter name>. 2. Σε περύπτωςη αδυναμύασ εύρεςησ τησ ςε εξωτερικό πηγό, γύνεται χρόςη τησ προκαθοριςμϋνησ τιμόσ τησ παραμϋτρου (Που δηλώνεται κατϊ τον οριςμό τησ κλϊςησ). 3. Αποτυχύα τησ μεταγλώττιςησ με μόνυμα ςφϊλματοσ ςε περύπτωςη αδυναμύασ εύρεςησ τησ τιμόσ τησ παραμϋτρου.
Include-Like Παράδειγμα node 'web.example.com { include base::linux include base::linux # Το αποηέλεζμα είναι ηο ίδιο αθού η κλάζη εκηελείηαι μια θορά από ηον μεηαγλωηηιζηή. include base::linux, apache # Καλείηαι λίζηα κλάζεων $my_classes = ['base::linux', 'apache'] include $my_classes # Καλείηαι πίνακας ποσ περιέτει κλάζεις
Resource-Like ςυμπεριφορά Η επαναλαμβανόμενη ανϊθεςη τησ ύδιασ κλϊςησ ςε ϋναν Agent, υποχρεωτικϊ δεν επιτρέπεται. Σε περύπτωςη πολλαπλόσ δόλωςησ προκαλεύται ςφϊλμα κατϊ την μεταγλώττιςη του κώδικα. Κατϊ την κλόςη μιασ κλϊςησ με την παραπϊνω μϋθοδο, υπϊρχει η δυνατότητα αντικατϊςταςησ των παραμϋτρων τησ κλϊςησ κατϊ την μεταγλώττιςη.
Resource-Like ςυμπεριφορά Για τον προςδιοριςμό των τιμών των παραμϋτρων μιασ κλϊςησ, το Puppet εκτελεύ τα παρακϊτω βόματα επαναληπτικϊ για κϊθε παρϊμετρο: 1. Χρηςιμοποιεύ τα ορύςματα τησ κλϊςησ για να αντικαταςτόςει την τιμό τησ παραμϋτρου. 2. Αναζότηςη τησ τιμόσ τησ παραμϋτρου ςε μια εξωτερικό πηγό δεδομϋνων χρηςιμοποιώντασ το μοντϋλο <class name>::<parameter name>. 3. Σε περύπτωςη αδυναμύασ εύρεςησ τησ με κϊποια από τισ παραπϊνω μεθόδουσ, γύνεται χρόςη τησ προκαθοριςμϋνησ τιμόσ τησ παραμϋτρου (Που δηλώνεται κατϊ τον οριςμό τησ κλϊςησ). 4. Αποτυχύα τησ μεταγλώττιςησ με μόνυμα ςφϊλματοσ ςε περύπτωςη αδυναμύασ εύρεςησ τησ τιμόσ τησ παραμϋτρου.
Resource-Like Παράδειγμα # /etc/puppet/modules/webserver/manifests/params.pp class webserver::params { $packages = $operatingsystem? { /(?i-mx:ubuntu debian)/ => 'apache2', /(?i-mx:centos fedora redhat)/ => 'httpd', $vhost_dir = $operatingsystem? { /(?i-mx:ubuntu debian)/ => '/etc/apache2/sites-enabled', /(?i-mx:centos fedora redhat)/ => '/etc/httpd/conf.d', # /etc/puppet/modules/webserver/manifests/init.pp class webserver( $packages = $webserver::params::packages, $vhost_dir = $webserver::params::vhost_dir ) inherits webserver::params { package { $packages: ensure => present file { 'vhost_dir': path => $vhost_dir, ensure => directory, mode => '0750', owner => 'www-data', group => 'root',