VPS测评 VPS推荐 VPS优惠
Linux运维

Ansible template模板文件教程

模板是一个文本文件,可以做为生成文件的模版。模板文件中还可嵌套jinja2语法。

jinja2语言

Jinja2 是一个现代的,设计者友好的,仿照 Django 模板的 Python 模板语言。 它速度快,被广泛使用,并且提供了可选的沙箱模板执行环境保证安全。

特性

  • 沙箱中执行
  • 强大的 HTML 自动转义系统保护系统免受 XSS
  • 模板继承
  • 及时编译最优的 python 代码
  • 可选提前编译模板的时间
  • 易于调试,异常的行数直接指向模板中的对应行
  • 可配置的语法

jinja2 语言支持多种数据类型和操作

字面量,如: 字符串:使用单引号或双引号,数字:整数、浮点数

列表:[item1, item2, …]

元组:(item1, item2, …)

字典:{key1:value1, key2:value2, …}

布尔型:true/false

算术运算:+, -, *, /, //, %, **

比较操作:==, !=, >, >=, <, <=

逻辑运算:and,or,not

流表达式:For,If,When


template

template可以根据和参考模块文件,动态生成相类似的配置文件。

template文件必须存放在templates目录下,并且以 .j2 结尾。

yaml/yml 文件需和templates目录平级,目录结构如下示例

./
├── temnginx.yml
└── templates
     └── nginx.conf.j2

范例

利用template 同步nginx配置文件

首先,在templates目录下创建nginx.conf.j2文件

user nginx;
worker_processes {{ ansible_processor_vcpus }};
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
    worker_connections 1024;
    multi_accept on;
}

http {
    charset utf-8;
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
    ssl_prefer_server_ciphers on;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    gzip on;

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

创建nginx.yml同步nginx配置文件

---
#nginx.yml
- hosts: webservers

  tasks: 
    - name: Create nginx config file
      template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf    
      notify: Restart service
  handlers:
    - name: Restart service
      service: name=nginx state=restarted   

执行命令后,远程主机配置文件的worker_processes的值动态地变成了CPU的核数(这里是4核)

worker_processes 4;

template还支持算数运算,例如上述模板文件可以写成

worker_processes {{ ansible_processor_vcpus+2 }};

流程控制for和if

template中也可以使用流程控制 for 循环和 if 条件判断,实现动态生成文件功能。

for循环

格式

{% for i in EXPR %}
...
{% endfor %}

示例

{% for i in range(1,10) %}
server_name web{{i}};
{% endfor %}

范例

模板文件nginx2.conf.j2

{% for port in ports %}
listen {{ port }}
{% endfor %}

playbook文件nginx2.yml

---
#nginx1.yml
- hosts: webservers
  vars:
    ports:
      - 80
      - 81
      - 82
  tasks:
    - name: template config
      template: src=nginx2.conf.j2 dest=/tmp/nginx2.conf

命令结果

[root@frog448 ~]#cat /tmp/nginx2.conf 
listen 80
listen 81
listen 82

if 条件判断

在模版文件中还可以使用 if条件判断,决定是否生成相关的配置信息

范例

模板文件nginx3.conf.j2

{% for vhost in vhosts %}
server {
listen {{ vhost.port }};
{% if vhost.server_name is defined %}
server_name {{ vhost.server_name }};
{% endif %}
root {{ vhost.root }};
}
{% endfor %}

playbook文件nginx3.yml

---
- hosts: webservers
  vars:
    vhosts:
      - port: 80
        root: /var/www/html1/
      - port: 81
        server_name: frog2.com
        root: /var/www/html2/
      - port: 82
        server_name: frog3.com
        root: /var/www/html3/
  tasks:
    - name: Create nginx config file
      template: src=nginx3.conf.j2 dest=/tmp/nginx3.conf

命令执行结果

[root@frog448 ~]#cat /tmp/nginx3.conf 
server {
listen 80;
root /var/www/html1/;
}
server {
listen 81;
server_name frog2.com;
root /var/www/html2/;
}
server {
listen 82;
server_name frog3.com;
root /var/www/html3/;
}
未经允许不得转载:青蛙主机 » Ansible template模板文件教程

VPS相关常用工具

PING测试工具自用毛子接码站