запускать кукольный класс, только если условие выполнено - PullRequest
0 голосов
/ 07 марта 2019

Я кодировал кукольный модуль, который хочу запускать только в том случае, если selinux является принудительным или разрешающим. Если он отключен, я хочу, чтобы кукольный игнорировал класс. У меня трудное время, хотя я пытаюсь найти правильный условный формат. Вот что у меня есть:

 class some-class {

 $selinux='/usr/bin/getenforce'     

 exec { "some command":
      command => "some command",
      onlyif => [ $selinux == Enforcing, $selinux == Permissive' ],
      timeout => 30
      }
      }

Это не работает при запуске марионетки, и я получаю "Не удалось найти команду '$ selinux". Я весь день гуглял, но, похоже, не могу найти, как правильно это структурировать.

Ответы [ 2 ]

1 голос
/ 07 марта 2019

Во-первых, идиоматический способ сделать это - создать пользовательский факт , который определяет статус принудительного применения SELinux для узлов.В ваших манипуляционных марионетках вы будете использовать обычную условную марионетку, основанную на значении этого факта.Например,

if $selinux_enforcement in ['Permissive', 'Enforcing'] {
  exec { "some command":
    timeout => 30
  }
}

Но если вы хотите специально использовать свойство unless или onlyif ресурса Exec, чтобы контролировать, следует ли запускать команду этого Exec, тогдаВы должны понимать, что эти свойства указывают команды операционной системы , которые необходимо выполнить для выполнения оценки.Их коды выхода указывают, следует ли продолжить выполнение основной командыДля цели Linux, используя поставщика Exec по умолчанию, posix, вы можете сделать что-то вроде этого:

exec { "some command":
  path => [ '/bin', '/usr/bin', '/sbin', '/usr/sbin' ],
  timeout => 30,
  onlyif => 'bash -c "case $(getenforce) in Enforcing|Permissive) exit 0;; *) exit 1;; esac"' ,
}

Обратите внимание, что программный пакет SELinux обычно содержит команду selinuxenabled, который решает вопрос более прямо, чем getenforce.Эта команда, предназначенная для использования в сценариях, передает свой результат через состояние выхода, поэтому она может быть лучшим кандидатом для вашего onlyif, упрощая его до:

  onlyif => 'selinuxenabled'
1 голос
/ 07 марта 2019

Вы уверены, что getenforce находится в /usr/bin/?

Попробуйте это проверить:

root@lab:~# which getenforce
/sbin/getenforce

Вы также столкнетесь с рядом других ошибок в вашем коде, так как вы не указали свои строки в кавычках, вы попытались получить boolean из string сравнения и т. Д.

Оставьте переменную $selinux и используйте только код ниже

exec {
    "rasg":
        command => "echo rasg > /tmp/rasg.txt",
        onlyif  => "getenforce | egrep -q 'Enforcing|Permissive'",
        path    => [ "/bin", "/sbin", "/usr/bin" ],
        timeout => 30,
    ;
}
...