{"id":1855,"date":"2017-08-10T11:55:21","date_gmt":"2017-08-10T09:55:21","guid":{"rendered":"http:\/\/miroslaw.borodziuk.eu\/?p=1855"},"modified":"2020-02-13T23:31:40","modified_gmt":"2020-02-13T22:31:40","slug":"instalacja-menadzera-konfiguracji-puppet","status":"publish","type":"post","link":"http:\/\/miro.borodziuk.eu\/index.php\/2017\/08\/10\/instalacja-menadzera-konfiguracji-puppet\/","title":{"rendered":"Instalacja menad\u017cera konfiguracji Puppet"},"content":{"rendered":"<p>Puppet dost\u0119pny jest w komercyjnej wersji Enterprise i bezp\u0142atnej OpenSource. W artykule tym zajmiemy si\u0119 instalacj\u0105 wersji OpenSource w systemie CentOS 7 ale wspomnimy te\u017c o wersji Enterprise.<\/p>\n<p><!--more--><\/p>\n<p>W sk\u0142ad pakietu Puppet (Enterprise) wchodz\u0105 komponenty po stronie agenta:<\/p>\n<ul>\n<li><em>Puppet agent<\/em> &#8211; klient, kt\u00f3ry komunikuje si\u0119 z serwerem.<\/li>\n<li><em>Puppet<\/em> &#8211; rdze\u0144 platformy zarz\u0105dzania konfiguracj\u0105. Zawiera specjalny j\u0119zyk programowania do opisywania po\u017c\u0105danego stanu systemu.<\/li>\n<li><em>Facter<\/em> &#8211; narz\u0119dzie profilowania systemu, wykorzystywane do wysy\u0142ania do serwera wa\u017cnych informacji o systemie.<\/li>\n<li><em>Hiera<\/em> &#8211; narz\u0119dzie u\u017cywane do konfiguracji w\u0142asnych klas.<\/li>\n<li><em>MCollective<\/em> (Marionette Collective) &#8211; framework do budowania systemu orkiestracji serwera lub r\u00f3wnoleg\u0142ego wykonywania zada\u0144.<\/li>\n<\/ul>\n<p>oraz komponenty po stronie serwera:<\/p>\n<ul>\n<li><em>Puppet Server<\/em> &#8211; aplikacja uruchamiana w JVM, kt\u00f3ra \u015bwiadczy us\u0142ugi agentom (klientom). Agenci pobieraj\u0105 od serwera katalogi z konfiguracj\u0105 w\u0119z\u0142\u00f3w.<\/li>\n<li><em>Puppet Master<\/em> &#8211; aplikacja Ruby, kt\u00f3ra kompiluje konfiguracje dla w\u0119z\u0142\u00f3w agent\u00f3w.<\/li>\n<li><em>PuppetDB<\/em> &#8211; baza, kt\u00f3ra zawiera dane generowane przez Puppeta i API do analizowania tych danych.<\/li>\n<li><em>R10k<\/em> &#8211; narz\u0119dzie zarz\u0105dzania kodem.<\/li>\n<li><em>Razor Server<\/em> &#8211; aplikacja do provisioningu system\u00f3w przez PXE.<\/li>\n<li><em>PostgreSQL<\/em> &#8211; DBMS u\u017cywana przez PuppetDB<\/li>\n<li><em>ActiveMQ<\/em> &#8211; messsage broker u\u017cywany przez MCollective.<\/li>\n<li><em>Nginx<\/em> &#8211; web serwer u\u017cywany przez Puppet Enterprise Console.<\/li>\n<li><em>Console<\/em> &#8211; interfejs webowy (tylko dla Puppet Enterpise).<\/li>\n<\/ul>\n<p>Narz\u0119dzia klienckie dla wersji Puppet Enterpise:<\/p>\n<ul>\n<li><em>Puppet orchestrator<\/em> &#8211; kontrola wdra\u017canych zmian w infrastrukturze.<\/li>\n<li><em>Puppet access<\/em> &#8211; narz\u0119dzie do autentykacji u\u017cytkownik\u00f3w.<\/li>\n<li><em>Code manager<\/em> &#8211; narz\u0119dzie do zarz\u0105dzania kodem i\u00a0 synchronizacji plik\u00f3w.<\/li>\n<li><em>PuppetDB CLI<\/em> &#8211; linia komend bazy <em>PuppetDB<\/em>.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #3366ff;\">Architektura Agent \/ Master.<\/span><\/p>\n<p>W tej architekturze na zarz\u0105dzanym w\u0119\u017ale uruchamiany jest agent, kt\u00f3ry co pewien czas wysy\u0142a pewne dane do serwera i pobiera z niego tzw. katalog. W katalogu tym znajduje si\u0119 konfiguracja po\u017c\u0105danego stanu agenta.<\/p>\n<p><span style=\"color: #3366ff;\">Architektura Stand-Alone.<\/span><\/p>\n<p>W tej architekturze\u00a0 ka\u017cdy w\u0119ze\u0142 ma swoj\u0105 kopi\u0119 konfiguracji i sam kompiluje sw\u00f3j katalog. Aplikacja puppet apply uruchamiana jest okresowo przez cron.<\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #3366ff;\">Wymagania wst\u0119pne.<\/span><br \/>\nPoniewa\u017c serwera Puppeta pracuje jako Certificate Authority (CA) czasy na serwerze i klientach powinny by\u0107 zsynchronizowane. Instalujemy zatem na serwerze i kliencie NTP oraz synchronizujemy czas:<\/p>\n<pre class=\"lang:sh decode:true \"># yum -y install ntpdate\r\n# ntpdate 0.centos.pool.ntp.org<\/pre>\n<p>Wszystkie w\u0119z\u0142y musz\u0105 mie\u0107 ponadto skonfigurowan\u0105 t\u0105 sam\u0105 stref\u0119 czasow\u0105:<\/p>\n<pre class=\"lang:sh decode:true \"># timedatectl set-timezone Europe\/Warsaw<\/pre>\n<p>Puppet korzysta z nazw domenowych host\u00f3w do komunikacji z zarz\u0105dzanymi hostami dlatego wa\u017cne aby wszystkie w\u0119z\u0142y mia\u0142y odpowiednie wpisy na serwerze DNS lub ewentualnie w plikach<code> \/etc\/hostname<\/code> na wszystkich w\u0119z\u0142ach.<\/p>\n<p><span style=\"color: #3366ff;\">Instalacja.<\/span><\/p>\n<p>Na serwerze i agentach instalujemy repozytorium PuppetLabs:<\/p>\n<pre class=\"lang:sh decode:true \"># rpm -Uvh https:\/\/yum.puppetlabs.com\/puppetlabs-release-pc1-el-7.noarch.rpm<\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #3366ff;\">Instalacja Puppet Serwera.<\/span><\/p>\n<pre class=\"lang:sh decode:true\"># yum install -y puppetserver<\/pre>\n<p>Domy\u015blnie Puppet Server skonfigurowany jest do wykorzystywania 2GB pami\u0119ci, co mo\u017cemy zmieni\u0107 w pliku:<\/p>\n<pre class=\"lang:sh decode:true\"># vim \/etc\/sysconfig\/puppetserver<\/pre>\n<p>Aby zmieni\u0107 u\u017cycie 2GB na 512MB, zast\u0119pujemy wpis:<\/p>\n<pre class=\"lang:sh decode:true \">JAVA_ARGS=\"-Xms2g -Xmx2g\"<\/pre>\n<p>wpisem:<\/p>\n<pre class=\"lang:sh decode:true \">JAVA_ARGS=\"-Xms512m -Xmx512m\"<\/pre>\n<p>Domy\u015blnie Puppet master nie wymaga \u017cadnej dodatkowej konfiguracji, mo\u017cna uruchomi\u0107 us\u0142ug\u0119 <em>puppetserver<\/em>. Je\u017celi chcemy jednak zmieni\u0107 nazw\u0119 domenow\u0105 Puppet mastera to robimy to w pliku:<\/p>\n<pre class=\"lang:sh decode:true\"># vim \/etc\/puppetlabs\/puppet\/puppet.conf\r\n\r\n[master]\r\ndns_alt_names =ppmaster.example.com,server\r\n[main]\r\ncertname = ppmaster.example.com\r\nserver = ppmaster.example.com\r\nenvironment = production\r\nruninterval = 1h<\/pre>\n<p>Uruchomienie i autostart Puppet Server.<\/p>\n<pre class=\"lang:sh decode:true \"># systemctl start puppetserver\r\n# systemctl enable puppetserver<\/pre>\n<p>Odblokowanie portu Puppeta na serwerze:<\/p>\n<pre class=\"lang:sh decode:true \"># firewall-cmd --permanent  --add-port=8140\/tcp\r\n# firewall-cmd --reload<\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #3366ff;\">Instalacja Puppet Agenta.<\/span><\/p>\n<pre class=\"lang:sh decode:true \"># yum install -y puppet-agent<\/pre>\n<p>Konfiguracja:<\/p>\n<pre class=\"lang:sh decode:true \"># vi \/etc\/puppetlabs\/puppet\/puppet.conf\r\n\r\n[main]\r\ncertname = ppagent1.example.com\r\nserver = ppserver.example.com\r\nenvironment = production\r\nruninterval = 1h<\/pre>\n<p>Zmienna runinterval kontroluje ile agent ma czeka\u0107 na ponowne pobranie katalogu z konfiguracj\u0105 z Puppet Servera. Mo\u017cna go zmieni\u0107 i warto\u015b\u0107 zapisa\u0107 tak\u017ce w sekundach je\u017celi jest taka potrzeba.<\/p>\n<p>Uruchomienie i autostart Puppet Agenta:<\/p>\n<pre class=\"lang:sh decode:true\"># \/opt\/puppetlabs\/bin\/puppet resource service puppet ensure=running enable=true<\/pre>\n<p>Wyj\u015bcie:<\/p>\n<pre class=\"lang:sh decode:true \">Notice: \/Service[puppet]\/ensure: ensure changed 'stopped' to 'running'\r\nservice { 'puppet':\r\nensure =&gt; 'running',\r\nenable =&gt; 'true',\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #3366ff;\">Sygnowanie certyfikatu agenta na serwerze.<\/span><\/p>\n<p>W architekturze agent\/master serwer musi zatwierdzi\u0107 certyfikat ka\u017cdego agenta, kt\u00f3ry si\u0119 b\u0119dzie do niego pod\u0142\u0105cza\u0142.<\/p>\n<p>Po stronie serwera wy\u015bwietlamy list\u0119 certyfikat\u00f3w oczekuj\u0105cych na zatwierdzenie:<\/p>\n<pre class=\"lang:sh decode:true\"># \/opt\/puppetlabs\/bin\/puppet cert list\r\n\r\n\"ppagent1.example.com\" (SHA256) 63:5C:F8:19:76:AE:16:A6:1C:43:12:FE:34:CE:57:EB:45:37:40:98:FF:3E:CC:FE:05:7E:AF:BF:E4:2C:31:FC<\/pre>\n<p>Mo\u017cna wylistowa\u0107 tak\u017ce zatwierdzone i nie zatwierdzone \u017c\u0105dania. Zatwierdzone \u017c\u0105dania zaczynaj\u0105 si\u0119 od znaku &#8220;+&#8221;:<\/p>\n<pre class=\"lang:sh decode:true \"># \/opt\/puppetlabs\/bin\/puppet cert list --all\r\n \"ppagent.example.com\" (SHA256) C8:F5:FB:13:BE:80:13:22:F2:20:B6:6B:38:5E:DB:10:BB:DF:B2:3C:9F:60:89:44:D8:1E:24:DE:7C:1B:29:50\r\n+ \"ppmaster..example.com\" (SHA256) E2:A5:94:F8:64:EA:4A:DF:EE:1C:F1:FD:DA:6E:5B:1E:78:1E:2E:95:03:11:0F:C0:0A:84:AA:F9:38:28:CF:BB (alt names: \"DNS:puppet\", \"DNS:ppmaster.example.com\")<\/pre>\n<p>Zatwierdzenie certyfikatu:<\/p>\n<pre class=\"lang:sh decode:true \"># \/opt\/puppetlabs\/bin\/puppet cert sign ppagent1.example.com\r\n\r\nSigning Certificate Request for:\r\n\"ppagent1.example.com\" (SHA256) 63:5C:F8:19:76:AE:16:A6:1C:43:12:FE:34:CE:57:EB:45:37:40:98:FF:3E:CC:FE:05:7E:AF:BF:E4:2C:31:FC\r\nNotice: Signed certificate request for ppagent1.example.com\r\nNotice: Removing file Puppet::SSL::CertificateRequest ppagent1.example.com at '\/etc\/puppetlabs\/puppet\/ssl\/ca\/requests\/ppagent1.example.com.pem'<\/pre>\n<p>Teraz klient Puppeta mo\u017ce komunikowa\u0107 si\u0119 z serwerem.<\/p>\n<p>Je\u017celi mamy wiele \u017c\u0105da\u0144 od agent\u00f3w o zatwierdzenie ich certyfikat\u00f3w mo\u017cemy je sygnowa\u0107 jedn\u0105 komend\u0105:<\/p>\n<pre class=\"lang:sh decode:true \"># \/opt\/puppetlabs\/bin\/puppet cert sign --all<\/pre>\n<p>Certyfikat mo\u017cemy odwo\u0142a\u0107 w razie potrzeby komend\u0105:<\/p>\n<pre class=\"lang:sh decode:true \"># \/opt\/puppetlabs\/bin\/puppet cert clean ppagent1.example.com<\/pre>\n<p>Po zatwierdzeniu certyfikatu przeprowadzamy test na kliencie:<\/p>\n<pre class=\"lang:sh decode:true \"># puppet agent --test\r\n\r\nInfo: Using configured environment 'production'\r\nInfo: Retrieving pluginfacts\r\nInfo: Retrieving plugin\r\nInfo: Loading facts\r\nInfo: Caching catalog for ppagent.netico.pl\r\nInfo: Applying configuration version '1505237337'\r\nNotice: Applied catalog in 0.47 seconds<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Puppet dost\u0119pny jest w komercyjnej wersji Enterprise i bezp\u0142atnej OpenSource. W artykule tym zajmiemy si\u0119 instalacj\u0105 wersji OpenSource w systemie CentOS 7 ale wspomnimy te\u017c o wersji Enterprise.<\/p>\n","protected":false},"author":1,"featured_media":1827,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[87],"tags":[],"_links":{"self":[{"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/posts\/1855"}],"collection":[{"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/comments?post=1855"}],"version-history":[{"count":16,"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/posts\/1855\/revisions"}],"predecessor-version":[{"id":1873,"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/posts\/1855\/revisions\/1873"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/media\/1827"}],"wp:attachment":[{"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/media?parent=1855"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/categories?post=1855"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/tags?post=1855"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}