Ansible教程(6)template模块与Jinja2模板
一、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地址
}
} 版权声明:本文章版权归数据库运维网(www.ywdba.cn)所有。如需引用本站内容,请注明来源及作者。




评论