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

Не работает марионеточный аудит файлового ресурса

Я просто не могу заставить это работать вообще. Я хочу, чтобы марионетка отправляла сообщение журнала, которое отображается в отчетах при каждом изменении файла. Это кажется таким простым из того, что я слышал и читал, но ничего не работает.

Вот файл init.pp:

# sudo init.pp

# 21 Sep 2011: Changed to test for notification only

class sudo {
    package { 'sudo':
        ensure  => present,
        before  => File['/etc/sudoers'],
    }

    file { '/etc/sudoers':
        ensure  => file,
        mode    => 440,
        owner   => root,
        group   => root,
        source  => 'puppet:///modules/sudo/sudoers',
        replace => false,
        audit   => content,
    }

#   exec { "/bin/date":
#       cwd => "/tmp",
#       subscribe => File['/etc/sudoers'],
#       refreshonly => true,
#   }

#   notify { "sudoers has been changed.":
#       refreshonly => true,
#   }
}

Если я добавлю exec, Ничего не произошло. Если я добавлю notify, он жалуется на refreshonly параметр.

Если я удалю все параметры файла, кроме audit, то права доступа к файлам меняются с 440 на 644.

Если я удалю replace затем марионетка перезаписывает файл.

Мой тест был:

  1. Бегать puppet agent --test
  2. Изменить файл (/etc/sudo)
  3. Повторить puppet agent --test (возможно, с touch site.pp или service apache2 reload первый)

Я еще не видел любой сообщения от audit. Я запускаю puppet v2.6.3 на сервере Ubuntu Lucid Lynx 10.04.

Да, это вполне возможно. Что вам нужно использовать, так это метапараметр "уведомить", который расскажет file ресурс, чтобы запустить другой ресурс, если он запущен. Некоторые типы ресурсов заботятся об уведомлении («обновляются» в документации); service и exec ресурсы - самые полезные. Затем вы можете построить exec ресурс с refreshonly => true что пишет в журнал или в стандартный вывод.

Я бы реализовал вашу конфигурацию выше так:

class sudo {
    package { 'sudo':
        ensure  => present,
        before  => File['/etc/sudoers'],
    }

    file { '/etc/sudoers':
        ensure  => file,
        mode    => 440,
        owner   => root,
        group   => root,
        source  => 'puppet:///modules/sudo/sudoers',
        replace => false,
        notify  => Exec["sudoers_changed"],
    }

    exec { "sudoers_changed":
       command => "/bin/echo '/etc/sudoers has changed...'",
       refreshonly => true,
       loglevel => "alert",
       logoutput => true,
   }
}

В loglevel и logoutput параметры к exec просто прояснит, куда идет вывод, пока вы экспериментируете; вы, безусловно, можете настроить их под свои нужды.

Вы должны иметь возможность уведомлять любой тип, поэтому вы можете уведомлять тип уведомления.

exec { "foo":
  notify => Notify["exec-alert"],
}

notify { "exec-alert":
  message => "sudoers has changed"
}

тот факт, что изменения файла все равно записываются в журналы марионетки, помечается как изменение.