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

Упорядочивание зависимостей марионетки с отсутствием гарантии

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

Вот существующий отчет об ошибке:

http://projects.puppetlabs.com/issues/9622

Я почти уверен, что сначала удалит группу.

Подобные ситуации обычно возникают в определениях. Обычно я делаю что-то вроде:

user { 'user1':
  ensure  => $ensure,
  gid     => 'group1',
  require => $ensure ? {
    present => Group['group1'],
    absent  => undef,
  }
}

Это некрасиво, но работает. Может быть способ получше.

Кроме того, я считаю, что на самом деле не имеет значения, удалит ли Puppet группу первым в таком случае, поэтому вы можете просто оставить зависимости в покое и не беспокоиться об этом. Пользователь будет находиться в несуществующей группе до тех пор, пока они еще существуют, что ненадолго. Наверное, не было большого вреда.