【问题标题】:Puppetserver service fails to startPuppetserver 服务启动失败
【发布时间】:2016-07-04 11:01:54
【问题描述】:

我有一个运行ps.memory = 2048 RAM 的 Vagrant CentOS VM。

当我尝试启动puppetserver 服务时:

$ puppet --version
4.4.0
$ sudo puppet resource service puppetserver ensure=running
Error: Could not start Service[puppetserver]: Execution of '/bin/systemctl start puppetserver' returned 1: Job for puppetserver.service failed. See 'systemctl status puppetserver.service' and 'journalctl -xn' for details.
Error: /Service[puppetserver]/ensure: change from stopped to running failed: Could not start Service[puppetserver]: Execution of '/bin/systemctl start puppetserver' returned 1: Job for puppetserver.service failed. See 'systemctl status puppetserver.service' and 'journalctl -xn' for details.
service { 'puppetserver':
  ensure => 'stopped',
}
$ journalctl -xn
No journal files were found.
$ systemctl status puppetserver.service
puppetserver.service - puppetserver Service
   Loaded: loaded (/usr/lib/systemd/system/puppetserver.service; disabled)
  Process: 4708 ExecStartPre=/usr/bin/install --directory --owner=puppet --group=puppet --mode=775 /var/run/puppetlabs/puppetserver (code=exited, status=0/SUCCESS)
 Main PID: 4709 (java);         : 4710 (bash)
   CGroup: /system.slice/puppetserver.service
           ├─4709 /usr/bin/java -Xms1g -Xmx1g -XX:MaxPermSize=1g -XX:OnOutOfMemoryError=kill -9 %p -Djava.security.egd=/...
           └─control
             ├─4710 /bin/bash /opt/puppetlabs/server/apps/puppetserver/ezbake-functions.sh wait_for_app
             └─4755 sleep 1

我的JAVA_ARGS来自/etc/sysconfig/puppetserver

JAVA_ARGS="-Xms1g -Xmx1g -XX:MaxPermSize=1g"

根据要求,puppetserver.service 文件:

$ cat /usr/lib/systemd/system/puppetserver.service
[Unit]
Description=puppetserver Service
After=syslog.target network.target

[Service]
Type=simple
EnvironmentFile=/etc/sysconfig/puppetserver
User=puppet
TimeoutStartSec=120
TimeoutStopSec=60
Restart=on-failure
StartLimitBurst=5

PermissionsStartOnly=true
ExecStartPre=/usr/bin/install --directory --owner=puppet --group=puppet --mode=775 /var/run/puppetlabs/puppetserver

ExecStart=/usr/bin/java $JAVA_ARGS \
          '-XX:OnOutOfMemoryError=kill -9 %%p' \
          -Djava.security.egd=/dev/urandom \
          -cp "${INSTALL_DIR}/puppet-server-release.jar" clojure.main \
          -m puppetlabs.trapperkeeper.main \
          --config "${CONFIG}" \
          -b "${BOOTSTRAP_CONFIG}" $@

KillMode=process

ExecStartPost=/bin/bash "${INSTALL_DIR}/ezbake-functions.sh" wait_for_app

SuccessExitStatus=143

StandardOutput=syslog

[Install]
WantedBy=multi-user.target

尝试手动运行ExecStartPost 命令:

$ /usr/bin/java -Xms1g -Xmx1g -XX:MaxPermSize=1g -XX:OnOutOfMemoryError='kill -9 %%p' -Djava.security.egd=/dev/urandom -cp /opt/puppetlabs/server/apps/puppetserver/puppet-server-release.jar clojure.main -m puppetlabs.trapperkeeper.main --config /etc/puppetlabs/puppetserver/conf.d -b /etc/puppetlabs/puppetserver/bootstrap.cfg

RuntimeError: Got 2 failure(s) while initializing: File[/var/log/puppetlabs/puppetserver]: change from 0700 to 0750 failed: failed to set mode 0700 on /var/log/puppetlabs/puppetserver: Operation not permitted - No message available; File[/var/run/puppetlabs/puppetserver]: change from 0775 to 0755 failed: failed to set mode 0775 on /var/run/puppetlabs/puppetserver: Operation not permitted - No message available

所以我又试了一次,但这次我更改了一些目录权限,但仍然出现类似的错误(这没有意义,因为我只是更改了模式?):

$ sudo chown -R vagrant:vagrant /var/run/puppetlabs/
$ sudo chown -R vagrant:vagrant /var/log/puppetlabs/
$ sudo chmod -R 0755 /var/run/puppetlabs/

$ /usr/bin/java -Xms1g -Xmx1g -XX:MaxPermSize=1g -XX:OnOutOfMemoryError='kill -9 %%p' -Djava.security.egd=/dev/urandom -cp /opt/puppetlabs/server/apps/puppetserver/puppet-server-release.jar clojure.main -m puppetlabs.trapperkeeper.main --config /etc/puppetlabs/puppetserver/conf.d -b /etc/puppetlabs/puppetserver/bootstrap.cfg

OpenJDK 64-Bit Server VM warning: ignoring option MaxPermSize=1g; support was removed in 8.0
RuntimeError: Got 1 failure(s) while initializing: File[/var/run/puppetlabs/puppetserver]: change from 0775 to 0755 failed: failed to set mode 0775 on /var/run/puppetlabs/puppetserver: Operation not permitted - No message available
                use at /opt/puppetlabs/puppet/lib/ruby/vendor_ruby/puppet/settings.rb:1007

可能是什么问题?

【问题讨论】:

  • 请提供puppetserver.service文件
  • @fge:添加到问题中
  • “有关详细信息,请参阅 'systemctl status puppetserver.service' 和 'journalctl -xn'。” -- 这些说明了什么?
  • 我已经在问题中展示了这两个命令的结果...
  • @JimGarrison 这两个命令的输出就在下面

标签: java vagrant puppet


【解决方案1】:

您确定这是 OnOutOfMemory 错误吗?我问是因为我发现最新的 PuppetServer 包含更新版本的 logback,如 /var/log/messages 中的这条消息所示:

Mar 18 01:56:21 puppetserver java: Exception in thread "main" java.lang.AbstractMethodError: ch.qos.logback.core.net.SyslogAppenderBase.createOutputStream()Lch/qos/logback/core/net/SyslogOutputStream;
Mar 18 01:56:21 puppetserver java: at ch.qos.logback.core.net.SyslogAppenderBase.start(SyslogAppenderBase.java:62)
Mar 18 01:56:21 puppetserver java: at ch.qos.logback.classic.net.SyslogAppender.start(SyslogAppender.java:48)

如果您看到,这会将 logback.xml 中的“classic.net.Syslog”替换为“core.net.Syslog”

sed -i_old -e 's/classic.net.Syslog/core.net.Syslog/' /etc/puppetlabs/puppetserver/logback.xml

如果这不是问题,请发布您的日志文件。

【讨论】:

  • 啊,是的,我想你可能是对的。问题可能是ExecStartPre 命令将/var/run/puppetlabs/puppetserver 改成user=puppet, group=puppet。我看到,当我 1) chown 到 vagrant:vagrant,2) 尝试启动,3) 它继续失败,4) /var/run/puppetlabs/puppetserver 现在归 puppet:puppet 所有(这将符合上述烫发错误)。但是,该错误看起来仍然与我在上面的问题中发布时相同。
  • 我应该补充一点,在 env 文件中注释掉 ExecStartPre 行似乎也没有修复。
  • 使用sudo 运行ExecStart 命令仍然会产生错误:RuntimeError: Got 2 failure(s) while initializing: File[/var/log/puppetlabs/puppetserver]: change from 0700 to 0750 failed: failed to set mode 0700 on /var/log/puppetlabs/puppetserver: Operation not permitted - No message available; File[/var/run/puppetlabs/puppetserver]: change from 0775 to 0755 failed: failed to set mode 0775 on /var/run/puppetlabs/puppetserver: Operation not permitted - No message available
【解决方案2】:

您提供的日志为

OpenJDK 64 位服务器 VM 警告:忽略选项 MaxPermSize=1g; 8.0 中移除了支持

所以,很明显您使用的是 jdk 8,它删除了 permgen 空间。

永久代 (PermGen) 空间已被完全删除,取而代之的是一个名为 Metaspace 的新空间。删除 PermGen 的后果是显然 PermSize 和 MaxPermSize JVM 参数被忽略了,您将永远不会得到 java.lang.OutOfMemoryError: PermGen error

  1. 所以请从位置/etc/sysconfig/puppetserverJAVA_ARGS 中删除-XX:MaxPermSize=1g 部分

JAVA_ARGS="-Xms1g -Xmx1g"

所以

  1. 然后,

您的命令将如下所示:

$ /usr/bin/java -Xms1g -Xmx1g -XX:OnOutOfMemoryError='kill -9 %%p' -Djava.security.egd=/dev/urandom -cp /opt/puppetlabs/server/apps/puppetserver/puppet-server-release.jar clojure.main -m puppetlabs.trapperkeeper.main --config /etc/puppetlabs/puppetserver/conf.d -b /etc/puppetlabs/puppetserver/bootstrap.cfg

$ /usr/bin/java -Xms1g -Xmx1g -Djava.security.egd=/dev/urandom -cp /opt/puppetlabs/server/apps/puppetserver/puppet-server-release.jar clojure.main -m puppetlabs.trapperkeeper.main --config /etc/puppetlabs/puppetserver/conf.d -b /etc/puppetlabs/puppetserver/bootstrap.cfg

请尝试这 2 个命令。我希望两者都能成功运行。为谨慎起见,我都添加了。

注意:无需更改文件权限。像使用前一样保留它们。

否则,如果您不想更改任何内容,可以将java 8 降级为java 7

相关链接:

  1. PermGen elimination in JDK 8
  2. Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize
  3. JAVA 8 XX:PERMSIZE AND XX:MAXPERMSIZE DISAPPEARING
  4. JDK 8 Milestones
  5. JEP 122: Remove the Permanent Generation

【讨论】:

    【解决方案3】:

    @lolerrcoster,您的服务开始于:

    sudo puppet resource service puppetserver ensure=running
    

    但是你的下一个命令并没有告诉它是哪个用户

    /usr/bin/java -Xms1g -Xmx1g -XX:MaxPermSize=1g -XX:OnOutOfMemoryError='kill -9 %%p' -Djava.security.egd=/dev/urandom -cp /opt/puppetlabs/server/apps/puppetserver/puppet-server-release.jar clojure.main -m puppetlabs.trapperkeeper.main --config /etc/puppetlabs/puppetserver/conf.d -b /etc/puppetlabs/puppetserver/bootstrap.cfg
    

    请在运行上述命令之前直接运行 whoami:

    whoami
    /usr/bin/java -Xms1g -Xmx1g -XX:MaxPermSize=1g -XX:OnOutOfMemoryError='kill -9 %%p' -Djava.security.egd=/dev/urandom -cp /opt/puppetlabs/server/apps/puppetserver/puppet-server-release.jar clojure.main -m puppetlabs.trapperkeeper.main --config /etc/puppetlabs/puppetserver/conf.d -b /etc/puppetlabs/puppetserver/bootstrap.cfg
    

    为什么是这个命令? 我非常确信您的问题是权限/用户上下文问题,并且以下命令会使情况变得更糟:

    $ sudo chown -R vagrant:vagrant /var/run/puppetlabs/
    $ sudo chown -R vagrant:vagrant /var/log/puppetlabs/
    $ sudo chmod -R 0755 /var/run/puppetlabs/
    

    在上述情况下,您必须在正确的用户上下文上执行 sudo 才能使文件可写,但这取决于其他数据是否可写。所以你可以试一试,但我会使用为服务创建的 puppet 用户

    User=puppet
    

    所以您的 puppet 服务作为用户 puppet 运行,但您的日志文件受 vagrant 用户控制,并且不可写入 puppet 用户。

    所以我也会尝试切换回:

    $ sudo chown -R puppet /var/run/puppetlabs/
    $ sudo chown -R puppet /var/log/puppetlabs/
    $ sudo chmod -R 0755 /var/run/puppetlabs/
    

    Java

    另外我建议你不要乱用 JVM 堆参数,除非你知道你在做什么。因为您不需要从 JDK5 开始对 Java VM 堆强制执行下限和上限。我只会限制在上限

    -Xmx1g
    

    堆和实际分配的内存将由 javaVM 很好地管理。随着 JVM 需要更多,它将逐步增加堆并保持所需的大小(不会缩小到较低的值)。因此,您的机器上将拥有更好的 RAM。

    另外请切换到 Oracle JVM。我经常面临与 OpenJDK 的安全性和兼容性问题。所以我的第一个测试是在 Oracle 的最新需要的 JDK 上运行它。在您的情况下,Oracle JDK8。 但是请先尝试我之前提到的权限。

    祝你好运,请随时更新。

    【讨论】:

      【解决方案4】:

      我以前见过这种行为。 不要尝试以 root 身份手动运行命令,因为您会弄乱权限。 而是使用 journalctl -xe 仔细阅读日志并尝试了解服务失败的原因。在我的情况下,我无法启动 puppetserver 服务,因为已经有一个私钥,但还没有一个公共证书。

      ls /etc/puppetlabs/puppet/ssl/certs/`hostname -f`.pem
      ls /etc/puppetlabs/puppet/ssl/private_keys/`hostname -f`.pem
      

      如果其中一个存在而没有另一个,则服务将无法启动。您将在日志文件中看到类似的内容:

      Exception in thread "main" java.lang.IllegalStateException: Cannot initialize master with partial state; need all files or none.
      

      如果您是第一次尝试安装puppetserver,因此无法破坏现有部署,那么您可能只需删除现有私钥,puppetserver 将自动生成一个新对。

      rm /etc/puppetlabs/puppet/ssl/certs/`hostname -f`.pem
      rm /etc/puppetlabs/puppet/ssl/private_keys/`hostname -f`.pem
      

      最后再次尝试启动puppetserver 服务。

      service puppetserver start
      

      【讨论】:

        【解决方案5】:
        /usr/bin/java -Xms1g -Xmx1g -XX:MaxPermSize=1g 
        

        Xms 和 Xms 小于 MaxPermSize。这对我有用。

        【讨论】:

          猜你喜欢
          • 2017-01-11
          • 2013-01-12
          • 2017-08-08
          • 2020-05-23
          • 2016-12-30
          • 2021-11-30
          • 2013-08-11
          • 1970-01-01
          相关资源
          最近更新 更多