Puppet을 사용하여 PPA에서 패키지 설치


8

도 커가 사전 설치된 VM을 자동으로 프로비저닝하려고합니다.

내 기본 init.pp는 다음과 같습니다.

class { 'apt':
 always_apt_update    => true,
}

package { [
    #'build-essential',
    #'vim',
    #'curl',
    #'zsh',
    #'git-core',
    #'htop',
    #'wget',
    #'linux-image-generic-lts-raring',
    'python-software-properties'
    #'lxc-docker'
  ]:
  ensure  => 'installed',
}

apt::ppa { 'ppa:dotcloud/lxc-docker':}

# refresh apt source
exec { "apt-update":
  command => "/usr/bin/apt-get update && apt-get install lxc-docker --force-yes",
  returns => 100
}

마지막 exec 명령이 반환됩니다 (성공적인 apt-get 업데이트의 경우 기본값 100을 반환합니다).

정보 : / Stage [main] // Apt :: Ppa [ppa : dotcloud / lxc-docker] / Exec [add-apt-repository-ppa : dotcloud / lxc-docker] : Exec [apt_update] 통지의 일정 새로 고침 : / Stage [main] / Apt :: Update / Exec [apt_update] / returns : 성공적으로 실행 알림 : / Stage [main] / Apt :: Update / Exec [apt_update] : 1 개의 이벤트에서 '새로 고침'이 트리거되었습니다.

그러나 상자 도커에 ssh가 설치되어 있지 않고 실행 중이면 apt-get install lxc-docker설치할 수 있습니다. 내가 무엇을 잘못하고 있지? 여러 가지 다른 구성으로 작동시키지 못하는 것 같습니다.

답변:


13

apt-getapt-get맨 페이지 에서 쉽게 볼 수 있듯이 성공시 0, 오류시 100을 반환 합니다. 그래서 당신은 그것을 거꾸로 가지고 있습니다. 를 사용하여 두 개의 명령을 결합합니다. &&즉, 두 번째 명령은 첫 번째가 성공적으로 완료 될 때만 실행됩니다 (0을 반환 함). 따라서 apt-get update잘못 예상 한대로 "100"을 반환하면 두 번째 명령도 실행되지 않습니다.

로그 메시지를주의 깊게 읽으면 적용된 Exec 리소스의 이름이 "apt-update"가 아니라 "apt_update"라는 것을 알 수 있습니다. 전자는 apt클래스 에서 정의되며 apt::ppa리소스가 적용될 때 실행 됩니다. 후자는 사용자 자신의 Exec 리소스이며 로그 출력에도 표시됩니다 Exec[apt-update]. 찾아 봐

어쨌든 Puppet을 영광스러운 셸 스크립트로 사용하려고 시도하고 잘못했기 때문에 여기서 구성한 내용이 작동하지 않습니다. Puppet은 매니페스트에서 리소스를 지정하는 순서를 무시하고 대신 적절한 방식으로 리소스를 적용합니다. 따라서 lxc-docker지정된 PPA에서 패키지를 설치하려면 패키지 리소스보다 PPA 리소스가 적용되어 있는지 확인해야합니다.

이를 수행하는 몇 가지 방법이 있습니다. 모두 관계 또는 종속성을 지정해야합니다. 체인화 화살표를 사용하는 한 가지 방법이 있습니다 .

class { 'apt':
 always_apt_update => true,
}

apt::ppa { 'ppa:dotcloud/lxc-docker':}

# Your regular packages don't know or care about the PPA
package { [
    'build-essential',
    'vim',
    'curl',
    'zsh',
    'git-core',
    'htop',
    'wget',
    'linux-image-generic-lts-raring',
    'python-software-properties'
  ]:
  ensure  => 'installed',
}

# We single lxc-docker out to be able to specify 
# the relationship to Apt::Ppa properly
package { 'lxc-docker':
  ensure => 'installed'
}

Apt::Ppa['ppa:dotcloud/lxc-docker'] ->
Package['lxc-docker']

이는 PPA "ppa : dotcloud / lxc-docker"에 대한 lxc-docker리소스가 적용된 후 패키지 리소스가 적용됨을 의미합니다 apt::ppa. 설명한 바와 같이 apt::ppa리소스는 PPA를 추가 한 후 APT 캐시 업데이트를 이미 관리하므로 apt-get update어디에서나 명시 적으로 호출 할 필요가 없습니다 .


여전히 Exec['apt_update']PPA에서 설치된 패키지 가 필요 합니다. 패키지 전에 PPA를 요구하더라도 Exec과 패키지 사이의 관계는 적용되지 않습니다.
daxlerod

1

그리고 다음을 사용하는 대안, 관용적 답변이 있습니다 require.

class { 'apt':
 always_apt_update => true,
}

apt::ppa { 'ppa:dotcloud/lxc-docker':}

package { [others]: }    

package { 'lxc-docker':
  ensure  => 'installed',
  require => Apt::Ppa['ppa:dotcloud/lxc-docker']
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.