{"id":281761,"date":"2016-11-30T09:55:08","date_gmt":"2016-11-30T06:55:08","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=281761"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=281761","title":{"rendered":"\u0420\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 OpenSource Puppet 4 \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 Puppet masters. \u0427\u0430\u0441\u0442\u044c II. \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Puppet Masters"},"content":{"rendered":"<h4><a href=\"https:\/\/habrahabr.ru\/post\/316400\/\">\u0420\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 OpenSource Puppet 4 \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 Puppet masters. \u0427\u0430\u0441\u0442\u044c I. \u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f<\/a><\/h4>\n<p>  <\/p>\n<h4><a href=\"https:\/\/habrahabr.ru\/post\/316486\/\">\u0420\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 OpenSource Puppet 4 \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 Puppet masters. \u0427\u0430\u0441\u0442\u044c III. \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 puppet-db \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Puppet<\/a><\/h4>\n<h1>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 puppet<\/h1>\n<p>  <\/p>\n<h2>\u041e\u0431\u0449\u0438\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432<\/h2>\n<p>  \u041d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445 puppet-master01, puppet-master02 \u0438 \u043d\u0430 puppet-db \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 puppetlabs:  <\/p>\n<pre><code class=\"bash\">wget https:\/\/apt.puppetlabs.com\/puppetlabs-release-pc1-xenial.deb sudo dpkg -i puppetlabs-release-pc1-xenial.deb sudo apt update<\/code><\/pre>\n<p>  \u041d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445 puppet-master01, puppet-master02 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c puppet-\u0441\u0435\u0440\u0432\u0435\u0440:  <\/p>\n<pre><code class=\"bash\">sudo apt install puppetserver<\/code><\/pre>\n<p>  \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0430\u0434\u0440\u0435\u0441, \u043f\u043e\u0440\u0442 \u0438 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0435 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 \u0444\u0430\u0439\u043b\u0435 \/etc\/puppetlabs\/puppetserver\/conf.d\/webserver.conf, \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c:   <\/p>\n<pre><code class=\"bash\">client-auth: want ssl-host: 0.0.0.0 ssl-port: 8140<\/code><\/pre>\n<p>  \u041d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 puppet-db \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e puppet-\u0430\u0433\u0435\u043d\u0442\u0430:  <\/p>\n<pre><code class=\"bash\">sudo apt install puppet-agent<\/code><\/pre>\n<p>\u041e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u043d\u0430 puppet-db \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Puppet.<br \/>  <a name=\"habracut\"><\/a>  <\/p>\n<h2>\u041e\u0431\u0449\u0438\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 puppet-\u0430\u0433\u0435\u043d\u0442\u043e\u0432<\/h2>\n<p>  \u0412 \u0444\u0430\u0439\u043b \/etc\/puppetlabs\/puppet\/puppet.conf \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0438 \u0438\u043c\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430 puppet, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f (\u0438\u043c\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430):  <\/p>\n<pre><code class=\"bash\">[main] server = puppetmaster.example.com ca_server = puppet-master01.example.com<\/code><\/pre>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u044d\u0442\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 <a href=\"https:\/\/docs.puppet.com\/guides\/scaling_multiple_masters.html#method-a-individual-agent-configuration\">\u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u043b\u044f \u0432\u0441\u0435\u0445 puppet-\u0430\u0433\u0435\u043d\u0442\u043e\u0432 \u043d\u0430 \u0432\u0441\u0435\u0445 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0445 \u0443\u0437\u043b\u0430\u0445<\/a>, \u0432 \u0442.\u0447. \u043d\u0430 puppet-db.<\/p>\n<h2>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043d\u043e\u0434\u044b puppet-master01<\/h2>\n<p>  \u0421\u0435\u0440\u0432\u0435\u0440 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 <a href=\"https:\/\/docs.puppet.com\/guides\/scaling_multiple_masters.html#centralize-the-certificate-authority\">\u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0437\u0430\u043f\u0443\u0449\u0435\u043d \u0432 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0435<\/a>. \u0423\u0431\u0435\u0434\u0438\u043c\u0441\u044f, \u0447\u0442\u043e \u0432 \u0444\u0430\u0439\u043b\u0435 \/etc\/puppetlabs\/puppetserver\/services.d\/ca.cfg \u0432\u043a\u043b\u044e\u0447\u0435\u043d \u0437\u0430\u043f\u0443\u0441\u043a \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438:  <\/p>\n<pre><code class=\"bash\">puppetlabs.services.ca.certificate-authority-service\/certificate-authority-service<\/code><\/pre>\n<p>\u0421\u0442\u0440\u043e\u043a\u0430 <b>\u041d\u0415<\/b> \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0437\u0430\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0430.<\/p>\n<p>  <a href=\"https:\/\/docs.puppet.com\/guides\/scaling_multiple_masters.html#before-running-puppet-agent-or-puppet-master\"><\/p>\n<h4>\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u043c \u0441\u043f\u0438\u0441\u043e\u043a DNS \u0438\u043c\u0435\u043d \u0441\u0435\u0440\u0432\u0435\u0440\u0430<\/h4>\n<p><\/a><br \/>  \u0412 \u0444\u0430\u0439\u043b\u0435 \/etc\/puppetlabs\/puppet\/puppet.conf \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c <a href=\"https:\/\/docs.puppet.com\/puppet\/latest\/reference\/configuration.html#dnsaltnames\">\u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u0438\u043c\u0435\u043d\u0430 DNS<\/a> \u0434\u043b\u044f puppet-master01, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 \u0441\u0435\u043a\u0446\u0438\u044e [main] \u0434\u043e\u0431\u0430\u0432\u0438\u043c:  <\/p>\n<pre><code class=\"bash\">dns_alt_names = puppet-master01,puppet-master01.example.com,puppetmaster,puppetmaster.example.com<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u044d\u0442\u0438 \u0438\u043c\u0435\u043d\u0430 \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u044b \u0432 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.<\/p>\n<p>  \u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0434\u043b\u044f puppet-master01 \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u0438\u043c\u0435\u043d DNS:  <\/p>\n<pre><code class=\"bash\">aspetrenko@puppet-master01:~$ sudo -i puppet cert generate puppet-master01.example.com --dns_alt_names=puppet-master01,puppet-master01.example.com,puppetmaster,puppetmaster.example.com Notice: puppet-master01.example.com.pem has a waiting certificate request Notice: Signed certificate request for puppet-master01.example.com.pem Notice: Removing file Puppet::SSL::CertificateRequest puppet-master01.example.com.pem at '\/etc\/puppetlabs\/puppet\/ssl\/ca\/requests\/puppet-master01.example.com.pem.pem' Notice: Removing file Puppet::SSL::CertificateRequest puppet-master01.example.com.pem at '\/etc\/puppetlabs\/puppet\/ssl\/certificate_requests\/puppet-master01.example.com.pem.pem'<\/code><\/pre>\n<p>  \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u043c puppet-\u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0430 puppet-master01:  <\/p>\n<pre><code class=\"bash\">sudo systemctl start puppetserver.service<\/code><\/pre>\n<h2>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043d\u043e\u0434\u044b puppet-master02<\/h2>\n<p>  \u041d\u0430 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445 puppet-master, \u043a\u0440\u043e\u043c\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e, \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u043a \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0432 \u0444\u0430\u0439\u043b\u0435 \/etc\/puppetlabs\/puppetserver\/services.d\/ca.cfg. \u041d\u0443\u0436\u043d\u043e \u0437\u0430\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0441 certificate-authority-service, \u0438 \u0440\u0430\u0441\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c sertificate-authority-disabled-service:  <\/p>\n<pre><code class=\"bash\"># To enable the CA service, leave the following line uncommented #puppetlabs.services.ca.certificate-authority-service\/certificate-authority-service # To disable the CA service, comment out the above line and uncomment the line below puppetlabs.services.ca.certificate-authority-disabled-service\/certificate-authority-disabled-service<\/code><\/pre>\n<p>  \u041d\u0430\u0441\u0442\u0440\u043e\u0438\u043c \u0441\u043f\u0438\u0441\u043e\u043a DNS \u0438\u043c\u0435\u043d \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0432 \u0444\u0430\u0439\u043b\u0435 \/etc\/puppetlabs\/puppet\/puppet.conf, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 \u0441\u0435\u043a\u0446\u0438\u044e [main] \u0434\u043e\u0431\u0430\u0432\u0438\u043c:  <\/p>\n<pre><code class=\"bash\">dns_alt_names = puppet-master02,puppet-master02.example.com,puppetmaster,puppetmaster.example.com<\/code><\/pre>\n<p>  \u0417\u0430\u043f\u0440\u043e\u0441\u0438\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0434\u043b\u044f puppet-master02 \u0443 puppet-master01:  <\/p>\n<pre><code class=\"bash\">aspetrenko@puppet-master02:~$ sudo -i puppet agent --test --waitforcert 60 Info: Creating a new SSL key for puppet-master02.example.com Info: Caching certificate for ca Info: csr_attributes file loading from \/etc\/puppetlabs\/puppet\/csr_attributes.yaml Info: Creating a new SSL certificate request for puppet-master02.example.com Info: Certificate Request fingerprint (SHA256): 16:67:D9:84:A3:50:B6:43:35:08:FE:BA:05:77:7C:C5:E7:3E:A5:D6:D1:00:BE:11:63:AB:6E:93:B7:37:0A:33 Info: Caching certificate for ca Info: Caching certificate for puppet-master02.example.com Info: Caching certificate_revocation_list for ca<\/code><\/pre>\n<p>  \u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u043c \u0437\u0430\u043f\u0440\u043e\u0441 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 \u043e\u0442 \u0430\u0433\u0435\u043d\u0442\u0430 puppet-master02 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 puppet-master01:  <\/p>\n<pre><code class=\"bash\">aspetrenko@puppet-master01:~$ sudo -i puppet cert sign puppet-master02.example.com --allow-dns-alt-names Signing Certificate Request for:   &quot;puppet-master02.example.com&quot; (SHA256) 16:67:D9:84:A3:50:B6:43:35:08:FE:BA:05:77:7C:C5:E7:3E:A5:D6:D1:00:BE:11:63:AB:6E:93:B7:37:0A:33 (alt names: &quot;DNS:puppet-master02&quot;, &quot;DNS:puppet-master02.example.com&quot;, &quot;DNS:puppetmaster&quot;, &quot;DNS:puppetmaster.example.com&quot;)  ** Notice: Signed certificate request for puppet-master02.example.com Notice: Removing file Puppet::SSL::CertificateRequest puppet-master02.example.com at '\/etc\/puppetlabs\/puppet\/ssl\/ca\/requests\/puppet-master02.example.com.pem'<\/code><\/pre>\n<p>  \u041f\u043e\u043b\u0443\u0447\u0438\u043c \u043e\u0442\u0432\u0435\u0442 \u0430\u0433\u0435\u043d\u0442\u0430 \u043d\u0430 puppet-master02:  <\/p>\n<pre><code class=\"bash\">Info: Using configured environment 'production' Info: Retrieving pluginfacts Info: Retrieving plugin Info: Caching catalog for puppet-master02.example.com Info: Applying configuration version '1477917008' Info: Creating state file \/opt\/puppetlabs\/puppet\/cache\/state\/state.yaml Notice: Applied catalog in 0.02 seconds<\/code><\/pre>\n<p>  \u041d\u0430 puppet-master01 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 \u044d\u0442\u043e\u0433\u043e:  <\/p>\n<pre><code class=\"bash\">aspetrenko@puppet-master01:~$ sudo -i puppet cert list -a + &quot;puppet-master01.example.com&quot; (SHA256) 1A:15:76:96:33:6E:F9:DA:9F:C3:8D:9E:FC:98:BA:FB:10:CF:FA:27:54:2C:F2:55:8D:B9:AA:6C:52:FA:9F:C1 (alt names: &quot;DNS:puppet-master01&quot;, &quot;DNS:puppet-master01.example.com&quot;, &quot;DNS:puppetmaster&quot;, &quot;DNS:puppetmaster.example.com&quot;) + &quot;puppet-master02.example.com&quot; (SHA256) 80:1B:2C:49:E3:16:C6:37:B5:FC:E2:40:6B:49:B8:9A:95:91:C1:76:9C:79:3D:D5:0A:81:29:1D:E6:C3:B6:52 (alt names: &quot;DNS:puppet-master02&quot;, &quot;DNS:puppet-master02.example.com&quot;, &quot;DNS:puppetmaster&quot;, &quot;DNS:puppetmaster.example.com&quot;)<\/code><\/pre>\n<p>  <b>\u0412\u041d\u0418\u041c\u0410\u041d\u0418\u0415!<\/b> \u041d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 \u0446\u0435\u043d\u0442\u0440\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \/etc\/puppetlabs\/puppet\/ssl\/ca\/ca_crl.pem \u0441 puppet-master01 \u043d\u0430 puppet-master02 \u0432 \u0442\u043e\u0436\u0435 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0430 \u0438 \u043f\u0440\u0430\u0432.<\/p>\n<p>  \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u043c puppet-\u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0430 puppet-master02:  <\/p>\n<pre><code class=\"bash\">sudo systemctl start puppetserver.service<\/code><\/pre>\n<h1>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 r10k \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u044b puppet-master01 \u0438 puppet-master02<\/h1>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 r10k<\/b><\/p>\n<div class=\"spoiler_text\"><a href=\"https:\/\/docs.puppet.com\/pe\/latest\/r10k.html\">docs.puppet.com\/pe\/latest\/r10k.html<\/a><br \/>  <a href=\"https:\/\/puppet.com\/blog\/git-workflows-puppet-and-r10k\">puppet.com\/blog\/git-workflows-puppet-and-r10k<\/a>  <\/div>\n<\/div>\n<p>  \u041d\u0430 \u0432\u0441\u0435\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445 puppet-master \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c git \u0438 rubygems:  <\/p>\n<pre><code class=\"bash\">sudo apt install git rubygems sudo gem install r10k<\/code><\/pre>\n<p>  \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f r10k \u0432 \u0433\u0440\u0443\u043f\u043f\u0443 puppet:  <\/p>\n<pre><code class=\"bash\">sudo usermod -a -G puppet r10k<\/code><\/pre>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u0434\u043b\u044f \u043a\u044d\u0448\u0430 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u0438 \u0434\u0430\u0434\u0438\u043c \u043d\u0430 \u043d\u0435\u0433\u043e \u043f\u0440\u0430\u0432\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e r10k \u0438 \u0433\u0440\u0443\u043f\u043f\u0435 puppet:  <\/p>\n<pre><code class=\"bash\">sudo mkdir -p \/var\/cache\/r10k sudo chown -R r10k:puppet \/var\/cache\/r10k sudo chmod 2775 \/var\/cache\/r10k<\/code><\/pre>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 r10k:  <\/p>\n<pre><code class=\"bash\">sudo mkdir -p \/etc\/puppetlabs\/r10k sudo chown -R puppet:puppet \/etc\/puppetlabs sudo chmod -R g+w \/etc\/puppetlabs<\/code><\/pre>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435 puppet-master \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c <a href=\"https:\/\/docs.puppet.com\/pe\/3.8\/r10k_yaml.html#editing-r10kyaml\">\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b<\/a> \/etc\/puppetlabs\/r10k\/r10k.yaml. \u0415\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0432\u0438\u0441\u0435\u0442\u044c \u043e\u0442 \u0442\u043e\u0433\u043e, <a href=\"https:\/\/github.com\/puppetlabs\/r10k\/blob\/master\/doc\/git\/providers.mkd\">\u043a\u0430\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430 \u0432\u044b \u0431\u0443\u0434\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c<\/a> \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 git-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u043c.<\/p>\n<h2>Shellgit-\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440<\/h2>\n<p>  \u042d\u0442\u043e\u0442 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0438 \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442 \u0432 \u0442\u0435\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445, \u0435\u0441\u043b\u0438 \u0432\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0435\u0441\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c git-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 \u0431\u0435\u0437 git-\u0441\u0435\u0440\u0432\u0435\u0440\u0430; \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0439 git-\u0441\u0435\u0440\u0432\u0435\u0440 \u0441 \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u043c \u043f\u043e ssh.<br \/>  \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043a\u043e\u043d\u0444\u0438\u0443\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \/etc\/puppetlabs\/r10k\/r10k.yaml:  <\/p>\n<pre><code class=\"bash\"># location for cached repos :cachedir: '\/var\/cache\/r10k'  git:   provider: 'shellgit'  # git repositories containing environments :sources:   :base:     remote: 'gitolite3@sgl-git.example.com:puppet-environments' # \u0414\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044e \u0432 gitolite3 #    remote: '\/srv\/puppet.git' # \u0414\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a shared \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044e \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 #    remote: 'ssh:\/\/aspetrenko@puppet-master01\/srv\/puppet.git' # \u0414\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e ssh \u043a \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044e \u0432 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u043c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435     basedir: '\/etc\/puppetlabs\/code\/environments\/'<\/code><\/pre>\n<p>  Shellgit provider \u043d\u0435 \u0443\u043c\u0435\u0435\u0442 \u0431\u0440\u0430\u0442\u044c \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u0437 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 r10k.yaml, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044e \u043d\u0430 gitolite \u0441 \u043d\u0443\u0436\u043d\u044b\u043c \u043a\u043b\u044e\u0447\u043e\u043c \u0437\u0430\u0434\u0430\u0434\u0438\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0432 \/r10k\/.ssh\/config:  <\/p>\n<pre><code class=\"bash\">host sgl-git.example.com   HostName sgl-git.example.com   IdentityFile \/home\/r10k\/.ssh\/r10k   User gitolite3<\/code><\/pre>\n<h2>Rugged-\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440<\/h2>\n<p>  \u041d\u043e \u043b\u0443\u0447\u0448\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c rugged provider, \u0442\u043e\u0433\u0434\u0430 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0432 r10k.yaml \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u0438 \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u0422\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f\u043c\u0438 \u043f\u043e https-\u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443.<\/p>\n<p>  \u0412 Ubuntu \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 ssh \u0438 https \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430\u043c\u0438 \u0432 rugged \u0440\u0435\u0436\u0438\u043c\u0435 <a href=\"https:\/\/github.com\/puppetlabs\/r10k\/blob\/master\/doc\/git\/providers.mkd#ssh-configuration-1\">\u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 libssh2 \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 openssl \u0432\u043c\u0435\u0441\u0442\u043e libgcrypt<\/a>:  <\/p>\n<blockquote><p>libssh2 on Debian and Ubuntu is compiled against libgcrypto instead of OpenSSL due to licensing reasons, and unfortunately libgcrypto does not support a number of required operations, including reading from a private key file. You will need to either use shellgit or recompile your own libssh2-1 package to use OpenSSL on these distributions. <\/p><\/blockquote>\n<p>  \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 libssh2 \u0432\u0435\u0440\u0441\u0438\u0438 1.5.0-2.dsc \u0438\u0437 xenial <a href=\"https:\/\/github.com\/cloudfoundry-incubator\/bosh-workspace\/issues\/97\">\u043d\u0435 \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442<\/a>:  <\/p>\n<blockquote><p>The error sources to libssh2\/src\/libgcrypt.c. Elsewhere, libssh2 v 1.6.0 works without complaint. If updating isn&#8217;t available, as a workaround, use https instead of ssh to connect to private git repos. <\/p><\/blockquote>\n<p>  \u041f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0431\u044d\u043a\u043f\u043e\u0440\u0442 \u0438\u0437 yakkety.<br \/>  \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u043d\u0430 puppet-master01:  <\/p>\n<pre><code class=\"bash\">sudo apt install make cmake pkg-config libssh2-1-dev ruby-dev rubygems libevent-pthreads-2.0-5 openssl libssl-dev libz-dev libhttp-parser-dev<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"bash\">sudo apt install debhelper dh-autoreconf chrpath devscripts<\/code><\/pre>\n<p>  \u0438 \u043d\u0430 puppet-master02 (\u043f\u0430\u043a\u0435\u0442\u044b \u043d\u0443\u0436\u043d\u044b \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 rugged, \u0447\u0435\u0440\u0435\u0437 gem):  <\/p>\n<pre><code class=\"bash\">sudo apt install make cmake pkg-config ruby-dev rubygems libevent-pthreads-2.0-5 openssl libssl-dev libz-dev libhttp-parser-dev<\/code><\/pre>\n<p>  C\u043a\u0430\u0447\u0430\u0435\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 libssh2 \u0438 \u0440\u0430\u0441\u043f\u0430\u043a\u0443\u0435\u043c \u0438\u0445:  <\/p>\n<pre><code class=\"bash\">dget http:\/\/archive.ubuntu.com\/ubuntu\/pool\/universe\/libs\/libssh2\/libssh2_1.7.0-1.dsc dpkg-source -x .\/libssh2_1.7.0-1.dsc<\/code><\/pre>\n<p>  \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043a \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u043f\u0430\u043a\u0435\u0442\u0430 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043d\u0430\u0448\u0438\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u0445:  <\/p>\n<pre><code class=\"bash\">cd libssh2-1.7.0\/ dch -i<\/code><\/pre>\n<p>  \u041d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 changelog \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0432\u0440\u043e\u0434\u0435:  <\/p>\n<blockquote><p>* Backport from yakkety<br \/>  * Recompile with openssl support<\/p><\/blockquote>\n<p>  \u0417\u0430\u0440\u0435\u043b\u0438\u0437\u0438\u0442\u044c changelog:  <\/p>\n<pre><code class=\"bash\">dch -r<\/code><\/pre>\n<p>  \u0412 \u0444\u0430\u0439\u043b\u0435 \/libssh2-1.7.0\/debian\/control \u043f\u043e\u043c\u0435\u043d\u044f\u0435\u043c \u0432\u0441\u0435 \u0432\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f libgcrypt20-dev \u043d\u0430 libssl-dev:  <\/p>\n<pre><code class=\"bash\">sed -i 's\/libgcrypt20-dev\/libssl-dev\/g' debian\/control<\/code><\/pre>\n<p>  \u0418 \u0441\u043e\u0431\u0435\u0440\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 openssl \u0432\u043c\u0435\u0441\u0442\u043e libgcrypt:  <\/p>\n<pre><code class=\"bash\">.\/configure --with-openssl --without-libgcrypt dpkg-buildpackage -rfakeroot<\/code><\/pre>\n<p>  \u041d\u0435 \u0437\u0430\u0431\u0443\u0434\u0435\u043c \u0443\u0434\u0430\u043b\u0438\u0442\u044c libssh2-1-dev \u043e\u0442 \u0441\u0442\u0430\u0440\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 libssh2-1:  <\/p>\n<pre><code class=\"bash\">sudo apt remove libssh2-1-dev<\/code><\/pre>\n<p>  \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u043f\u0435\u0440\u0435\u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u043d\u0430 puppet-master01 \u0438 puppet-master02 (dev-\u043f\u0430\u043a\u0435\u0442 \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 rugged \u0447\u0435\u0440\u0435\u0437 gem):  <\/p>\n<pre><code class=\"bash\">sudo dpkg -i libssh2-1_1.7.0-1ubuntu1_amd64.deb libssh2-1-dbg_1.7.0-1ubuntu1_amd64.deb  libssh2-1-dev_1.7.0-1ubuntu1_amd64.deb<\/code><\/pre>\n<p>  \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c r10k \u0438 rugged:  <\/p>\n<pre><code class=\"bash\">sudo gem install r10k rugged<\/code><\/pre>\n<p>  \u0418 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \/etc\/puppetlabs\/r10k\/r10k.yaml \u043d\u0430 puppet-master01 \u0438 puppet-master02 \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c:  <\/p>\n<pre><code class=\"bash\"># location for cached repos :cachedir: '\/var\/cache\/r10k'  git:   provider: 'rugged'   private_key: '\/home\/r10k\/.ssh\/r10k'  # git repositories containing environments :sources:   :base:     remote: 'ssh:\/\/gitolite3@sgl-git.example.com\/puppet-environments'     basedir: '\/etc\/puppetlabs\/code\/environments\/'<\/code><\/pre>\n<h1>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f puppet-environments.git<\/h1>\n<p>  <\/p>\n<h2>\u041f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f<\/h2>\n<p>  \u0421\u043a\u043b\u043e\u043d\u0438\u0440\u0443\u0435\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 puppet-environments \u043d\u0430 \u0441\u0432\u043e\u0439 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440:  <\/p>\n<pre><code class=\"bash\">aspetrenko@aspetrenko-pc:~\/sgl-git$ git clone gitolite3@sgl-git:puppet-environments Cloning into 'puppet-environments'... warning: You appear to have cloned an empty repository. Checking connectivity... done.<\/code><\/pre>\n<p>  \u0417\u0430\u043f\u043e\u043b\u043d\u0438\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u043e\u0437\u044c\u043c\u0435\u043c \u043d\u0430 puppet-master01:  <\/p>\n<pre><code class=\"bash\">aspetrenko@aspetrenko-pc:~\/sgl-git$ scp -r aspetrenko@puppet-master01:\/etc\/puppetlabs\/code\/environments\/production\/* \/home\/GKSM\/aspetrenko\/sgl-git\/puppet-environments\/<\/code><\/pre>\n<p>  \u041f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0441\u0438\u043c\u0432\u043e\u043b\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0441\u044b\u043b\u043a\u0443 \u0434\u043b\u044f origin, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f production, \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0432 puppet:  <\/p>\n<pre><code class=\"bash\">aspetrenko@aspetrenko-pc:~\/sgl-git$ cd puppet-environments\/ aspetrenko@aspetrenko-pc:~\/sgl-git\/puppet-environments$ git symbolic-ref HEAD refs\/heads\/production aspetrenko@aspetrenko-pc:~\/sgl-git\/puppet-environments$ git push --set-upstream origin production<\/code><\/pre>\n<p>  \u0418 \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f:  <\/p>\n<pre><code class=\"bash\">aspetrenko@aspetrenko-pc:~\/sgl-git\/puppet-environments$ git add --all aspetrenko@aspetrenko-pc:~\/sgl-git\/puppet-environments$ git commit -a -m &quot;Initial commit&quot;<\/code><\/pre>\n<h2>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 post-recive \u0445\u0443\u043a\u0430<\/h2>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c post-recive \u0445\u0443\u043a \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438\u0438 puppet-environments, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c r10k \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445 puppet-master01 \u0438 puppet-master02, \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c:  <\/p>\n<pre><code class=\"bash\">aspetrenko@sgl-git:~$ sudo cat \/media\/data\/repositories\/puppet-environments.git\/hooks\/post-receive #!\/bin\/bash  umask 0002  while read oldrev newrev ref do     branch=$(echo $ref | cut -d\/ -f3)     echo     echo &quot;--&gt; Deploying ${branch}...&quot;     echo     ssh -i \/var\/lib\/gitolite3\/.ssh\/gitolite3 r10k@puppet-master01 &quot;r10k deploy environment $branch -p&quot;     ssh -i \/var\/lib\/gitolite3\/.ssh\/gitolite3 r10k@puppet-master02 &quot;r10k deploy environment $branch -p&quot;     # sometimes r10k gets permissions wrong too     find \/etc\/puppetlabs\/code\/environments\/$branch\/modules -type d -exec chmod 2775 {} \\; 2&gt; \/dev\/null     find \/etc\/puppetlabs\/code\/environments\/$branch\/modules -type f -exec chmod 664 {} \\; 2&gt; \/dev\/null done<\/code><\/pre>\n<p>  \u041d\u0435 \u0437\u0430\u0431\u0443\u0434\u0435\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u043c:  <\/p>\n<pre><code class=\"bash\">aspetrenko@sgl-git:~$ sudo chmod 0775 \/media\/data\/repositories\/puppet-environments.git\/hooks\/post-receive<\/code><\/pre>\n<h3>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 post-recive \u0445\u0443\u043a\u0430<\/h3>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e manifets \u0438 \u0444\u0430\u0439\u043b .keep, \u0447\u0442\u043e\u0431\u044b git \u043d\u0435 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043b \u043f\u0443\u0441\u0442\u0443\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e:  <\/p>\n<pre><code class=\"bash\">aspetrenko@aspetrenko-pc:~\/sgl-git\/puppet-environments$ touch manifests\/.keep aspetrenko@aspetrenko-pc:~\/sgl-git\/puppet-environments$ git add  manifests\/.keep aspetrenko@aspetrenko-pc:~\/sgl-git\/puppet-environments$ git commit manifests\/.keep -m &quot;Test commit&quot; [production 72bd288] Test commit  1 file changed, 0 insertions(+), 0 deletions(-)  create mode 100644 manifests\/.keep<\/code><\/pre>\n<p>  \u041e\u0442\u043f\u0440\u0430\u0432\u0438\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439:  <\/p>\n<pre><code class=\"bash\">aspetrenko@aspetrenko-pc:~\/sgl-git\/puppet-environments$ git push -u origin production<\/code><\/pre>\n<p>  \u0414\u0430\u043b\u044c\u0448\u0435 git-\u0445\u0443\u043a \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e r10k \u0432\u043d\u0435\u0441\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \/etc\/puppetlabs\/code\/environments \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435.<br \/>  \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u043d\u0430 puppet-master01 \u0438 puppet-master02.<\/p>\n<h2>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Librarian-puppet<\/h2>\n<p>  <a href=\"http:\/\/librarian-puppet.com\/\">librarian-puppet.com<\/a>  <\/p>\n<blockquote><p>Librarian-puppet \u0431\u0435\u0440\u0435\u0442 \u043d\u0430 \u0441\u0435\u0431\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0435\u0439 modules\/, \u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c (\u0435\u0441\u043b\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442) \u043c\u043e\u0434\u0443\u043b\u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0432 Puppetfile, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 modules\/ \u0432 Git.<\/p>\n<p>  Librarian-puppet \u2014 \u044d\u0442\u043e \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 (\u0430\u043a\u0430 Bundler \u0434\u043b\u044f gem) \u0434\u043b\u044f \u0432\u0430\u0448\u0435\u0439 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b puppet. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c librarian-puppet \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u043e\u0434\u0443\u043b\u044f\u043c\u0438 Puppet \u0432\u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u043e\u0433\u043e, \u0433\u0434\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u043c\u043e\u0434\u0443\u043b\u0438 \u0432 Puppet Forge, \u0432 Git-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0438\u043b\u0438 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0430\u043f\u043a\u0435.<br \/>  Librarian-puppet \u0443\u043c\u0435\u0435\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0432 Modulefile \u0438\u043b\u0438 metadata.json.<br \/>  Forge-\u043c\u043e\u0434\u0443\u043b\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b \u0438\u0437 Puppetlabs Forge \u0438\u043b\u0438 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 Forge \u0442\u0430\u043a\u043e\u0433\u043e \u043a\u0430\u043a Pulp.<br \/>  Git-\u043c\u043e\u0434\u0443\u043b\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b \u0438\u0437 \u0432\u0435\u0442\u043a\u0438, \u0442\u044d\u0433\u0430 \u0438\u043b\u0438 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043a\u043e\u043c\u043c\u0438\u0442\u0430.<br \/>  \u041c\u043e\u0434\u0443\u043b\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b \u0438\u0437 GitHub \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f tarballs, \u0431\u0435\u0437 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 Git.<br \/>  \u041c\u043e\u0434\u0443\u043b\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b \u0438\u0437 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0430 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435.<br \/>  \u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u044b \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e \u0431\u0435\u0437 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u0432\u0441\u0435 \u043c\u043e\u0434\u0443\u043b\u0438 \u0432 \u044f\u0432\u043d\u043e\u043c \u0432\u0438\u0434\u0435.<\/p><\/blockquote>\n<h3>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 librarian-puppet<\/h3>\n<p>  \u041d\u0430 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435, \u0433\u0434\u0435 \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u043c, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e gem \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c librarian-puppet:  <\/p>\n<pre><code class=\"bash\">aspetrenko@aspetrenko-pc:~\/sgl-git\/puppet-environments$ sudo gem install librarian-puppet<\/code><\/pre>\n<p>  \u0423\u0434\u0430\u043b\u0438\u043c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e modules \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u043c\u0438 \u0444\u0430\u0439\u043b\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u0438 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0438\u0437 \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f Puppet:  <\/p>\n<pre><code class=\"bash\">aspetrenko@aspetrenko-pc:~\/sgl-git\/puppet-environments$ git rm -rf modules<\/code><\/pre>\n<p>  \u041f\u0440\u043e\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c librarian-puppet \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438:  <\/p>\n<pre><code class=\"bash\">aspetrenko@aspetrenko-pc:~\/sgl-git\/puppet-environments$ librarian-puppet init<\/code><\/pre>\n<p>  \u0417\u0430\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0443 \u0441 metadata \u0432 Puppetfile.<br \/>  \u041f\u0440\u0438\u0432\u0435\u0434\u0435\u043c Puppetfile \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u0438\u0434\u0443:  <\/p>\n<pre><code class=\"bash\">aspetrenko@aspetrenko-pc:~\/sgl-git\/puppet-environments$ cat Puppetfile  #!\/usr\/bin\/env ruby #^syntax detection  forge &quot;https:\/\/forgeapi.puppetlabs.com&quot;  # use dependencies defined in metadata.json # metadata  # use dependencies defined in Modulefile # modulefile  # A module from the Puppet Forge mod 'puppetlabs-stdlib' mod 'puppetlabs-ntp' mod 'puppetlabs-puppetdb' mod 'puppetlabs-firewall'    # For puppetlabs-puppetdb mod 'puppetlabs-inifile'     # For puppetlabs-puppetdb mod 'puppetlabs-postgresql'  # For puppetlabs-puppetdb mod 'puppetlabs-apt'         # For puppetlabs-puppetdb mod 'puppetlabs-concat'      # For puppetlabs-puppetdb<\/code><\/pre>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0444\u0430\u0439\u043b .keep \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 modules, \u0447\u0442\u043e\u0431\u044b git \u043d\u0435 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043b \u043f\u0443\u0441\u0442\u0443\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e:  <\/p>\n<pre><code class=\"bash\">aspetrenko@aspetrenko-pc:~\/sgl-git\/puppet-environments$ touch modules\/.keep<\/code><\/pre>\n<p>  \u0414\u043e\u0431\u0430\u0432\u0438\u043c, \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u044b librarian-puppet init, \u0444\u0430\u0439\u043b\u044b \u0432 git, \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u044b puppet-master01 \u0438 puppet-master02:  <\/p>\n<pre><code class=\"bash\">git add --all git commit -a -m &quot;librarian-puppet init&quot; git push -u origin production<\/code><\/pre>\n<p>  \u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u0431\u044b\u043b\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e, \u0442\u043e \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 \/etc\/puppetlabs\/code\/environments\/production\/modules\/ \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445 \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u043e\u044f\u0432\u0438\u0442\u044c\u0441\u044f \u043c\u043e\u0434\u0443\u043b\u0438 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u0432 Puppetfile.<\/p>\n<h4><a href=\"https:\/\/habrahabr.ru\/post\/316486\/\">\u0420\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 OpenSource Puppet 4 \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 Puppet masters. \u0427\u0430\u0441\u0442\u044c III. \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 puppet-db \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Puppet<\/a><\/h4>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habrahabr.ru\/post\/316482\/\"> https:\/\/habrahabr.ru\/post\/316482\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<h4><a href=\"https:\/\/habrahabr.ru\/post\/316400\/\">\u0420\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 OpenSource Puppet 4 \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 Puppet masters. \u0427\u0430\u0441\u0442\u044c I. \u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f<\/a><\/h4>\n<p>  <\/p>\n<h4><a href=\"https:\/\/habrahabr.ru\/post\/316486\/\">\u0420\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 OpenSource Puppet 4 \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 Puppet masters. \u0427\u0430\u0441\u0442\u044c III. \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 puppet-db \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Puppet<\/a><\/h4>\n<h1>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 puppet<\/h1>\n<p>  <\/p>\n<h2>\u041e\u0431\u0449\u0438\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432<\/h2>\n<p>  \u041d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445 puppet-master01, puppet-master02 \u0438 \u043d\u0430 puppet-db \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 puppetlabs:  <\/p>\n<pre><code class=\"bash\">wget https:\/\/apt.puppetlabs.com\/puppetlabs-release-pc1-xenial.deb sudo dpkg -i puppetlabs-release-pc1-xenial.deb sudo apt update<\/code><\/pre>\n<p>  \u041d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445 puppet-master01, puppet-master02 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c puppet-\u0441\u0435\u0440\u0432\u0435\u0440:  <\/p>\n<pre><code class=\"bash\">sudo apt install puppetserver<\/code><\/pre>\n<p>  \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0430\u0434\u0440\u0435\u0441, \u043f\u043e\u0440\u0442 \u0438 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0435 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 \u0444\u0430\u0439\u043b\u0435 \/etc\/puppetlabs\/puppetserver\/conf.d\/webserver.conf, \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c:   <\/p>\n<pre><code class=\"bash\">client-auth: want ssl-host: 0.0.0.0 ssl-port: 8140<\/code><\/pre>\n<p>  \u041d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 puppet-db \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e puppet-\u0430\u0433\u0435\u043d\u0442\u0430:  <\/p>\n<pre><code class=\"bash\">sudo apt install puppet-agent<\/code><\/pre>\n<p>\u041e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u043d\u0430 puppet-db \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Puppet.  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-281761","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/281761","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=281761"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/281761\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=281761"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=281761"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=281761"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}