You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

YAML中配置letsencrypt::certonly不生效,求Puppet配置修正方案

问题分析与配置修正

针对你将letsencrypt::certonly从.pp文件迁移到YAML后证书未生成的问题,核心问题集中在DNS验证凭证缺失、依赖配置错误、插件依赖包未安装以及Nginx配置冲突这几个方面,以下是具体修正方案:

一、修正节点YAML配置

---
classes:
   - roles::www
   - profiles::letsencrypt  # 确保包含letsencrypt配置类

# UFW Rules
ufw::rules:
  'Allow HTTP':
    action: allow
    to_ports_app: 80
    proto: tcp
  'Allow HTTPS':
    action: allow
    to_ports_app: 443
    proto: tcp

# nginx rules
nginx::nginx_servers:
  'www.test.domain.com': 
    server_name: ['test.domain.com']
    ipv6_enable: true
    ssl: true
    http2: 'on'
    ipv6_listen_options: ''
    ssl_redirect: false  # 先关闭重定向,避免Nginx因证书不存在启动失败
    ssl_cert: '/etc/letsencrypt/live/test.domain.com/cert.pem' 
    ssl_key: '/etc/letsencrypt/live/test.domain.com/privkey.pem' 
    www_root: '/www-data/www.test.domain.com/' 
    server_cfg_ssl_append:
      ssl_dhparam: '/etc/letsencrypt/ssl-dhparams.pem'  # 修正为letsencrypt目录下的标准文件路径

# letsencrypt certonly配置
letsencrypt::certonly:
  'test.domain.com':
    cert_name: 'test.domain.com'
    domains:
      - 'test.domain.com'
      - '*.test.domain.com'
    plugin: 'dns-cloudflare'
    manage_cron: false

# letsencrypt全局配置
letsencrypt::email: 'email@email.com'
letsencrypt::plugin::dns_cloudflare:
  email: 'email@email.com'
  api_token: 'your-cloudflare-api-token'  # 替换为具有Zone DNS编辑权限的Cloudflare API Token

二、修正profiles::letsencrypt类代码

class profiles::letsencrypt {

  package { 'cron':
    ensure => installed,
  }

  # 安装dns-cloudflare插件依赖包
  package { 'certbot-dns-cloudflare':
    ensure => installed,
    before => Class['letsencrypt::plugin::dns_cloudflare'],
  }

  class { 'letsencrypt':
    config  => {
      email  => 'email@email.com',
      server => 'https://acme-v02.api.letsencrypt.org/directory',
    },
    require => Package['cron'],
  }

  # 生成ssl-dhparams.pem文件(替代空文件声明)
  exec { 'generate-dhparams':
    command => 'openssl dhparam -out /etc/letsencrypt/ssl-dhparams.pem 2048',
    creates => '/etc/letsencrypt/ssl-dhparams.pem',
    path    => ['/usr/bin', '/usr/sbin'],
  }

  file { '/etc/letsencrypt/options-ssl-nginx.conf':
    ensure => file,
    source => 'puppet:///modules/letsencrypt/options-ssl-nginx.conf',  # 从letsencrypt模块加载标准配置文件
    require => Class['letsencrypt'],
  }

  file { '/etc/letsencrypt/ssl-dhparams.pem':
    ensure => file,
    mode   => '0644',
    require => Exec['generate-dhparams'],
  }

  class { 'letsencrypt::plugin::dns_cloudflare':
    require => [Class['letsencrypt'], Package['certbot-dns-cloudflare']],
  }
}

三、关键修正说明

  1. DNS验证凭证:dns-cloudflare插件必须通过Cloudflare API Token(推荐)或API Key完成DNS记录验证,YAML中必须配置有效凭证,否则无法生成证书。
  2. Nginx启动冲突:原配置中ssl_redirect: true会导致Nginx因证书文件不存在启动失败,暂时关闭该选项,待证书生成后再开启。
  3. 插件依赖包:必须安装certbot-dns-cloudflare包,否则Puppet无法调用dns-cloudflare插件。
  4. 重复资源声明:移除原profile中重复的include 'letsencrypt',避免Puppet资源冲突。
  5. 有效文件资源:通过exec生成ssl-dhparams.pem,并从模块加载标准的options-ssl-nginx.conf,替代原空文件声明。

四、验证步骤

  1. 将YAML中的your-cloudflare-api-token替换为实际的Cloudflare API Token。
  2. 执行Puppet配置应用:puppet agent -t。
  3. 检查证书生成情况:ls /etc/letsencrypt/live/test.domain.com/。
  4. 确认证书生成后,将YAML中的ssl_redirect改回true,再次应用配置。

内容的提问来源于stack exchange,提问作者Callum McCrorie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 16:35:34