我正在尝试配置一个流浪的虚拟机以允许用户提供他们自己的bash_profile.local,但我不希望在vm的vcs repo中跟踪此文件。我有一个跟踪的bash_profile.local.dist文件,可以重命名。如果源文件存在,我怎么能告诉puppet只创建一个文件?它目前正常工作,但在配置期间记录错误,这是我想要避免的。
这是清单:
class local
{
file { '.bash_profile.local':
source => 'puppet:///modules/local/bash_profile.local',
path => '/home/vagrant/.bash_profile.local',
replace => false,
mode => 0644,
owner => 'vagrant',
group => 'vagrant',
}
}
答案 0 :(得分:11)
您可以通过这种方式滥用文件:
$a = file('/etc/puppet/modules/local/files/bash_profile.local','/dev/null')
if($a != '') {
file { '.bash_profile.local':
content => $a,
...
}
}
答案 1 :(得分:4)
这不是您要求的,但您可以在源中提供多个路径,因此如果用户没有提供自己的路径,您可以拥有默认的空文件。
class local
{
file { '.bash_profile.local':
source => [
'puppet:///modules/local/bash_profile.local',
'puppet:///modules/local/bash_profile.local.default'
],
path => '/home/vagrant/.bash_profile.local',
replace => false,
mode => 0644,
owner => 'vagrant',
group => 'vagrant',
}
}
答案 2 :(得分:1)
您可以尝试这样的事情:
file { 'bash_profile.local':
ensure => present,
source => ['puppet:///modules/local/bash_profile.local', '/dev/null'],
path => '/home/vagrant/.bash_profile.local',
before => Exec['clean-useless-file'],
}
exec { 'clean-useless-file':
command => 'rm .bash_profile.local',
onlyif => 'test -s .bash_profile.local',
cwd => '/home/vagrant',
path => '/bin:/usr/bin',
}
如果管理员没有在“modules / local / bash_profile.local”中提供“.bash_profile.local”的副本,则文件资源将使用第二个源,然后创建一个空白文件。然后,“onlyif”测试失败,exec将删除无用的空白文件。
以这种方式使用此代码可能有点麻烦,但它比配置失败更好。您可以评估在您的情况下保留空白的.bash_profile.local文件是否合适。我通常使用wget而不是rm的变体来从互联网上获取该文件的新副本(如果它尚未作为源提供)。
如果您正在使用puppetmaster,请注意您可以使用它来配置自己的服务器,根据.bash_profile.local是否存在,提供两个版本的目录。