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']], } }
三、关键修正说明
- DNS验证凭证:dns-cloudflare插件必须通过Cloudflare API Token(推荐)或API Key完成DNS记录验证,YAML中必须配置有效凭证,否则无法生成证书。
- Nginx启动冲突:原配置中
ssl_redirect: true会导致Nginx因证书文件不存在启动失败,暂时关闭该选项,待证书生成后再开启。 - 插件依赖包:必须安装
certbot-dns-cloudflare包,否则Puppet无法调用dns-cloudflare插件。 - 重复资源声明:移除原profile中重复的
include 'letsencrypt',避免Puppet资源冲突。 - 有效文件资源:通过
exec生成ssl-dhparams.pem,并从模块加载标准的options-ssl-nginx.conf,替代原空文件声明。
四、验证步骤
- 将YAML中的
your-cloudflare-api-token替换为实际的Cloudflare API Token。 - 执行Puppet配置应用:
puppet agent -t。 - 检查证书生成情况:
ls /etc/letsencrypt/live/test.domain.com/。 - 确认证书生成后,将YAML中的
ssl_redirect改回true,再次应用配置。
内容的提问来源于stack exchange,提问作者Callum McCrorie
相关产品推荐
相关产品推荐

