Puppet поддерживает концепцию зависимостей ресурсов, при которой один ресурс не будет синхронизироваться, пока сначала не будет синхронизирован другой. Например, следующий фрагмент Puppet создаст пользователя user1
и группа group1
но он создаст группу первый:
group { 'group1':
ensure => present
}
user { 'user1':
ensure => present,
gid => 'group1',
require => Group['group1']
}
У меня вопрос: как работают зависимости, когда ensure
параметр изменен с "присутствует" на "отсутствует":
group { 'group1':
ensure => absent
}
user { 'user1':
ensure => absent,
gid => 'group1',
require => Group['group1']
}
Что делает Puppet в таком случае? Удаляет ли сначала группу или пользователя? А может порядок не определен?
В общем, как вы можете гарантировать, что один ресурс отсутствует, только когда другой ресурс уже отсутствует.
Вы можете удалить "require => Group ['group1']" из пользовательского ресурса, и ресурсы все равно будут созданы правильно. Затем вы можете использовать условное выражение, чтобы изменить отношения между пользователем и группой при попытке «гарантировать => отсутствие».
$ensure = 'absent'
if $ensure == 'absent' {
User[user1] -> Group[group1]
}
group { 'group1':
ensure => $ensure
}
user { 'user1':
ensure => $ensure,
gid => 'group1',
}
Вот существующий отчет об ошибке:
Я почти уверен, что сначала удалит группу.
Подобные ситуации обычно возникают в определениях. Обычно я делаю что-то вроде:
user { 'user1':
ensure => $ensure,
gid => 'group1',
require => $ensure ? {
present => Group['group1'],
absent => undef,
}
}
Это некрасиво, но работает. Может быть способ получше.
Кроме того, я считаю, что на самом деле не имеет значения, удалит ли Puppet группу первым в таком случае, поэтому вы можете просто оставить зависимости в покое и не беспокоиться об этом. Пользователь будет находиться в несуществующей группе до тех пор, пока они еще существуют, что ненадолго. Наверное, не было большого вреда.