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

Puppet Exec не выполняет useradd

Насколько я понимаю, 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,
}

Хорошо задокументировано здесь только с другими типами ресурсов:

https://puppet.com/docs/puppet/latest/types/user.html

В большинстве систем 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