[原创]实战之Ansible生成Nginx的配置
本篇文章是由我们Ansible中文官方推出的:playbook编写技巧系统文章,前几节的文章有《[原创]其实...
本篇文章是由我们Ansible中文官方推出的:playbook编写技巧系统文章,前几节的文章有《[原创]其实playbook的代码可以这么简洁》、《[原创]巧用Roles优化playbook代码》、《[原创]Roles的高级玩法,带你玩转自动化》、《[原创]Roles技巧之Templates》、《[原创]Jinja2的条件判断高级使用》,以上文章具有连贯性,如果有需要,还请各位读者查阅
Ansible结合Jinja2生成Nginx配置
一、场景说明:
为2台Nginx Proxy,1台Nginx Web通过一套模板生成对应的配置二、场景实现方法:
- 步骤1: 编排目录如下:
nginxconf.ymlroles/nginxconf/├── tasks│ ├── file.yml│ └── main.yml├── templates│ └── nginx.conf.j2└── vars└── main.yml
目录的编排已多次提及,这里不再赘述,详情请见公众号文章列表。
- 步骤2: 编辑nginxconf role的tasks调度文件 roles/nginxconf/tasks/{file.yml,main.yml}
--- #此处的""是为了转义,读者可以忽略- name: nginx.conf.j2 tempalte transfer exampletemplate: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf.template
--- #此处的""是为了转义,读者可以忽略- include: file.yml
[list] - 编辑main.yml,定义任务功能集合,nginxconf role功能集入口:
- 编辑file.yml,定义nginxconf role的一个功能集(一个文件一个功能集):
{% if nginx_use_proxy %}
{% for proxy in nginx_proxies %}
upstream {{ proxy.name }} {
#server 127.0.0.1:{{ proxy.port }};
server {{ ansible_eth0.ipv4.address }}:{{ proxy.port }};
}
{% endfor %}
{% endif %}
server {
listen 80;
server_name {{ nginx_server_name }};
access_log off;
error_log /dev/null crit;
rewrite ^ https://$server_name$request_uri? permanent;
}
server {
listen 443 ssl;
server_name {{ nginx_server_name }};
ssl_certificate /etc/nginx/ssl/{{ nginx_ssl_cert_name }};
ssl_certificate_key /etc/nginx/ssl/{{ nginx_ssl_cert_key }};
root {{ nginx_web_root }};
index index.html index.html;
{% if nginx_use_auth %}
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/{{project_name}}.htpasswd;
{% endif %}
{% if nginx_use_proxy %}
{% for proxy in nginx_proxies %}
location {{ proxy.location }} {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto http;
proxy_set_header X-Url-Scheme $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_redirect off;
proxy_pass http://{{ proxy.name }};
break;
}
{% endfor %}
{% endif %}
{% if nginx_server_static %}
location / {
try_files $uri $uri/ =404;
}
{% endif %}
}
[/*][*]步骤4:编辑nginxconf role的变量文件roles/nginxconf/vars/main.yml:代码稍多但不复杂,考虑到篇幅不再赘述解释,难以理解的请回头阅读《[原创]Jinja2的条件判断高级使用》开始按序阅读。
--- #此处的""符号是为了转义,读者可以忽略[/*]
nginx_server_name: www.magedu.com
nginx_web_root: /opt/magedu/
nginx_proxies:
- name: suspicious
location: /
port: 2368
- name: suspicious-api
location: /api
port: 3000
- 该变量文件需要关注的是nginx_proxies定义的变量组,其下的变量列表通过for循环读取后可以通过“.”来引用,即如下 proxy.name这里的引用方式:
{% for proxy in nginx_proxies %}upstream {{ proxy.name }} {#server 127.0.0.1:{{ proxy.port }};
- name: Nginx Proxy Server's Conf Dynamic Create
hosts: "192.168.37.130:192.168.37.158"
vars:
nginx_use_proxy: true
nginx_ssl_cert_name: ifa.crt
nginx_ssl_cert_key: ifa.key
nginx_use_auth: true
project_name: suspicious
nginx_server_static: true
gather_facts: true
roles:
- { role: nginxconf }
- name: Nginx WebServer's Conf Dynamic Create
hosts: 192.168.37.159
vars:
nginx_use_proxy: false
nginx_ssl_cert_name: ifa.crt
nginx_ssl_cert_key: ifa.key
nginx_use_auth: false
project_name: suspicious
nginx_server_static: false
gather_facts: no
roles:
- { role: nginxconf }
[/*][*]步骤6 :验证结果验证[/*]在nginxconf.yml文件中,同样我们也定义的诸如nginx_use_proxy、nginx_ssl_cert_name、nginx_ssl_cert_key、nginx_use_auth、project_name、nginx_server_static的变量,同时我们不同类型的主机定义不同的变量生成的配置文件也不尽相同,Ansible的灵活性可见一斑。
- 执行如下命令:
ansible-playbook nginxconf.yml
- 后登录到NginxWeb 192.168.37.159查看/etc/nginx/nginx.conf.template配置文件,类似如下输出表示达到我们的预期
server {listen 80;server_name www.magedu.com;access_log off;error_log /dev/null crit;rewrite ^ https://$server_name$request_uri permanent;}server {listen 443 ssl;server_name www.magedu.com;ssl_certificate /etc/nginx/ssl/ifa.crt;ssl_certificate_key /etc/nginx/ssl/ifa.key;root /opt/magedu/;index index.html index.html;}
- 同理,登录到NginxProxy主机,查看其中一台Proxy的nginx.conf.template配置,类似如下输出表示达到我们的预期:
upstream suspicious {#server 127.0.0.1:2368;server 192.168.37.130:2368;}upstream suspicious-api {#server 127.0.0.1:3000;server 192.168.37.130:3000;}server {listen 80;server_name www.magedu.com;access_log off;error_log /dev/null crit;rewrite ^ https://$server_name$request_uri permanent;}server {listen 443 ssl;server_name www.magedu.com;ssl_certificate /etc/nginx/ssl/ifa.crt;ssl_certificate_key /etc/nginx/ssl/ifa.key;root /opt/magedu/;index index.html index.html;auth_basic "Restricted";auth_basic_user_file /etc/nginx/suspicious.htpasswd;location / {proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-Proto http;proxy_set_header X-Url-Scheme $scheme;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header Host $http_host;proxy_set_header X-NginX-Proxy true;proxy_redirect off;proxy_pass http://suspicious;break;}location /api {proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-Proto http;proxy_set_header X-Url-Scheme $scheme;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header Host $http_host;proxy_set_header X-NginX-Proxy true;proxy_redirect off;proxy_pass http://suspicious-api;break;}location / {try_files $uri $uri/ =404;}}
Ok,同样的模板通过简单的if和变量设置就可以完成不同类型主机的Nginxconf配置,所以一方面在了解Ansible强大的模板功能的同时,也需要看到模板质量的重要性
关注我们:好了,今天的分享就到这里了, 通过此配置实例完全能感受到Ansible的魅力了。我们将在明天为更为读者带来《Ansible结合Jinja2生成Apache多主机配置》的实例
关注 运维部落
微信扫一扫关注公众号