web-dev-qa-db-ja.com

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

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つのイベントから「更新」がトリガーされました

ただし、ボックスにsshを実行すると、Dockerがインストールされておらず、実行されていませんapt-get install lxc-dockerインストールできます。何が悪いのですか?さまざまな構成で動作するようには思えません。

8
digital

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

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

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

13
daff

そして、ここに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']
}
1
msanford