Насколько я понимаю, puppetd запускается от имени пользователя root. Как root запускаю
puppetd --onetime --no-daemonize --verbose
Поэтому я не понимаю, почему это не работает:
exec { "useradd -m testuser":
path => "/bin:/usr/bin",
}
Я просто получаю:
...Exec[useradd -m testuser]/returns: change from notrun to 0 failed:useradd -m testuser returned 1 instead of one of [0] at...
Если я выполняю команду напрямую, она работает нормально.
Любые идеи?
PS: exec {"touch /root/a.test":} успешно, поэтому он действительно выполняется от имени пользователя root.
PS2: у меня такая же проблема при выполнении "apt-get autoremove"
Попробуйте выполнить команду с помощью:
exec { "useradd -m testuser":
path => "/bin:/usr/bin",
logoutput => true,
}
И посмотрите, что там написано. Теперь он должен выдать ошибку в командной строке. Также on_failure - это еще одна опция, которая выводится только в случае сбоя команды. Я обычно делаю:
Exec {
logoutput => on_failure,
}
По умолчанию все мои команды выводят что-то значимое глобально, если они терпят неудачу.
Но обычно вместо этого вы должны использовать ресурс user:
user { "myusername":
ensure => present,
managehome => true,
}
Хорошо задокументировано здесь только с другими типами ресурсов:
В большинстве систем useradd будет находиться в одной из папок sbin, а не в / bin или / usr / bin. твой путь должен быть "/bin:/usr/bin:/sbin:/usr/sbin",
. хотя это решение довольно ужасно, я бы использовал тип пользователя, а не exec, это даст вам гораздо лучшее управление пользователями на хосте (требуется проверка pw и existance и т. д.)
@user {
"testuser":
uid => ,
gid =>,
password => #hash of password,
home => ,
groups => ,
}
это виртуальный ресурс, который может быть добавлен на ваш хост realize ( User[testuser])
позволяя ссылаться на него несколько раз
это хорошее простое решение
Это работает но возвращает ли он 1 вместо 0? Попробуйте бежать echo $?
после этого useradd
команда.
Вы, как правило, получаете более качественные сообщения об ошибках, используя встроенные типы Puppet, а не exec следующим образом:
user { "foo":
ensure => present,
uid => 1001,
password => '<some password hash>',
shell => "/bin/bash",
home => "/home/foo",
groups => ["foogroup"],
managehome => true,
}
Есть ли причина, по которой вы используете exec вместо этого?
Вам нужно убедиться, что у вас есть гем Ruby Shadow, чтобы работать с / etc / shadow
sudo apt-get install libshadow-ruby1.8
или в redhat / fedora
sudo yum install ruby-shadow