「require」モジュールの変数が常に使用できないのはなぜですか?

「require」モジュールの変数が常に使用できないのはなぜですか?

別々のファイルには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クラスを変更した後に発生しましたが、どちらも影響を受けませんでした。これは誤った動作のようです。cabab

解決策は次のとおりです。

class b {
  $baz = 'brown'

  if ($hostname == $baz) {
    include a
    $qux = $a::foo
  }

}

その後、$bar再定義されました。ドットファイルでループを可視化する方法がありますが、まだ見ていません。

Puppet 5.5.22 (Debian 安定版)

おすすめ記事