Ansible jinja2模板


什么是jinja2模板

jinja2是Python的全功能模板引擎

jinja2与Ansible啥关系

Ansible通常会使用jinja2模板来修改被管理主机的配置文件等...在saltstack中同样会使用到jinja2
如果在100台主机上安装nginx,每台nginx的端口都不一样,如何解决?

Ansible如何使用jinja2

使用Ansible的jinja2模板也就是使用template模块,该模块和copy模块一样,都是讲文件复制到远端主机上去,
但是区别在于,template模块可以获取到文件中的变量,而copy则是原封不动的把文件内容复制过去。
之前我们在推送rsync的backup脚本时,想把脚本中的变量名改成主机名,
如果使用copy模块则推送过去的就是{{ ansible_fqdn }},不变,如果使用template,则会变成对应的主机名。

Ansible使用Jinja2注意事项

Ansible允许jinja2模板中使用条件判断和循环,但是不允许在playbook中使用。
注意:不是每个管理员都需要这个特性,但是有些时候jinja2模块能大大提高效率。

Ansible jinja2模板的使用

#### 基本语法
{{ EXPR }}输出变量值,会输出自定义的变量值或facts
1)playbook文件使用template模块
2)模板文件里面变量使用{{名称}},比如{{PORT}}或使用facts
## Jinja2模板逻辑判断
#循环表达式
{% for i in EXPR %}
{% endfor %}
 
#条件判断
{% if EXPR %}
{% elif EXPR %}
{% else %}
{% ednif %}
 
#注释
{# COMMENT #}
### 常规使用
- name: Deploy configuration file
  template:
    src: template.j2          # 源模板文件路径
    dest: /etc/config_file     # 目标文件路径
    
### 示范
template.j2
[settings]
server_name = {{ ansible_hostname }}
{{ http_port }}


- hosts: all
  vars:
    - http_port: 8080
  tasks:
    - name: Deploy configuration file
      template:
        src: template.j2
        dest: /tmp/my_config.conf
        

cat my_config.conf 
[settings]
server_name = 101
8080    

实例关机nginx反向代理

vim lb.yml
- hosts: ALL
  vars:
    http_port: 80
    server_name: www.起飞.com
  tasks:
    - name: install nginx
      apt: 
        name: nginx
    
    - name: copy
      template:
        src: ./nginx_conf.j2
        dest: /etc/nginx/conf.d/www.起飞.com.conf
      notify: reload nginx
  
  handlers:
    - name: reload nginx
      systemd:
        name: nginx
        state: reloaded
vim nginx_conf.j2
upstream {{ server_name }} {
{% for n in range(21) %}
        server 172.16.1.{{ n }}:{{ http_port }};
{% endfor %}
}
 
server {
        listen 80;
        server_name {{ server_name }};
 
        location / {
                root /code;
                index index.html;
                proxy_pass http://{{ server_name }};
                proxy_set_header Host $http_host;
        }
}

image-20241016201154079


keeplived 实战
vim keepalived.yml
- hosts: aa_group
  tasks:
    - name: copy file
      template:
        src: ./keepalived.j2
        dest: /etc/keepalived/keepalived.conf
      notify: restart keepalived
 
  handlers:
    - name: restart keepalived
      systemd:
        name: keepalived
        state: restarted
[root@m01 ~]# vim keepalived.j2
global_defs {
    router_id {{ ansible_fqdn }}
}
 
vrrp_instance VI_1 {
{% if ansible_fqdn == "101" %}
    state MASTER
    priority 150
{% else %}
    state BACKUP
    priority 100
{% endif %}
 
    interface eth0
    virtual_router_id 50
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {         
        10.0.0.3
    }
}

#keepalived master 配置文件
global_defs {
    router_id lb01
}
 
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 50
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {         
        10.0.0.3
    }
}
 
 
#keepalived backup配置文件
global_defs {
    router_id lb02
}
 
vrrp_instance VI_1 {
    state BACKUP        
    interface eth0
    virtual_router_id 50
    priority 100
    advert_int 1
    authentication {    
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.3
    }
}