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)所有。如需引用本站内容,请注明来源及作者。
评论