별도의 파일에 세 개의 모듈 매니페스트(필수 항목만 제거)가 있습니다.
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(데비안 안정 버전)