Pull to refresh

Comments 10

Есть еще Foreman. Свободная альтернатива PE.

Кстати, а в puppet, случаем, нельзя администрировать репозитории?(apt, yum)
интересно было бы узнать, а с чего Вы решили что, например, mongodb-unzip, install, run будет выполнены именно в такой последовательности? в exec нигде не прописаны зависимости, а манифесты в puppet не являются линейными. хотя желаемого в итоге добиться удастся только после нескольких следующих запусков манифестов, но это, во-первых, неправильно, а во-вторых между запусками может пройти немало времени.
вот этот символ "->" указывает на последовательность
Интересно, видимо из-за отсутствия подсветки (кстати, поставьте Souce = ruby, заработает) я и не заметил chaining arrows. My bad, как говорится! :-[
Вместо распаковки архивов я бы использовал chocolatey — это гораздо более элегантное решение. У puppet существует провайдер package chocolatey. Установка mongodb выглядела бы приблизительно так:
package { "mongodb":
    ensure => installed,
    provider => chocolatey,
  }

Если не используете deployment систему (для .net очень сильно рекомендую Octopus Deploy) — я бы тогда использовал chocolatey для развертывания своего софта. Пакуете свой софт в nuget-package и устанавливаете этот пакет из своего источник). А учитывая еще то, что в puppet есть модуль iis, то получилось бы примерно следующее:
class www_site_com {
  include packages::iis
  include iis::certs::star_site_com
  $sitename = 'www.site.com'


  #Получаем имя сервера для последующего обращения к нему
  $srvsubstname = downcase($::hostname)

  #Создаем директорию IIS
  file { "c:\\inetpub\\wwwroot\\$sitename":
    ensure => "directory",
  } 

  #Создаем запись в host файле для обращения к серверу по его имени локально
  host { "${srvsubstname}$sitename":
    ip => '127.0.0.1',
  }

  #Создаем Application Pool
  iis_apppool {$sitename:
    ensure                => present,
    managedpipelinemode   => 'Integrated',
    managedruntimeversion => 'v4.0',
    autostart             => true,
    require => Class['packages::iis'],
  }

  #Создаем Site & Bindings
  iis_site {$sitename:
    ensure          => present,
    bindings        => ["http/*:80:$sitename","http/*:80:${srvsubstname}$sitename","https/*:80:$sitename","https/*:80:${srvsubstname}$sitename"],
    serverautostart     => true,
    require => Class['packages::iis','iis::certs::star_site_com'],
  }

  #Создаем Application
  iis_app {"$sitename/":
    ensure          => present,
    applicationpool => $sitename,
    require => Class['packages::iis'],
  }

  #Указываем директорию в которой находится наше приложение
  iis_vdir {"$sitename/":
    ensure          => present,
    iis_app         => "$sitename/",
    physicalpath    => "c:\\inetpub\\wwwroot\\$sitename",
    require => [Class['packages::iis'],File["c:\\inetpub\\wwwroot\\$sitename"]],
  }

  #Устанавливаем нужное приложение из своего nuget-feed 
  package { "api_deploy":
    ensure => installed,
    provider => chocolatey,
    source  => 'https://myfeed.example.com/api/v2'
  }
 }

Таким образом, все действия по установке приложения api_deploy происходят в chocolateyInstall.ps1 (док), и сам манифест остается чистым.

Про порядок exec было верно подмечено, у Вас нет ни одной зависимости, и все будет запускаться в разнобой, используйте ordering.

Очень рекомендую использовать theforeman, так-как в нем не только функционал назначения классов, но еще есть возможность управлять инстансами в AWS прямо из панели управления theForeman (очень удобно создавать инстансы прямо там из заданного образа AMI с нужными классами в один клик!).

Удачи!
Огромное спасибо за комментарий, обязательно попробую такой вариант.
Вдохновлённый комменатрием kireevco, подправил свою конфигурацию. Теперь IIS и сайт конфигурируются с помощью модулей от PuppetLabs (dism и opentable-iis).
Скоро изменения коснутся и других компонентов.
В моей инфраструктуре сложность заключалась в том, что несколько кластеров имеют разные версии mongo, и поскольку 2.2 и 2.4 несовместимы между собой приходится иметь разные версии mongos на клиентах. Недавно решил задачу с установкой — создал пару пакетов для chocolatey для версий 2.2.X и 2.4.X. Таким образом устанавливать mongos на клиенты под винду стало еще удобнее:

class packages::mongodb::install {  
    include packages::chocolatey

    if $::kernel == "windows"
    {   

        package { "mongodb.core.2.4":            
            name => "mongodb.core.2.4",            
            ensure          => "2.4.9.2014021905",
            provider        => 'chocolatey',
            install_options => "-pre",
            require         => Class["packages::chocolatey"],
        }

        file {'c:\mongodb\2.4.9\log':
            ensure => directory,
            require => Package["mongodb.core.2.4"],
        }

        package { "mongodb.core.2.2":            
            name => "mongodb.core.2.2",            
            ensure          => "2.2.7.2014021905",
            provider        => 'chocolatey',
            install_options => "-pre",
            require         => Class["packages::chocolatey"],
        }

        file {'c:\mongodb\2.2.7\log':
            ensure => directory,                                   
            require => Package["mongodb.core.2.2"],
        }
    }
}

Позволяет распаковать mongodb в c:\mongodb\<версия>. После чего, можно установить службу, mongos, например:

class packages::mongodb::mongos::blah {  
    include packages::mongodb::install
    
    $mongo_version = '2.2.7'
        
    $cluster_name = 'Blah'    
    $bind_port = '27019'
    $configdb_list = 'cfg1.foo.corp:26001,cfg2.foo.corp:26002,cfg3.foo.corp:26003'

    $service_name = "Mongo $cluster_name Router"
    $mongo_install_path = "c:\\mongodb\\$mongo_version"
    $mongos_exe = "$mongo_install_path\\bin\\mongos.exe"
    $service_install_cmd = "\"$mongos_exe --port $bind_port --logpath $mongo_install_path\\log\\mongos-$cluster_name.log --configdb '$configdb_list' --quiet --install --serviceName '$service_name' --serviceDisplayName '$service_name' --serviceDescription '$service_name - Managed by Puppet'\""

    exec {"Register $service_name Service" :
                command => "$service_install_cmd",
                path => $::path,            
                onlyif => "if (\$(Get-WmiObject Win32_Service | Select-String -Pattern '$service_name') -eq \$null ){ exit 0 } else { exit 1 }",            
                provider => powershell,
                require => [Package["mongodb.core.2.2"],File["$mongo_install_path\\log"]], 
                notify => Service["$service_name"],
    }
     
    service {"$service_name":
                ensure => running,
                enable => true,                
                require => [ Exec["Register $service_name Service"]],                
    }
}
Sign up to leave a comment.