"require" 모듈의 변수를 항상 사용할 수 없는 이유는 무엇입니까?

"require" 모듈의 변수를 항상 사용할 수 없는 이유는 무엇입니까?

별도의 파일에 세 개의 모듈 매니페스트(필수 항목만 제거)가 있습니다.

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(데비안 안정 버전)

관련 정보