ansible笔记第四章(jinj2的使用与role的使用)
一、jinj2概述
1.jinja2模板与Ansible有什么关系
Ansible通常会使用Jlinja2模板来修改被管理主机的配置文件。例如给10台远程主机都装上httpd服务,但是要求每个服务器的端口不一样,如何解决?
2.Ansible如何使用inja2模板
使用ansible的jinja2模板,也就是template模块。该模块和copy模块一样,都是将文件复制到远端主机上去,但是区别在于template模块可以获取要复制的文件中变量的值,而copy则是原封不动的把文件内容复制过去。比如:针对不同的主机定义不同的变量,template会在将配置文件分发出去前读取变量到jinja2模板,然后分发到不同的被管理主机上。
Ansible使用inja注意事项
Ansible允许jinja2模板中使用条件判断和循环,但是jinja判断循环语法不允许在playbook中使用。注意:不是每个管理员都需要这个特性,但是有些时慎inja2模板能大大提高效率。
二、基本使用
1.循环与判断
{% if EXPR %}...{% elif EXPR %}...{% endif%} 作为条件判断
--------------------------------------判断语句
{% if ansible_fqdn == "web01" %}
echo "123"
{% elif ansible_fqdn == "web02" %}
echo "456"
{% else %}
echo "789"
{% endif %}
--------------------------------------循环语句
{% for i in EXPR %}...{% endfor%} 作为循环表达式
{% for i in range(1,10) %}
server 172.16.1.{{i}};
{% endfor %}
{# COMMENT #} 表示注释
2.jinja2 渲染 nginx_proxy配置文件 keepalived配置文件
-------------------nginx_proxy配置文件
[root@m01 project1]# cat kod_proxy.conf.j2
upstream {{ server_name }} {
{% for i in range(1,10) %}
server 172.16.1.{{i}}:{{http_port}} weight=2;
{% endfor %}
}
server {
listen {{ http_port }};
server_name {{ server_name }};
location / {
proxy_pass http://{{ server_name }};
include proxy_params;
}
}
-------------------keepalived配置文件
[root@m01 project1]# cat keepalived.conf.j2
global_defs {
router_id {{ ansible_fqdn }}
}
vrrp_instance VI_1 {
{% if ansible_fqdn == "lb01" %}
state MASTER
priority 150
{% elif ansible_fqdn == "lb02" %}
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
}
}
------------------------------判断变量是否有值
- hosts: webservers
gather_facts: no
vars:
PORT: 13306
tasks:
- name: Copy MySQL Configure
template: src=./my.cnf.j2 dest=/tmp/my.cnf
---------------------------------------------
[root@m01 project1]# cat my.cnf.j2
{% if PORT %}
bind-address=0.0.0.0:{{ PORT }}
{% else %}
bind-address=0.0.0.0:3306
{% endif %}
三、role的基本使用
1.Ansible Roles目录结构
2.Ansible Roles依赖关系
3.roles的基本操作
Roles基于一个已知的文件结构 tasks handlers templates .....
Roles小技巧:
1.创建roles目录结构,手动或使用ansible-galaxy init test roles
2.编写roles的功能,也就是tasks。
3.最后playbook引用roles编写好的tasks。
[root@m01 project2]# mkdir memcached/{tasks,handlers,templates,vars,files} -pv
[root@m01 project2]# mkdir {nginx,php-fpm}/{tasks,handlers,templates} -p
galaxy(默认下载目录,相当与github)
/root/.ansible/roles