Назад | Перейти на главную страницу

Puppet перезаписывает каталог с символической ссылкой

Я использую Puppet для управления конфигурациями некоторых серверов. Одна из задач - создать определенную структуру папок под /www для размещения наших приложений.

Но в последнее время у нас был этот сервер, где /www просто символическая ссылка на другой каталог (пришлось сделать это из-за нехватки памяти)

$ ls -l /www
lrwxrwxrwx 1 root root 13 Oct 25 15:33 /www -> /storage/www/

И до сих пор мы использовали это для управления каталогами:

file { $path:
ensure => directory,
owner  => user,
group  => group,
mode   => 'a=rx,u+w'
}

Проблема с этим конкретным сервером заключается в том, что при запуске Puppet /www символическая ссылка удаляется, а Puppet создает новый обычный каталог в /www вместо. И это мешает нам работать, если мы не вмешаемся вручную, чтобы снова создать символическую ссылку.

Мой вопрос: Кто-нибудь знает, как заставить Puppet не удалять символическую ссылку, а просто рассматривать ее как каталог: Если нет /www каталог или нет /www символическая ссылка существует, создайте /www каталог, иначе ничего не делать?

Короткий ответ - изменить

file { $path:
    ensure => directory,
    owner  => user,
    group  => group,
    mode   => 'a=rx,u+w'
}

в

file { $path:
    ensure => link,
    target => /path/to/original/directory
    owner  => user,
    group  => group,
    mode   => 'a=rx,u+w'
}

Используя ensure => directory, вы говорите марионетке, что вам нужен каталог, и что все остальное, что она находит (например, файл или символическая ссылка), она должна уничтожить и заменить на каталог. Используя ensure => link, вы скажете марионетке, что вам нужна символическая ссылка, указывающая на значение target, который, в свою очередь, может быть каталогом, файлом или устройством. В зависимости от того, что вы делаете, вам может потребоваться создать тип файла (используя ensure => directory) на вашей цели, если вам нужна марионетка для управления ею.

Я настоятельно рекомендую вам прочитать документацию по тип файла чтобы лучше понять, как им пользоваться.

Редактировать:

Чтобы различать разные серверы, вы захотите использовать отдельные node определения для разных серверов. По сути, вы можете сделать следующее, чтобы получить то, что хотите:

node 'server1.mydomain.com' {
    file { $path:
        ensure => directory,
        owner  => user,
        group  => group,
        mode   => 'a=rx,u+w'
    }
}

node 'server2.mydomain.com' {
    file { $path:
        ensure => link,
        target => /path/to/original/directory
        owner  => user,
        group  => group,
        mode   => 'a=rx,u+w'
    }
}