使用Ansible安装Nginx和Let's Encrypt

在掌握Ansible基本使用并动手使用了Let’s Encrypt(见怎样使用Let's Encrypt在Nginx下配置HTTPS)后,动手写了一个Ansible Role,实现自动化:

  • 安装Nginx
  • 部署Let’s Encrypt及配置Nginx使用

实现的代码见:MarshalW/ansible-roles

以下分三部分说明:

  • 怎么配置和执行
  • 任务的基本流程
  • 相关知识学习总结

配置和执行#

在安装ansible并且配置好服务器后,可修改https://github.com/MarshalW/ansible-roles/blob/master/web.yml:

1
2
3
4
5
6
7
8
---
- hosts: server
vars:
host_name: www.example.com
admin_email: admin@example.com
is_default_conf: True
roles:
- webserver

配置:

  • hosts: server,配置自己的服务器名称
  • host_name,需要配置https的域名
  • admin_email,管理员邮箱,不必是https域名的
  • is_default_conf,是否是默认域名,也就是http的默认配置,不是的话,屏蔽这句话即可

然后执行命令运行即可:

1
ansible-play web.xml

Ansible执行基本流程#

运行主要的任务如下:

  • 使用Nginx官方源安装Nginx(Ubuntu自带的Nginx版本往往有点过时)
  • 检查如没有安装git,apt安装
  • 检查如没有安装python,apt安装
  • 检查如没有安装letsencrypt,apt安装
  • 确认virtual host配置文件目录是否存在,不存在创建
  • 根据模版创建virtual host的nginx配置文件,只支持http的版本
  • 如果is_default_conf设置是默认域名,删除当前Nginx的default配置文件
  • 确认这个virtual host的root文件(/index.html)是否存在,不存在创建
  • 为letsencrypt创建所需的web目录
  • 将virtual host的nginx配置文件链接(ln)到Nginx配置文件目录下
  • 运行letsencrypt创建证书文件
  • 创建新的virtual host的nginx配置文件,在支持http基础上,支持https和http2
  • 创建定时任务,每天运行一次letsencrypt renew,更新证书,防止过期

相关知识学习总结#

有关Ansible#

Ansible role很强大,可以依据这个,创建适合运营使用的顺手的组合自动工具集。

这次使用中印象比较深刻的:

  • roles的规则,让各种代码配置文件都有约定好的位置,便于多人合作和复用
  • 使用j2模版可灵活处理各种配置文件
  • 使用 notifyhandlers,复用多次使用的任务,比如我这里用于重启Nginx
  • 变量的默认值处理,很方便
  • Ansible的内置模块很多,常规工作基本不需要自己定制的命令

有关Nginx#

这次尝试了在同一个IP地址下创建多个HTTPS虚拟主机。

需要SNI支持。这既需要服务器端支持,也需要客户端支持。好在目前主流的服务器端和客户端都支持。

本文中的roles,可在:

  • 屏蔽掉nginx-install.yml任务(Nginx已经安装的情况下)
  • 屏蔽掉is_default_conf

经测试,多次运行这个roles,可创建多个HTTPS虚拟主机。

有关Let’s Encrypt#

不要重复创建同一个域名,会在letsencrypt创建证书任务hung住,因为letsencrypt会弹出交互信息,它不允许频繁的真对相同域名的操作,我印象里每7天允许有5次。

letsencrypt renew不放心,cron的时候使用了post-hook

  • 我不确认renew后,nginx是否会自动生效,看了几个国外的帖子,有说不生效需要nginx reload的
  • 因此,使用post-hook在cron执行renew后执行nginx reload
  • 目前不确认我这个设置是否生效,需要后续检查