別々のファイルには3つのモジュールマニフェスト(必須項目のみ削除)があります。
class users {
$user = 'foo'
user { $user:
ensure => present;
}
}
class dvcs_cli {
require users
file { "/home/${::users::user}/.gitconfig":
ensure => present,
source => 'puppet:///modules/dvcs_cli/.gitconfig';
}
}
class shell {
require users
file { "/home/${::users::user}/.bash_aliases":
ensure => present,
source => 'puppet:///modules/shell/bash_aliases.sh';
}
}
.gitconfig
/home/foo
期待どおりに作成されましたが、.bash_aliases
組み込み/home
:
$ sudo /usr/bin/puppet apply --modulepath modules --detailed-exitcodes --hiera_config=hieradata/hiera.yaml manifests/host.pp || [ $? -eq 2 ]
[…]
Notice: /Stage[main]/Shell/File[/home//.bash_aliases]/ensure: defined content as '{md5}[…]'
Notice: /Stage[main]/Shell/File[/home/foo/.gitconfig]/ensure: defined content as '{md5}[…]'
${::users::user}
あるモジュールでは空の文字列として評価されますが、他のモジュールでは評価されないのと同じです。どうやってこれができますか?
実行すると、--debug
考えられる問題が明らかになりました。User[foo]
自動的に必須ですが、dvcs_cli
以下ではありませんshell
。
$ grep 'Adding autorequire relationship with User' puppet.log | grep -i -e dvcs_cli -e shell
Debug: /Stage[main]/Dvcs_cli/File[/home/pair/.gitconfig]: Adding autorequire relationship with User[pair]
これは以下に関連しています。手動、内容は次のとおりです。
Puppetがファイルを所有するユーザーまたはグループを管理している場合は、ファイルリソースに自動的に必要です。
これは以下に関連する可能性があります。「自動要求関係が不透明」、両方のファイルが同じディレクトリにあるために発生しますか?どちらのモジュールも明示的に記述されているので、自動要件は関係ありませんかrequire users
?
走る
$ puppet --version
4.2.1
存在する
$ cat /etc/redhat-release
Fedora release 24 (Twenty Four)
答え1
私は奇妙な状況でこの問題に遭遇し、私にとってはPuppetが自動的にループを切断することでしたが、予測可能な方法(または出力--debug
)ではありませんでした。私はこの動作を以前に一度見たことがありますが、他の変更の後には「消えたので」決して理解していませんでした。
想像する:
class a {
include b
$foo = 'quick'
$bar = $b::baz
}
class b {
include a
$baz = 'brown'
if ($hostname == $baz) {
$qux = $a::foo
}
}
これは$bar
インクルードクラスと条件付きundef
クラスを変更した後に発生しましたが、どちらも影響を受けませんでした。これは誤った動作のようです。c
a
b
a
b
解決策は次のとおりです。
class b {
$baz = 'brown'
if ($hostname == $baz) {
include a
$qux = $a::foo
}
}
その後、$bar
再定義されました。ドットファイルでループを可視化する方法がありますが、まだ見ていません。
Puppet 5.5.22 (Debian 安定版)