我在 AWS 中的 Ubuntu 20.04 上运行 certbot,作为快照包安装。我不确定 certbot 续订是否正常运行。我希望得到一些帮助来确定如何最好地使其发挥作用。
这是一台新服务器,我在准备生产时打开和关闭它。目前每天运行约8-10小时。它并不经常在午夜运行,我认为这是 cron 作业运行的时间。一旦我完成配置,几天后就会24/7。
我发现的一件事是这个问题的答案说
您不必设置任何东西。任何最近安装的 certbot 的 Debian/Ubuntu 都应该安装一个 systemd 计时器和一个 cron 作业(并且 cron 作业只会在 systemd 未激活时运行 certbot,因此您不会同时运行两者)。
在我看来,certbot 计时器没有运行,如果运行了,它似乎指向 /dev/null。因为 systemd 处于活动状态,所以我想知道 cron 作业是否正在运行。
定时器和系统
我发现一条评论可能存在计时器和快照问题,所以也许这是一个已知问题。
systemctl 列表定时器
计时器似乎没有运行
NEXT LEFT LAST PASSED UNIT ACTIVATES
Wed 2021-03-17 23:44:00 UTC 3h 24min left n/a n/a snap.certbot.renew.timer snap.certbot.renew.service
Run Code Online (Sandbox Code Playgroud)
Certbot 计时器似乎指向 /dev/null。这个问题表明事情不应该如此。
> root@aws2:/etc/systemd/system# ls -l | grep certbot
lrwxrwxrwx 1 root root 9 Jan 9 06:38 certbot.timer -> /dev/null
Run Code Online (Sandbox Code Playgroud)
我可以在系统日志中看到以下内容,但我不确定这意味着什么
Mar 17 16:51:02 aws2 systemd[1]: Started Timer renew for snap application certbot.renew.
Run Code Online (Sandbox Code Playgroud)
克朗
在 syslog 中,我可以看到 cron 作业正在运行,但没有输出
Mar 16 00:00:01 aws2 CRON[2072]: (root) CMD (test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew)
Run Code Online (Sandbox Code Playgroud)
以下内容位于 /etc/cron.d/certbot 中(这可能是由 certbot 安装放在那里的,我大致了解它的作用,但我不知道 test / perl 的东西是做什么的)
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew
Run Code Online (Sandbox Code Playgroud)
当我运行整个命令(root test /x 等)时,我收到以下消息。
Command 'root' not found, but can be installed with: snap install root-framework
Run Code Online (Sandbox Code Playgroud)
当我运行这部分时,我没有得到任何输出(请注意,我已从 certbot 中删除了“-q”以进行测试)。我不确定测试部分在做什么,但当我运行此命令时 certbot 似乎没有执行任何操作。
> test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot renew
Run Code Online (Sandbox Code Playgroud)
关键问题
更新 - 建议的解决方案(再次更新)
请注意,这不是必需的。systemd 计时器开始正常工作。
在 /etc/cron.daily 文件夹中,我创建了以下文件夹。我认为它会做我想要的,我会在某个时候检查日志来查看。我对上面提出的问题仍然很感兴趣。
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
/usr/bin/certbot -q renew
Run Code Online (Sandbox Code Playgroud)
由于您使用的是 snap,因此值得仔细检查是否有第二个计时器(除了 certbot-renew),它是由 snap 实现的,并且确实正确地进行了更新。
在这里你可以看到我有两个掩码来确保正常的 certbot.timer 被禁用,但我也有一个通过 snap 安装的计时器:
root@pi:/etc/systemd/system # ls -l *certbot*
lrwxrwxrwx 1 root root 9 Oct 6 10:42 certbot.timer -> /dev/null
-rw-r--r-- 1 root root 293 Oct 6 05:26 snap.certbot.renew.timer
Run Code Online (Sandbox Code Playgroud)
我可以看到它每天运行两次并且当前正在等待:
root@pi:/etc/systemd/system # systemctl list-units | grep certbot.renew
snap.certbot.renew.timer loaded active waiting Timer renew for snap application certbot.renew
root@pi:/etc/systemd/system # cat snap.certbot.renew.timer [Unit]
# Auto-generated, DO NOT EDIT
Description=Timer renew for snap application certbot.renew
Requires=snap-certbot-1515.mount
After=snap-certbot-1515.mount
X-Snappy=yes
[Timer]
Unit=snap.certbot.renew.service
OnCalendar=*-*-* 07:09
OnCalendar=*-*-* 19:46
[Install]
WantedBy=timers.target
Run Code Online (Sandbox Code Playgroud)
不要被 cronjob 愚弄了。它会仔细检查以确保它没有执行已由 systemd 管理的操作:
# grep test /etc/cron.d/certbot
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew
Run Code Online (Sandbox Code Playgroud)
其中使用test
的返回“1”代码,因此 && 之后的任何内容都不会执行。
您的解决方法不会导致问题 - 但库存安装应该做正确的事情。
所以回答你的三个问题:
你知道 systemd 计时器发生了什么吗?为什么它指向 /dev/null?或者我应该忽略这个已知问题?
这是双重检查是否使用了快照计时器,并且没有使用 certbot 的任何系统计时器(例如,通过 apt 安装时)
我应该像 Ubuntu 建议的那样“快速安装 root-framework”来安装“root”吗?
存储在 /etc/cron.d 中的 Cron 文件的语法包括执行时使用的用户名。root
这里表示cronjob是以root用户运行的。您不需要安装 root-framework - “root”一词不是命令本身的一部分。
cron 作业“root test”似乎没有做任何事情...任何人都解释一下那里正在测试什么以及“cerbot renew”是否实际上正在运行?
如上所述 - 这个 cronjob 有效地说“嘿,systemd 正在运行!” 我什么也不会做!
最后,您可以在日志文件中验证续订状态:
# grep -c skipped /var/log/letsencrypt/letsencrypt.log
14
Run Code Online (Sandbox Code Playgroud)
就我而言,尚未发生续订(有效期足够长),但它正在运行 - 只是非常安静。