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
команда.