Puppetを使用してPPAからパッケージをインストールする


8

dockerがプリインストールされた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がデフォルトです):

info:/ 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:正常に実行されましたnotice:/ Stage [main] / Apt :: Update / Exec [apt_update]:1つのイベントから「更新」がトリガーされました

しかし、sockにBox dockerがインストールされておらず、実行されている場合apt-get install lxc-dockerは、それをインストールできます。何が悪いのですか?さまざまな構成で動作するようには思えません。

回答:


13

apt-getapt-getmanページから簡単にわかるように、成功した場合は0を返し、エラーの場合は100を返します。だから逆にそれを持っています。を使用して2つのコマンドを結合しています&&。つまり、2番目のコマンドは、最初のコマンドが正常に完了する(0を返す)場合にのみ実行されます。したがって、apt-get update誤って予期したように「100」を返すとすると、2番目のコマンドは実行されません。

また、ログメッセージを注意深く読むと、適用されたExecリソースの名前が「apt-update」ではなく「apt_update」であることがわかります。前者はaptクラスで定義され、apt::ppaリソースが適用されたときに実行されます。後者は独自のExecリソースであり、ログ出力にも表示されますが、Exec[apt-update]です。それを探してください。

いずれにしても、Puppetを栄光のシェルスクリプトとして使用しようとして間違っているため、ここで作成したものが機能しません。Puppetは、マニフェストでリソースを指定する順序を無視し、代わりに適切と思われる方法でリソースを適用します。したがってlxc-docker、指定したPPAからパッケージがインストールされるようにするには、パッケージリソースの前にPPAリソースが適用されていることを確認する必要があります。

これにはいくつかの方法がありますが、それらすべてに関係または依存関係を指定する必要があります。連鎖矢印を使用する方法の1つを次に示します

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.