我正在编写一个剧本来管理我托管多个域的 Web 服务器。我有一个配置用于设置我的 nginx 服务器,另一个配置用于管理我的证书。到目前为止,工作流程如下:
- 将虚拟主机模板复制到服务器,NGINX 重新启动
- 生成证书
- 远程 NGINX 配置文件已更新(使用 lineinfile),NGINX 已重新启动
除非我运行剧本,否则这种方法很有效,因为我的模板文件会覆盖远程文件。如果我需要更新主机配置,我仍然希望能够运行相同的剧本,但我不知道如何处理这个问题。
答案1
不要使用 lineinfile。使用一个或多个模板任务管理完整的文件。
如果您决定将 nginx 配置和获取证书的角色分开,它们将需要以某种方式进行协调。也许 nginx 角色只是假设 Let's Encrypt 默认证书位置。或者,也许您可以设置变量,例如nginx_ssl_certificate: /etc/pki/tls/certs/{{ inventory_hostname }}/cert.crt
假设域名是清单中的名称。
如果 nginx 角色首先运行,并配置不存在的证书,则 nginx 将无法启动。考虑使用 nginx 重启处理程序,该处理程序将推迟到该剧的后期阶段。或者,重新排列角色,使证书首先存在。
使用 lineinfile 实现幂等任务是可能的,但这需要了解 lineinfile 的各种模式,并编写正则表达式。我不推荐这样做,lineinfile 会让每个人都感到困惑。