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

Марионетка: выполняется только если значение не равно

У меня есть сценарий, который действительно нужно запускать только один раз на сервере, то есть во время развертывания, но я решил, что лучше всего, если 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 check, но агент всегда запускает команду exec.

Когда я запускаю эту команду непосредственно в командной строке, она возвращает либо 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 Команда была полезна при тестировании, спасибо @Daniel C. Sobral. Я отмечаю @ Daniel's как принятый ответ, поскольку это была основная проблема, помимо моего непонимания нескольких концепций, плюс он ответил первым. Спасибо всем.

Вы пытались удалить 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 команда.