⽬前Nginx的配置⽂件在所有的服务器上都是相同的,但我希望能根据每⼀台服务器的性能去定制服务的启动进程。
同时定制每⼀台Nginx服务的响应头,以便于当某台服务出现问题时能快速定位到具体的服务器。
要做这样的定制势必会导致⼀个问题,Nginx 在每台物理服务器上的配置⽂件都不⼀样,
这样的配置⽂件如何管理呢? 再使⽤copy 模块去做管理显然已经不合适。
此时使⽤Ansible 提供的另⼀个模板(template) 功能,它可以帮助我们完美的解决问题。
要学会Ansible 中的模板(template)使⽤,前提我们必须要学会JinJa2模板。学会了它,就相当于我们学会了Ansible 模板。
Jinja2是基于Python书写的模板引擎。功能⽐较类似于PHP的smarty模板。
1、jinja2 ⽂件以 .j2 为后缀, 也可以不写后缀。
2、jinja2 中存在 三种定界符
{% if %} ... {% elif %} ... {% else %} ... {% endif %}
Example
{# 如果定义了 idc 变量, 则输出 #} {% if idc is defined %} {{ idc }} {% elif %} 没有定义 {% endif %}
{% for %} ... ... {% endfor %}
Example
{# 列举出 dbservers 这个 group 中的所有主机 #} {% for host in groups['dbservers'] %} {{ host }} {% endfor %} {#与Python 语法不通,模板中的循环内不能break或continue。但你可以在迭代中过滤序列来跳过某些项#} {#打印dbservers 组中的所有主机,但是不打印1.1.1.1 这台主机#} {% for host in groups['dbservers'] if host !="1.1.1.1" %} {{host}} {% endfor %}
⼀个基于Facts的Jinja2 实例
# cat config.j2 {# use variable example #} {# 都是内置变量 #} wlecome host {{ ansible_hostname }}, os is {{ ansible_os_family }} today is {{ ansible_date_time.date }} cpucore numbers {{ ansible_processor_vcpus }} {# use condition example #} {% if ansible_processor_vcpus > 1 %} OS CPU more than one core {% endif %} {% for m in ansible_mounts if m['mount'] != "/" %} mount {{ m['mount'] }}, total size is {{m['size_total']}}, free size is {{m['size_available']}} {% endfor %}
在Ansible 中使⽤模板
--- - name: a template example hosts: all remote_user: root tasks: - name: update jinja2 config template: src=config.j2 dest=/tmp/config.conf
Jinja2 模板以及如何在Ansible中使⽤模板,已经介绍完了。那么如何去实现我们的需求呢?
# cat nginx.conf.j2 user nginx; {# start process equal cpu cores #} worker_processes {{ ansible_processor_vcpus }}; error_log /var/log/nginx/error.log; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; sendfile on; tcp_nopush on; keepalive_timeout 0; gzip on; gzip_min_length 1k; gzip_buffers 8 64k; gzip_http_version 1.0; gzip_comp_level 5; gzip_types text/plain application/x-javascript text/css application/json application/xml application/x-shockwave-flash application/javascript image/svg+xml image/x-icon; gzip_vary on; {# add_header {{ ansible_hostname }}; #} add_header x-hostname {{ ansible_hostname }}; include /etc/nginx/conf.d/*.conf; }
继续优化我们的PlayBook, 让它⽀持模板
vars: createuser: - tomcat - www - mysql tasks: - name: create user user: name={{ item }} state=present with_items: "{{ createuser }}" - name: yum nginx webserver yum: name=nginx state=present # use ansible template - name: update nginx main config template: src: nginx.conf.j2 dest: /etc/nginx/nginx.conf tags: updateconfig notify: reload nginx server - name: add virtualhost config copy: src: www.qfedu.com.conf dest: /etc/nginx/conf.d/ tags: updateconfig notify: reload nginx server - name: check nginx syntax shell: /usr/sbin/nginx -t register: nginxsyntax tags: updateconfig - name: check nginx running stat: path=/var/run/nginx.pid register: nginxrunning tags: updateconfig - name: print nginx syntax debug: var=nginxsyntax - name: start nginx server service: name=nginx state=started when: - nginxsyntax.rc == 0 - nginxrunning.stat.exists == false handlers: - name: reload nginx server service: name=nginx state=started when: - nginxsyntax.rc == 0 - nginxrunning.stat.exists == true
执⾏还是按照原来的⽅式执⾏即可
ansible-playbook -i hosts site.yml
1