Ansible教程(6)template模块与Jinja2模板

TangLu 系统运维 2023-11-11 14274 0

一、Ansible template模块与Jinja2模板介绍

在为不同的服务器进行配置时,可能存在服务器环境与硬件都不同的情况,这个时候需要根据服务器自身的信息进行不同的配置。比如配置Nginx最大进程数、Redis最大内存等。在Ansible中通过template模块与jinja2模版结合使用就可以解决此类问题。template模块和copy模块作用一样,都是把管理端的文件复制到客户端主机上,但是区别在于template模块可以通过jinja2模版来使用变量,通过变量就可以实现条件判断、循环、逻辑运算等,而copy只能原封不动的把文件内容复制过去。需要注意的是template只能在playbook中运行,不能使用命令行方式。


二、Ansible template使用方法

1、在playbook同级目录下创建一个templates目录,然后templates目录下创建模板文件,比如nginx.conf.j2,这样playbook可以直接引用和寻找这个模板文件,如果是创建到别的路径则需要单独指定

mkdir templates
cp /etc/conf/httpd.conf templates/httpd.conf.jinja2  #复制一个原始配置文件进行修改


2、创建playbook并使用template模板

cat test.yml 
---
- hosts: all
  remote_user: root
  vars:
    - listen_port: 88    #定义变量

  tasks:
    - name: Install Httpd
      yum: name=httpd state=installed
    - name: Config Httpd
      template: src=httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf    #使用模板文件httpd.conf.j2
      notify: Restart Httpd
    - name: Start Httpd
      service: name=httpd state=started
      
  handlers:
    - name: Restart Httpd
      service: name=httpd state=restarted


3、模板文件中引用变量

vi templates/httpd.conf.jinja2
Listen {{ listen_port }}  #这里的端口用变量替代


4、由于调用了listen_port这个变量,所以需要在主机列表文件中给每个主机定义这样一个变量(也可以将变量写在playbook中):

vi /etc/ansible/hosts
192.168.100.110 listen_port=80
192.168.100.120 listen_port=8080
192.168.100.130 listen_port=808
192.168.100.140 listen_port=8000

 

5、运行ansible-playbook test.yml即可


三、Ansible jinja2循环语句用法

jinja2中支持for循环,可以用于遍历文件获取数据,比如遍历主机清单中的主机,然后用这些主机的信息完成配置

cat nginx.conf.j2 
upstream {{ ha_domain }} {                          #ha_domain变量定义在了playbook中
    {% for host in groups['webservers'] %}          #遍历主机清单的webservers组,然后赋予给host变量
	server {{ host }}:{{ ha_node_port }};       #ha_node_port变量定义在了playbook中
    {% endfor %}
}

server {
	listen {{ ha_port }};
	server_name {{ ha_domain }};
	
	location / {
		proxy_pass http://{{ ha_domain }};
	}
}


四、Ansible jinja2判断语句用法

通过判断语句实现角色配置,比如部署Keepalived两个节点的主从角色

cat /etc/keepalived/keepalived.conf 
global_defs {     
    router_id {{ ansible_hostname }}       #这里使用了facts变量获取服务器信息
}

vrrp_instance VI_1 {
  {% if ansible_hostname == "proxy01" %}         #使用if语句进行判断,if语句本身不会被写进配置文件中
    state MASTER                  # 角色状态;
    priority 200                  # 当前物理节点在虚拟路由中的优先级;

  {% elif ansible_hostname == "proxy02" %}
    state BACKUP                   # 角色状态;
    priority 100                  # 当前物理节点在虚拟路由中的优先级;
  {% endif %}
  
	interface eth0 eth1              # 绑定当前虚拟路由使用的物理接口;
	virtual_router_id 50               # 当前虚拟路由标识,VRID;
    advert_int 3                  # vrrp通告时间间隔,默认1s;
    authentication {
        auth_type PASS             # 密码类型,简单密码;
        auth_pass 1111             # 密码不超过8位字符;
    }
    virtual_ipaddress {
        10.0.0.100  dev eth0 lable eth0:0      # VIP地址
    }
}	


评论