Статьи

Развертывание и откат системной конфигурации с Capistrano, mcollective и Puppet — часть 2

Оглавление для непрерывной доставки конфигураций сервера

  1. Превращение 5-часового ручного создания и развертывания в единый кодовый коммит — часть 1
  2. Часть 2
  3. Испытание дворецкого — Часть 3

Я играл с Capistrano в течение последних нескольких недель, и недавно я создал способ использовать возможности Capistrano для «развертывания» и «отката» с Puppet и MCollective, чтобы дать мне полный контроль над развертыванием мои системные настройки.Мы начнем с Capistrano, так как это ключ ко всему этому — вам понадобятся следующие гемы:

  • Capistrano
  • Капистрано-доб
  • railsless-развернуть

Я привык к минималистским файлам заглавных букв, чтобы в ваших кукольных манифестах появился «cd» и набрал следующее:

capify

Теперь отредактируйте Capfile так, чтобы он выглядел следующим образом:

load 'deploy' if respond_to?(:namespace) # cap2 differentiator
require 'capistrano'
require 'rubygems'
require 'railsless-deploy'
load 'config/deploy'

Мы также собираемся использовать расширение ‘multistage’, чтобы убедиться, что мы только намеренно развертываем в нашей производственной среде, поэтому обновите файл config / deploy.rb и сделайте так, чтобы он выглядел следующим образом:

set :stages, %w[staging production]
set :deploy_to, "/usr/share/puppet/configuration"
set :deploy_via, :export
set :application, "Puppet Manifests"
set :repository, "git://gitserver/puppet.git"
set :scm, :git
set :default_stage, "staging"
set :use_sudo, false

require 'capistrano/ext/multistage'

Обратите внимание, что этапы должны быть установлены до включения многоступенчатого расширения, иначе они не будут настроены.

Если вы теперь запустите команду cap -vT, вы должны увидеть следующее среди других задач:

cap production # Установите целевую стадию на «производство».
cap staging # Установите целевую сцену на «staging».

Это означает, что теперь мы можем запускать «развертывание с ограниченным доступом» или «развертывание с ограниченным производством» в зависимости от того, что мы хотим сделать. Также обратите внимание, что мы установили стадию по умолчанию для промежуточной, так что мы должны явно указать, когда мы хотим развернуть в производство — это, мы надеемся, сократит любые случайные случаи непроверенных конфигураций, попадающих на живые серверы!

Наконец, обратите внимание, что мы отключили sudo — это делает вещи более безопасными (вы не можете заставить своего пользователя развертывания выполнять произвольный код на серверах!), А также упрощает настройку сервера (без редактирования / etc / sudoers) ,

Следующим шагом является создание учетной записи пользователя на puppetmaster для развертывания. Для простоты мы создадим пользователя с именем «deploy»:

root @ puppetmaster # useradd -m deploy

И назначьте его владельцем каталога декларации puppet (в нашем случае / usr / share / puppet / configuration):

root @ puppetmaster # chown -Rvf deploy: / usr / share / puppet / configuration

Насколько я могу судить, Puppet не заботится о разрешениях записи в каталогах манифестов / модулей, пока пользователь «puppet» может читать манифесты / модули, у нас все хорошо.

Теперь настройте доступ для пользователя. Я специально не установил пароль для этой учетной записи, так как я использую ssh-ключи, которые не так легко взломать!

root @ puppetmaster # su — развернуть

deploy @ puppetmaster> vim ~ / .ssh / authorized_keys

Поместите открытый SSH-ключ пользователя, который будет выполнять команду «cap production deploy», в файл author_keys, указанный выше.

Небольшое затруднение: если вы собираетесь использовать промежуточный сервер с SSH-ключами, убедитесь, что ключ учетной записи пользователя, выполняющего «cap production deploy», находится как на сервере шлюза, так и на puppetmaster, иначе это не удастся!

SSH для puppetmaster в качестве вашего пользователя развертывания из учетной записи, которая будет выполнять «cap production deploy», чтобы вы не получили никаких ошибок SSH-Key.

Теперь настройте ваш конфиг для промежуточной среды в config / deploy / staging.rb:

set :user, "deploy"
role :web, "staging"
after 'deploy:symlink', 'puppet:run'

и сделайте то же самое для config / deploy / production.rb:

set :gateway, "deploy@support-gateway"
set :user, "deploy"
set :deploy_via, :copy
role :web, "puppetmaster" # set this to the fully qualified domain name of your puppetmaster
after 'deploy:symlink', 'puppet:run'
after 'deploy:rollback', 'puppet:run'

Это означает, что мы можем переопределить «значения по умолчанию» из deploy.rb для каждой среды.

Возможно, вы заметили следующую строку:

после ‘deploy: Symlink’, ‘Puppet: Run’

Это выполняет пользовательскую задачу в пользовательском пространстве имен, как только «текущая» символическая ссылка была обновлена ​​для принудительного запуска марионетки. Проблема в том, что эта задача еще не существует!

Обновите config / deploy.rb, чтобы он выглядел следующим образом:

set :stages, %w[staging production]
set :application, "Puppet Manifests"
set :repository, "git://localhost/puppet.git"

set :scm, :git

role :web, "puppetmaster" # set this to the fully qualified domain name of your puppetmaster

require 'capistrano/ext/multistage'
require 'mcollective'

#### MCOLLECTIVE STUFF ####

class MCProxy
    include MCollective::RPC

    def initialize(agent)
        @agent = rpcclient(agent)
    end

    def runaction(action, args)
        printrpc @agent.send(action, args)
    end
end

namespace :puppet do
    desc <<-DESC
Run Puppet to pull the latest versions
DESC
    task :run do
        puppet = MCProxy.new("puppetd")
        puppet.runaction("runonce",:concurrency => '2')
    end
end

Важными моментами, на которые следует обратить внимание, являются «require ‘mcollective» (который загружает библиотеки MCollective ) и класс MCProxy (спасибо @ripienaar за помощь в этом!).

Класс MCProxy позволяет нам создавать задачу puppet: run и вызывать агент «puppetd» — обратите внимание, что вы можете вызывать любого агента с любым аргументом, который вам здесь нужен, мы просто вызываем оператор puppet.

Теперь я оставлю вам остальную часть конфигурации (настройка ключей / пользователей SSH и т. Д.), Однако, когда вы сейчас запускаете «cap production deploy», вы должны увидеть, как ваши конфиги марионеток извлекаются из git и SCP’d через шлюз к вашему хозяину марионеток, за которым MCollective выполняет запуск кукол по всему вашему серверу.

Последняя задача — настроить Puppet для чтения новых конфигов. Я предполагаю, что у вас есть все ваши манифесты в одном огромном репо здесь, так что просто обновите ваш конфиг puppet, чтобы он указывал на правильный каталог:

[puppetmasterd]
        vardir = /var/lib/puppet
        logdir = /var/log/puppet
        rundir = /var/run/puppet
        ssldir = $vardir/ssl
modulepath = /usr/share/puppet/configuration/current/manifests

Если вы не знаете Capistrano, «current» — это символическая ссылка, которая обновляется при каждом успешном развертывании / откате. Puppet не позволит вам установить / etc / puppet в качестве символической ссылки, поэтому вы должны настроить конфиги так, чтобы они указывали на «текущий» выпуск ваших конфигов.

Теперь сделайте начальную настройку:

cap production deploy: setup # создает необходимые каталоги

root @ puppetmaster # служба перезапуск puppetmaster

и разверните первую версию ваших модулей:

развёртывание производства

Дайте мне знать, как вы попали …

Следующая статья в серии

Источник:  http://www.threedrunkensysadsonthe.net/2011/05/deploy-and-roll-back-system-configs-with-capistrano-mcollective-and-puppet /