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
インストールできます。何が悪いのですか?さまざまな構成で動作するようには思えません。
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
を明示的に呼び出す必要はありません。
そして、ここに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']
}