Eu tenho três manifestos de módulo em arquivos separados (limitados ao essencial):
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
é criado em /home/foo
conforme o esperado, mas .bash_aliases
é criado em /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}[…]'
É como se ${::users::user}
avaliasse a string vazia em um módulo, mas não na outra. Como isso é possível?
A execução com --debug
revelou um possível problema: User[foo]
é autorequirido para dvcs_cli
, mas não para 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]
Isso contradiz o manual , que diz:
If Puppet is managing the user or group that owns a file, the file resource will autorequire them.
Isso pode estar relacionado aos "Relacionamentos de pesquisa automática são opacos" , causada pelo fato de que ambos os arquivos estão no mesmo diretório? E não deve ser irrelevante de qualquer maneira, já que ambos os módulos explicitamente require users
?
Rodando
$ puppet --version
4.2.1
em
$ cat /etc/redhat-release
Fedora release 24 (Twenty Four)
Tags puppet