Puppet을 사용하여 응용 프로그램 (.tar.gz)을 배포하는 방법은 무엇입니까?


11

저는 Puppet의 초보자이며 Puppet으로 응용 프로그램을 배포하는 올바른 방법인지 알고 싶습니다.

applciations는 버전 번호를 가진 파일을 포함하는 tar.gz 파일에 있습니다. 따라서 배포를 위해이 작업을 수행합니다 (서버로 가서 클라이언트를 다시 시작하여 새 타르볼을 선택합니다).

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"] ],
    }

그러나 업그레이드를 원할 때 Puppet이 이전 디렉토리를 삭제하라고 말하는 것을 모르십니까? 예를 들어, 버전 56을 57로 업그레이드하려면 56의 버전 디렉토리를 삭제해야합니다.

Capristrano에 대해 들었고 Managinig 패키지, 구성 파일 및 Capristrano를 사용하여 앱을 배포하는 데 Puppet을 사용하는 것이 더 나을 것 같습니다.

감사.


나는 forge.puppetlabs.com 모듈을 사용하여 tarball로만 제공되는 다운로드 / 압축 해제 / 게재 를 관리합니다. 잘 작동합니다.
jrjohnson

답변:


0

Puppet을 사용하여 응용 프로그램을 배포하는 올바른 방법인지 알고 싶습니다.

아니, 아니야

운영 체제에서 사용 가능한 패키지 관리를 사용해야합니다. 소프트웨어가있는 경우 tar.gz형식, 당신은 로컬로 다시 포장해야한다 .deb, .rpm또는 무엇 이건.

소프트웨어가 로컬로 개발 된 소프트웨어라면 사용 가능한 빌드 / 배포 도구를 사용해야합니다.


10
완벽한 세상에서 관리자는 tarballs에서 패키지를 작성하는 데 시간이 걸립니다. 실제로는 제 경험에 의하면 이런 일은 일어나지 않습니다. 고객은 tarballs에서 많은 응용 프로그램, 때로는 매우 큰 응용 프로그램을 설치하며이를 변경할 의도가 없습니다.
EmmEff

4
@EmmEff 그것은 완벽한 세계와 실제 세계의 차이가 아닙니다. 그것은 "우리는 구식 방식에 갇혀 있고 자동 구성 관리에 대한 준비가되어 있지 않습니다"와 구성 관리가 작동하는 장소의 차이입니다. 나는 둘 다 보았으며 심지어 관리자가 바뀌면서 후자가 전자로 바뀌는 것을 보았습니다.
Daniel C. Sobral

5
귀하는 귀하의 의견에 대한 권리가 있습니다. 실제 세계에서의 나의 관찰은 그것과 다릅니다.
EmmEff

13

fpm 을 사용 하여 tarball의 RPM 또는 DEB를 만들 수 있습니다 . 사용이 매우 간단하고 원하지 않는 패키지 형식에 대해 전혀 이해할 필요가 없습니다.

원래 질문에 대답하기 위해 Puppet으로 응용 프로그램을 배포하는 올바른 방법은 Puppet이 가능한 한 적은 작업을 수행하도록하는 것입니다. exec타르볼을 다운로드하고 추출 하는 복잡한 리소스는 매우 취하기 쉬우 며 Puppet을 yum install패키지로 만드는 것이 훨씬 건강에 좋습니다.


내가하고있는 일이 너무 잘못되었다는 것을 알았습니다. 그러나 rpm 건물은 항상 나를 두려워했습니다. fpm은 나의 구원입니다. Handyman5 감사합니다. 예.
8None1

좋은 의견. "rpm 사용"을 전파하는 대신 "가짜 rpm을 사용하고이 간단한 도구를 사용하여 달성"하는 간단한 방법을 제공했습니다.
Andre de Miranda

6

앱을 RPM 또는 .deb 패키지로 묶고 패키지를 보유 할 yum 또는 apt 저장소를 빌드하기 위해 매우 열심히 노력할 것입니다. 디렉토리로 열어 놓은 tarball 또는 zip을 포장하는 것은 매우 쉽지만 별도의 질문이 있어야합니다. 이 패키지는 버전을 잘 추적하고 타르볼을 여는 것만으로는 잘 처리되지 않는 모든 종류의 물건을 처리합니다.

실제로 적절한 패키지를 만들 수 없다면 다음과 같이 할 것입니다.

nodes.pp :

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

init.pp (모듈) :

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}] ];
}

또 다른 대안은 단순히 다음과 같은 재귀 꼭두각시 리소스를 사용하는 것입니다.

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

(이미 꼭두각시 마스터에서 올바르게 압축을 해제 한 위치입니다. 서비스를 실행중인 패키지가 필요하고 실행중인 서비스를 알려줍니다.)


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

제쳐두고, execs로 모든 것을하는 것은 다소 추한 일이며, 문제가 발생하기 시작하면 문제를 해결하기가 어려울 수 있습니다. 가능한 경우 추출 된 버전의 앱 파일을 꼭두각시 서버에 유지하고 재귀 file리소스를 사용 하여 검색 할 수 있습니까?


0

필자는 tarball (RPM 등)을 포장하는 것을 선호하지만 몇 가지 힌트가 있습니다.

이전 버전을 삭제하려면 설치중인 버전을 제외한 모든 버전을 삭제하면됩니다. 최근에 충분한 bash 및 extglob을 사용하면 가능 rm -r /usr/local/apps/path/apps-version-!(${version})합니다. 구성 파일 등을 지우지 마십시오. 당신은 설치 exec에서 exec refreshonly => true그리고 notify그것을 만들 수 있습니다 .

creates대신 속성을 사용할 수 있습니다 unless => 'test -f ...'. 그러나 더 이해하기 쉽습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.