一、为什么需要Nginx配置模板化

想象一下,你管理着几十台服务器,每台都要手动修改Nginx配置。改一个参数就得重复几十次,不仅容易出错,效率还低。这时候,用Ansible把Nginx配置变成模板,就能像发快递一样批量推送到所有服务器,省时省力还不会漏掉任何细节。

二、Ansible模板引擎Jinja2基础

Ansible的模板功能基于Jinja2,它就像个智能填空工具。比如下面这个最简单的Nginx模板示例:

# 技术栈:Ansible + Jinja2
# nginx_template.conf.j2
server {
    listen {{ nginx_port }};       # 端口变成变量
    server_name {{ server_name }}; # 域名也变成变量
    location / {
        root {{ web_root }};       # 网站根目录可配置
        index index.html;
    }
}

在playbook中这样使用:

- name: 部署Nginx配置
  template:
    src: nginx_template.conf.j2
    dest: /etc/nginx/conf.d/app.conf
  vars:
    nginx_port: 8080
    server_name: "example.com"
    web_root: "/var/www/html"

三、实战:多环境配置管理

实际项目中我们常需要区分开发、测试、生产环境。来看个带条件判断的进阶模板:

# 技术栈:Ansible + Jinja2
# multi_env_template.conf.j2
server {
    listen {{ nginx_port }};
    {% if env == "prod" %}  # 生产环境特殊配置
    server_name www.{{ domain }};
    access_log /var/log/nginx/prod_access.log;
    {% else %}              # 非生产环境配置
    server_name test.{{ domain }};
    access_log /var/log/nginx/dev_access.log;
    {% endif %}

    location /static {
        alias {{ static_path }};
        expires 30d;  # 静态资源缓存30天
    }
}

对应的变量文件可以这样写:

# group_vars/prod.yml
env: "prod"
domain: "myapp.com"
static_path: "/data/static/prod"

# group_vars/dev.yml 
env: "dev"
domain: "dev.myapp.com"
static_path: "/data/static/dev"

四、高级技巧:循环与变量组合

当需要批量配置多个域名时,循环就派上用场了:

# 技术栈:Ansible + Jinja2
# multi_site_template.conf.j2
{% for site in nginx_sites %}
server {
    listen 80;
    server_name {{ site.name }};
    
    location / {
        proxy_pass http://{{ site.backend }}:{{ site.port }};
        proxy_set_header Host $host;
    }
    
    # 每个站点独立的错误日志
    error_log /var/log/nginx/{{ site.name }}_error.log;
}
{% endfor %}

对应的变量定义:

nginx_sites:
  - name: "blog.example.com"
    backend: "192.168.1.10"
    port: 2368
  - name: "api.example.com"
    backend: "192.168.1.20" 
    port: 3000

五、应用场景与技术优劣

典型应用场景

  1. 电商大促时需要快速扩容Nginx节点
  2. 微服务架构中频繁变更路由规则
  3. 多数据中心统一配置管理

优势

  • 变更效率提升10倍以上
  • 配置版本可追溯(配合Git)
  • 避免人工操作失误

注意事项

  1. 模板中变量名要有明确前缀(如nginx_)避免冲突
  2. 生产环境推送前先在测试环境验证
  3. 敏感信息(如SSL证书)建议用Ansible Vault加密

六、完整部署流程示例

下面展示从模板生成到服务重启的完整流程:

# 技术栈:Ansible完整playbook
- hosts: nginx_servers
  tasks:
    - name: 安装Nginx
      apt:
        name: nginx
        state: latest
        
    - name: 推送模板配置
      template:
        src: templates/nginx_main.conf.j2
        dest: /etc/nginx/nginx.conf
        backup: yes  # 自动备份旧配置
      notify: 重启Nginx  # 触发handler
    
    - name: 检查配置语法
      command: nginx -t
      register: nginx_test
      changed_when: false
      
    handlers:
    - name: 重启Nginx
      service:
        name: nginx
        state: restarted
      when: nginx_test.rc == 0  # 语法检查通过才重启

七、总结

通过模板化+自动化,原本需要半天的工作现在几分钟就能完成。建议从简单配置开始尝试,逐步过渡到复杂场景。记住自动化不是目的,提升运维质量才是关键。当你的模板库积累到一定规模,会发现整个运维体系都变得轻松可控。