Puppet: exec only, если значение не равно

У меня есть скрипт, который на самом деле нужно запускать только один раз на сервере, то есть во время развертывания, но я решил, что было бы лучше, если бы Puppet управлял им. Сценарий переназначает несколько устаревших идентификаторов пользователей, которые конфликтуют с пользователями локальной системы.

Я проверяю это так, если у пользователя gopher установлен uid по умолчанию, равный 13. Если это так, то мне нужно запустить сценарий переназначения.

exec { "change_uid":
   command  => "/script/to/run.sh",
   provider => 'shell',
   path => [ "/bin", "/sbin", "/usr/bin", "/usr/sbin", "/usr/local/bin", "/usr/local/sbin" ],
   onlyif   => "test `/usr/bin/id -u gopher` -eq 13; echo $?",
}

Я пробовал несколько различных перестановок выше onlyif проверьте, но исполнительный агент всегда уволен на агента.

Когда я запускаю эту команду непосредственно в командной строке, она возвращает 0 или 1. Это может быть связано с тем, что bash возвращает 0, когда истина, и 1, когда ложь, но я думаю, что более вероятно, что я неправильно понимаю способ onlyif работает.

Как я могу получить этот exec огонь, когда uid суслика =13? Я открыт для альтернативных способов реализовать то, что я пытаюсь достичь здесь.

ОБНОВИТЬ

Я отбросил часть эха. Окончательное рабочее решение:

exec { "change_uid":
   command  => "/script/to/run.sh",
   path     => [ "/bin", "/sbin", "/usr/bin", "/usr/sbin", "/usr/local/bin", "/usr/local/sbin" ],
   onlyif   => "test `id -u gopher` -eq 13",
}

Используя ralsh command был полезен при тестировании, спасибо @Daniel C. Sobral. Я отмечаю @Daniel's как принятый ответ, так как это была главная проблема, помимо моего неправильного понимания некоторых концепций, плюс он ответил первым. Спасибо всем.

2 ответа

Решение

Вы пытались удалить echo $? в конце?

Эта часть всегда сделает все return 0,

Параметр onlyif ограничивает выполнение процесса, когда указанная команда onlyif возвращает успех (0). Например:

dcs@shadowfax:~/tmp$ ls -l test
ls: cannot access test: No such file or directory
dcs@shadowfax:~/tmp$ ralsh exec "/bin/echo ok" onlyif="/usr/bin/test -f test"
exec { '/bin/echo ok':
  returns => ['0'],
}
dcs@shadowfax:~/tmp$ touch test
dcs@shadowfax:~/tmp$ ralsh exec "/bin/echo ok" onlyif="/usr/bin/test -f test"
notice: /Exec[/bin/echo ok]/returns: executed successfully
exec { '/bin/echo ok':
  returns => 'notrun',
}

Итак, когда файл не существует, он ничего не делает. Когда я создаю файл, он отображает notice о том, что /bin/echo ok был выполнен.

Игнорировать returns вещи.

Во всяком случае, так как вы закончили onlyif команда с echo, а также echo всегда возвращайте успех, тогда ваш exec всегда исполняйся Удалить это echo и оставить только test команда.

Другие вопросы по тегам