Как сделать puppet копировать файл, только если источник существует?

Я пытаюсь предоставить бродячую виртуальную машину, чтобы позволить пользователям поставлять свой собственный bash_profile.местный, но я не хочу, чтобы этот файл отслеживаются в СКВ ВМ РЕПО. Я отслеживаемый файл.местный.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 ответов


вы можете злоупотреблять файлом таким образом:

$a = file('/etc/puppet/modules/local/files/bash_profile.local','/dev/null')
if($a != '') {
    file { '.bash_profile.local':
        content => $a,
        ...
    }
}

Это не совсем то, что вы просили, но вы можете указать несколько путей в источнике, поэтому вы можете иметь пустой файл по умолчанию, если пользователь не предоставил свой собственный.

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',
    }
}

вы можете попробовать что-то вроде этого:

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',
}

если администратор не сделает копию ".файл.локальные "доступные в" модулях / local / bash_profile.локальный", файловый ресурс будет использовать второй источник, а затем создаст пустой файл. Затем тест "onlyif" завершается неудачно, и exec удалит бесполезный пустой файл.

использовать таким образом этот код может быть немного громоздким, но это лучше, чем провал подготовки. Вы можете оценить, если сохранение пустого .файл.локальный файл может быть в порядке в вашем случае. Обычно я использую вариант этого, с wget вместо rm, чтобы получить новую копию файла из интернета, если он еще не был доступен в качестве источника.

Если вы используете puppetmaster, имейте в виду, что вы можете использовать его для подготовки собственного сервера, представляя две версии каталога, согласно.файл.местный присутствует или нет.