如果源存在,如何使puppet复制文件?

时间:2013-12-12 18:50:19

标签: vagrant puppet

我正在尝试配置一个流浪的虚拟机以允许用户提供他们自己的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',
    }
}

3 个答案:

答案 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是否存在,提供两个版本的目录。