Kukla ile uygulamalar (.tar.gz içinde) nasıl dağıtılır?


11

Kukla ile yeni başlayan biriyim ve uygulamaları Kukla ile dağıtmak için doğru yolda olup olmadığımı bilmek istiyorum.

Uygulamalar, sürüm numarasına sahip bir dosya içeren bir tar.gz dosyasındadır. Yani, bunu dağıtmak için yapıyorum (sunucuya gidiyorum ve yeni tarball'u almak için bir istemci yeniden başlatıyorum):

nodes.pp

node 'server1.domain.com' inherits basenode {
    apps { apps:
            version => 56,
            apps_name => "apps_tarball.tgz",
    }


init.pp (modules)

exec {"apps_wget":
            command => "/usr/bin/wget http://web_server/${version}-${apps_name} -O /tmp/${container_zip_name}",
            unless  => "test -f /tmp/${version}-${apps_name}",
            require => [ Package["wget"] ],
    }

exec {"apps_unzip":
            cwd     => "/usr/local/apps/path",
            command => "/usr/bin/unzip /tmp/${version}-${apps_name}",
            unless  => "test -f /usr/local/apps/path/apps-version-${version}",
            require => [ Package["unzip"], Exec["container_wget"] ],
    }

Ancak, yükseltmek istediğimde, eski dizini silmek için Kukla demeyi bilmiyorum? Örneğin, 56 sürümünü 57'ye yükseltmek istersem: 56'nın sürüm dizinini silmeliyim.

Capristrano'yu duydum ve manevra paketleri, yapılandırma dosyaları ve uygulamaları dağıtmak için Capristrano'yu kullanmak için Kukla kullanmak daha iyi görünüyor, değil mi?

Teşekkürler.


Forge.puppetlabs.com modülünü, yalnızca tarball olarak kullanılabilen şeyleri indirme / açma / yerleştirmeyi yönetmek için kullanıyorum . Harika çalışıyor.
jrjohnson

Yanıtlar:


0

Kukla ile uygulamaları dağıtmak için doğru yolda olup olmadığımı bilmek istiyorum.

Hayır değilsin.

İşletim sisteminizde bulunan paket yönetimini kullanmalısınız. Yazılım ise tar.gzbiçimi, yerel olarak yeniden paketlemeliyim .deb, .rpmya da her neyse.

Yazılım yerel olarak geliştirilmiş bir şeyse, onun için mevcut olan oluşturma / dağıtma araçlarını kullanmalısınız.


10
Mükemmel bir dünyada, yöneticiler tarballlardan paketler oluşturmak için zaman alacaktır. Gerçek dünyada, tecrübelerim bunun gerçekleşmediğini gösterdi. Müşterilerimiz tarball'lardan bazen çok büyük uygulamalar olmak üzere birçok uygulama yükler ve bunu değiştirmek gibi bir niyetleri yoktur.
EmmEff

4
@EmmEff Mükemmel dünya ile gerçek dünya arasındaki fark bu değil. Bu, "Eski yollara bağlı kaldık ve otomatik yapılandırma yönetimine hazır değiliz" yerleri ile yapılandırma yönetiminin çalıştığı yerler arasındaki farktır. Ben her ikisini de gördüm - ve hatta ikincisinin yöneticilerin değişmesi ile eski haline dönüştüğünü gördüm.
Daniel

5
Fikriniz var. Gerçek dünyadaki gözlemlerim bundan farklı.
EmmEff

13

Tarball'larınızın RPM'lerini veya DEB'lerini yapmak için fpm'yi kullanmayı denemek isteyebilirsiniz ; kullanımı gerçekten basit ve istemediğiniz paket formatları hakkında hiçbir şey anlamak zorunda değilsiniz.

Orijinal sorunuzu cevaplamak için, uygulamaları Kukla ile dağıtmanın doğru yolu Kukla'nın mümkün olduğunca az çalışmasını sağlamaktır; exectarball'ları indirip çıkaran karmaşık kaynaklar çok, çok kırılgan olmak zorunda ve Kukla'yı sadece yum installbir paket yapmak çok daha sağlıklı uzun vadede.


Ne yaptığımı çok yanlış biliyordum. Ama rpm binası beni hep korkuttu. fpm benim kurtuluşum. Teşekkürler Handyman5. f-evet.
8None1

harika yorum. Basit bir "sahte rpm kullanın ve bunu başarmak için bu basit aracı kullanın" sağlamak yerine "rpm kullanın" vaaz vermek yerine.
Andre de Miranda

6

Uygulamayı bir RPM veya .deb paketi olarak paketlemek ve paketleri tutmak için bir yum veya uygun havuz oluşturmak için çok çalışacağım. Bir dizine açtığınız bir tarball veya zip'in paketlenmesi oldukça kolaydır (ancak ayrı bir soru olmalıdır). Bu şekilde sunulan ambalaj, sürümleri güzel bir şekilde izler ve sadece bir tarball açmanın her tür işini iyi yapmaz.

Gerçekten gerçekten uygun bir paket inşa edemezdim, ben böyle bir şey yapardı:

nodes.pp:

node 'server1.domain.com' inherits basenode {
    apps { apps:
            version    => 56,
            oldversion => 55,
            apps_name  => "apps_tarball.tgz",
    }

init.pp (modüller):

file {
   [ "/usr/local/apps/path/apps-version-${oldversion}", "/tmp/${oldversion}-${apps_name}" ]:
            recurse => true,
            ensure  => absent;
}
exec {
      "apps_wget_${apps_name}":
            command   => "/usr/bin/wget http://web_server/${version}-${apps_name} -O /tmp/${container_zip_name}",
            logoutput => on_failure,
            creates   => "/tmp/${version}-${apps_name}",
            require   => [ Package["wget"] ];

      "apps_unzip_${apps_name}":
            cwd     => "/usr/local/apps/path",
            command => "/usr/bin/unzip /tmp/${version}-${apps_name}",
            creates => "/usr/local/apps/path/apps-version-${version}",
            require => [ Package["unzip"], Exec["container_wget"], Exec["apps_wget_${apps_name}] ];
}

Başka bir alternatif, sadece aşağıdaki gibi özyinelemeli bir kukla kaynağı kullanmaktır:

file {
    "/usr/local/apps/path/":
      source => "puppet:///modules/modulename/apps/path",
      ensure => directory,
      replace => true,
      purge   => true,
      recurse => true;
}

(kukla ustası üzerinde zaten doğru bir şekilde yıldız işaretini kaldırdığınız yer. Muhtemelen hizmeti çalıştıran herhangi bir paket gerektirir ve tükendiği hizmeti bildirir).


0
file { "/usr/local/apps/path/apps-version-${old-version}":
    ensure => absent
}

Bir kenara, her şeyi exec olarak yapmak çirkin ve işler kırılmaya başladığında sorun gidermek zor olabilir; yapabilirseniz, uygulama dosyalarının ayıklanan sürümlerini kukla sunucusunda tutabilir ve filealmak için özyinelemeli bir kaynak kullanabilir misiniz?


0

Kesinlikle tarball'ı (RPM veya her neyse) paketlemeyi tercih ederim, ancak birkaç ipucu:

Eski sürümü silmek için, yüklediğiniz sürüm dışındaki tüm sürümleri silebilirsiniz. Yakın zamanda yeterli bir bash ve extglob etkinken bunu yapabilirsiniz rm -r /usr/local/apps/path/apps-version-!(${version}). Yapılandırma dosyalarını ve benzeri şeyleri silmeye dikkat edin. Yükleme işleminden exec refreshonly => trueve ardından notifybunu yapabilirsiniz .

Bunun createsyerine niteliği kullanabilirsiniz unless => 'test -f ...'. Ama daha anlaşılır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.