Я использую 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'
}
}