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