{"id":284329,"date":"2017-04-03T10:25:02","date_gmt":"2017-04-03T06:25:02","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=284329"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=284329","title":{"rendered":"Continuous delivery \u0441 Travis CI \u0438 Ansible"},"content":{"rendered":"<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/d68\/e2a\/eeb\/d68e2aeebe784eba8308f6469da107e5.png\"\/><br \/>  \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 (<a href=\"https:\/\/en.wikipedia.org\/wiki\/Continuous_delivery\">Continuous delivery CD<\/a>) \u0434\u043b\u044f \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 c github.com<\/p>\n<p>  H\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e:  <\/p>\n<ul>\n<li>\u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u043d\u0430 <a href=\"https:\/\/github.com\">github.com<\/a><\/li>\n<li>\u0421\u0435\u0440\u0432\u0435\u0440 \u0434\u043b\u044f Ansible (\u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 ip: 1.1.1.1)<\/li>\n<li>\u0421\u0435\u0440\u0432\u0435\u0440 \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 (\u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 ip: 2.2.2.2)<\/li>\n<li>\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0430 \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c<\/li>\n<li>\u0411\u0430\u0437\u043e\u0432\u044b\u0435 \u0437\u043d\u0430\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435, <a href=\"https:\/\/travis-ci.org\">Travis CI<\/a> \u0438 <a href=\"https:\/\/www.ansible.com\">Ansible<\/a><\/li>\n<\/ul>\n<p>  <a name=\"habracut\"><\/a><\/p>\n<h3>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u044b \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442<\/h3>\n<p>  <\/p>\n<pre><code class=\"bash\">[ root@2.2.2.2 ] adduser ansible #\u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0438\u0437 \u043f\u043e\u0434 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e Ansible \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0438 \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0435\u043c \u043d\u0430\u0448 \u043f\u0440\u043e\u0435\u043a\u0442 [ root@2.2.2.2 ] su - ansible [ ansible@2.2.2.2 ] ssh-keygen -t rsa -b 4096 -C 'github' -f ~\/.ssh\/github_key #\u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043b\u044e\u0447 \u0431\u0435\u0437 passphrase \u0434\u043b\u044f \u0434\u0435\u043f\u043b\u043e\u044f \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f [ ansible@2.2.2.2 ] eval &quot;$(ssh-agent -s)&quot;\u2028 [ ansible@2.2.2.2 ] ssh-add ~\/.ssh\/github_key [ ansible@2.2.2.2 ] cat ~\/.ssh\/github_key.pub #\u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d \u0438 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 github_key.pub <\/code><\/pre>\n<p>  \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 <i>github_key.pub<\/i> \u0432 \u043a\u043b\u044e\u0447\u0438 \u0434\u043b\u044f \u0434\u0435\u043f\u043b\u043e\u044f \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u043d\u0430 github.com<br \/>  (\u0412 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f github.com \u0432\u043a\u043b\u0430\u0434\u043a\u0430 \u00abDeploy keys\u00bb)<\/p>\n<h3>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0441 Ansible<\/h3>\n<p>  <\/p>\n<pre><code class=\"bash\">[ root@1.1.1.1 ] yum install ansible [ root@1.1.1.1 ] adduser ansible #\u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0438\u0437 \u043f\u043e\u0434 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e Travis \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u043d\u0430 \u044d\u0442\u043e\u0442 \u0441\u0435\u0440\u0432\u0435\u0440 [ root@1.1.1.1 ] su - ansible [ ansible@1.1.1.1 ] ssh-keygen -t rsa -b 4096 -C 'ansible' -f ~\/.ssh\/ansible_key #\u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043b\u044e\u0447 \u0431\u0435\u0437 passphrase \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u0441 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c [ ansible@1.1.1.1 ] eval &quot;$(ssh-agent -s)&quot;\u2028 [ ansible@1.1.1.1 ] ssh-add ~\/.ssh\/ansible_key [ ansible@1.1.1.1 ] cat ~\/.ssh\/ansible_key.pub #\u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d \u0438 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u043a\u043b\u044e\u0447  ansible_key.pub <\/code><\/pre>\n<p>  \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 <i>ansible_key.pub<\/i> \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/p>\n<pre><code class=\"bash\">[ ansible@2.2.2.2 ] mcedit .ssh\/authorized_keys [ ansible@2.2.2.2 ] chmod 600 .ssh\/authorized_keys <\/code><\/pre>\n<p>  \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0444\u0430\u0439\u043b <i>hosts.yml<\/i> ip \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430  <\/p>\n<pre><code class=\"bash\">[ ansible@1.1.1.1 ] mcedit \/path\/to\/ansible\/hosts.yml<\/code><\/pre>\n<p>  <i>hosts.yml<\/i>  <\/p>\n<pre><code>[ansible] 2.2.2.2 <\/code><\/pre>\n<p>  \u041d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 <b>playbook<\/b>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0432\u0435\u0442\u043a\u0438 <b>master<\/b>  <\/p>\n<pre><code class=\"bash\">[ ansible@1.1.1.1 ] mcedit \/path\/to\/ansible\/playbook.yml <\/code><\/pre>\n<p>  <i>playbook.yml<\/i>  <\/p>\n<pre><code>- hosts: all    user: ansible    tasks:        - name: Clone git repo          git:              repo: ssh:\/\/git@github.com\/{github_username}\/{github_repo}.git              dest: \/home\/ansible\/var\/www\/{github_repo}              version: master              accept_hostkey: yes              force: yes <\/code><\/pre>\n<h3>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Travis<\/h3>\n<p>  \u0417\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0441\u0430\u0439\u0442\u0435 <a href=\"https:\/\/travis-ci.org\">travis-ci.org<\/a> \u0447\u0435\u0440\u0435\u0437 \u0441\u0432\u043e\u0439 \u0430\u043a\u043a\u0430\u0443\u043d\u0442 <a href=\"https:\/\/github.com\">github.com<\/a><br \/>  \u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f<br \/>  \u0412 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f Travis \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c:  <\/p>\n<ul>\n<li>Build only if .travis.yml is present<\/li>\n<li>Build branch updates<\/li>\n<\/ul>\n<p>  \u041d\u0430 \u0441\u0432\u043e\u0435\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435, \u0433\u0434\u0435 \u0443 \u0432\u0430\u0441 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442 \u043f\u0440\u043e\u0435\u043a\u0442<br \/>  \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0443\u0442\u0438\u043b\u0438\u0442\u0443 <b>travis<\/b> \u0438 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f  <\/p>\n<pre><code class=\"bash\">[ user@local ] gem install travis [ user@local ] travis login --auto <\/code><\/pre>\n<p>  \u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c <b>ssh<\/b> \u043a\u043b\u044e\u0447 \u0431\u0435\u0437 <b>passphrase<\/b>, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e <b>Travis<\/b> \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443 <b>Ansible<\/b><\/p>\n<pre><code class=\"bash\">[ user@local ] ssh-keygen -t rsa -b 4096 -C 'travis' -f travis_key #\u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043b\u044e\u0447 \u0431\u0435\u0437 passphrase \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f Travis \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u0441 Ansible [ user@local ] cat travis_key.pub #\u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d \u0438 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u043a\u043b\u044e\u0447  travis_key.pub <\/code><\/pre>\n<p>  \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 <i>travis_key.pub<\/i> \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 <b>Ansible<\/b><br \/>  \u0432 \u0444\u0430\u0439\u043b \/home\/ansible\/.ssh\/authorized_keys  <\/p>\n<pre><code class=\"bash\">  [ ansible@1.1.1.1 ] mcedit \/home\/ansible\/.ssh\/authorized_keys [ ansible@1.1.1.1 ] chmod 600 \/home\/ansible\/.ssh\/authorized_keys <\/code><\/pre>\n<p>  \u0417\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u0443\u0442\u0438\u043b\u0438\u0442\u043e\u0439 <b>travis<\/b>  <\/p>\n<pre><code class=\"bash\">[ user@local ] travis encrypt-file travis_key --add <\/code><\/pre>\n<p>  \u041d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u044f\u0432\u0438\u0442\u044c\u0441\u044f \u0444\u0430\u0439\u043b <i>travis_key.enc<\/i> \u0438 <i>.travis.yml<\/i><br \/>  \u0412 \u0444\u0430\u0439\u043b\u0435 <i>.travis.yml<\/i> \u0431\u0443\u0434\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0430 \u0434\u043b\u044f \u0434\u0435\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u043a\u043b\u044e\u0447\u0430 \u0432\u0440\u043e\u0434\u0435 \u044d\u0442\u043e\u0439  <\/p>\n<pre><code class=\"bash\">openssl aes-256-cbc -K $encrypted_412afa050e5f_key -iv $encrypted_412afa050e5f_iv -in travis_key.enc -out \/tmp\/travis_key -d <\/code><\/pre>\n<p>  \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043e\u0431\u0430 \u0444\u0430\u0439\u043b\u0430 \u0432 <b>git<\/b>  <\/p>\n<pre><code class=\"bash\">[ user@local ] git add travis_key.enc .travis.yml  <\/code><\/pre>\n<p>  \u041e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0442\u044c \u0444\u0430\u0439\u043b <i>.travis.yml<\/i>  <\/p>\n<pre><code class=\"bash\">[ user@local ] mcedit \/path\/to\/repo\/.travis.yml <\/code><\/pre>\n<p>  <i>.travis.yml<\/i>  <\/p>\n<pre><code>language: node_js #\u043f\u0440\u043e\u0435\u043a\u0442 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430 node_js install: true #\u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0438 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u0442\u0435\u0441\u0442\u044b sudo: false branches: #\u0434\u0435\u043f\u043b\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0431\u0443\u0434\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u0445 \u0432 \u0432\u0435\u0442\u043a\u0435 master   only:       - master script:     - openssl aes-256-cbc -K $encrypted_412afa050e5f_key -iv $encrypted_412afa050e5f_iv -in travis_key.enc -out \/tmp\/travis_key -d #\u0434\u0435\u0448\u0438\u0444\u0440\u0443\u0435\u043c \u043a\u043b\u044e\u0447     - eval &quot;$(ssh-agent -s)&quot;     - chmod 600 \/tmp\/travis_key     - ssh-add \/tmp\/travis_key     - ssh -o &quot;StrictHostKeyChecking no&quot; ansible@1.1.1.1 'ansible-playbook playbook.yml' #\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u0441\u044f \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443 Ansible \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c playbook <\/code><\/pre>\n<p>  \u0417\u0430\u043b\u0438\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 <b>git<\/b>  <\/p>\n<pre><code class=\"bash\">[ user@local ] git push origin master <\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u0432 <b>Travis<\/b> \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u044f\u0432\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 <b>Build<\/b><\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">Travis Build<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"bash\">The command &quot;openssl aes-256-cbc -K $encrypted_412afa050e5f_key -iv $encrypted_412afa050e5f_iv -in travis_key.enc -out \/tmp\/travis_key -d&quot; exited with 0.  0.01s$ eval &quot;$(ssh-agent -s)&quot; Agent pid 1842 The command &quot;eval &quot;$(ssh-agent -s)&quot;&quot; exited with 0.  0.01s$ chmod 600 \/tmp\/travis_key The command &quot;chmod 600 \/tmp\/travis_key&quot; exited with 0.  0.01s$ ssh-add \/tmp\/travis_key Identity added: \/tmp\/travis_key (\/tmp\/travis_key) The command &quot;ssh-add \/tmp\/travis_key&quot; exited with 0.  16.68s$ ssh -o &quot;StrictHostKeyChecking no&quot; ansible@2.2.2.2 'ansible-playbook playbook.yml' Warning: Permanently added '2.2.2.2' (ECDSA) to the list of known hosts.  PLAY [all] ********************************************************************* TASK [setup] ******************************************************************* ok: [2.2.2.2] TASK [Clone git repo] ********************************************************** changed: [2.2.2.2] PLAY RECAP ********************************************************************* 2.2.2.2               : ok=1   changed=1    unreachable=0    failed=0    The command &quot;ssh -o &quot;StrictHostKeyChecking no&quot; ansible@2.2.2.2 'ansible-playbook playbook.yml&quot; exited with 0. Done. Your build exited with 0. <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u0445 \u0432 \u0432\u0435\u0442\u043a\u0435 master \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c\u0441\u044f <b>Travis<\/b>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0437\u043e\u0432\u0435\u0442 <b>Ansible<\/b>, \u0430 \u0442\u043e\u0442 \u0432\u044b\u043b\u043e\u0436\u0438\u0442 \u0441\u0432\u0435\u0436\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0432\u0430\u0448\u0435\u0433\u043e \u043a\u043e\u0434\u0430 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0441 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c.<br \/>  \u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u043a\u043e\u043c\u0443 \u043d\u0438\u0431\u0443\u0434\u044c \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f \u044d\u0442\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f.<br \/> \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\/325438\/\"> https:\/\/habrahabr.ru\/post\/325438\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/d68\/e2a\/eeb\/d68e2aeebe784eba8308f6469da107e5.png\"\/><br \/>  \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 (<a href=\"https:\/\/en.wikipedia.org\/wiki\/Continuous_delivery\">Continuous delivery CD<\/a>) \u0434\u043b\u044f \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 c github.com<\/p>\n<p>  H\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e:  <\/p>\n<ul>\n<li>\u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u043d\u0430 <a href=\"https:\/\/github.com\">github.com<\/a><\/li>\n<li>\u0421\u0435\u0440\u0432\u0435\u0440 \u0434\u043b\u044f Ansible (\u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 ip: 1.1.1.1)<\/li>\n<li>\u0421\u0435\u0440\u0432\u0435\u0440 \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 (\u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 ip: 2.2.2.2)<\/li>\n<li>\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0430 \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c<\/li>\n<li>\u0411\u0430\u0437\u043e\u0432\u044b\u0435 \u0437\u043d\u0430\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435, <a href=\"https:\/\/travis-ci.org\">Travis CI<\/a> \u0438 <a href=\"https:\/\/www.ansible.com\">Ansible<\/a><\/li>\n<\/ul>\n<p>  <\/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-284329","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/284329","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=284329"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/284329\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=284329"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=284329"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=284329"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}