15.Ansible Jinja2模板
15.1.jinja2模板概述
15.1.1.什么是jinja2模板
15.1.2.jinja2与Ansible啥关系
15.1.3.Ansible如何使用Jinja2
15.1.4.Ansible使用Jinja2注意事项
15.2.Ansible jinja2模板使用
15.2.1.变量使用语法
15.2.2.Jinja2模板逻辑判断语法
15.2.3.Jinja2模板循环语法
15.2.4.注释
15.3.Jinja2模板测试
15.3.2.实例二
15.Ansible Jinja2模板
转自:https://blog.csdn.net/weixin_48981270/article/details/117756914
15.1.jinja2模板概述
15.1.1.什么是jinja2模板
jinja2是Python的全功能模板引擎
15.1.2.jinja2与Ansible啥关系
Ansible通常会使用jinja2模板来修改被管理主机的配置文件等…在saltstack中同样会使用到jinja2
如果在100台主机上安装redis,每台redis的监听地址都不一样,如何解决?
15.1.3.Ansible如何使用Jinja2
使用Ansible的jinja2模板也就是使用template模块,该模块和copy模块一样,都是将文件复制到远端主机上去,但是区别在于,template模块可以获取到文件中的变量,而copy则是原封不动的把文件内容复制过去。之前我们在推送rsync的backup脚本时,想把脚本中的变量名改成主机名,如果使用copy模块则推送过去的就是{{ ansible_fqdn }},不变,如果使用template,则会变成对应的主机名。
15.1.4.Ansible使用Jinja2注意事项
Ansible允许jinja2模板中使用条件判断和循环,但是不允许在playbook中使用。
注意:不是每个管理员都需要这个特性,但是有些时候jinja2模块能大大提高效率。
15.2.Ansible jinja2模板使用
15.2.1.变量使用语法
{{ EXPR }} 输出变量值,会输出自定义的变量值或facts
1.playbook文件使用template模板
2.模板文件里面变量使用 {{ 名称 }}, 比如 {{ PORT }} 或使用facts
15.2.2.Jinja2模板逻辑判断语法
#shell中的判断语法
[root@m01 project]# vim pd.sh
#!/bin/bash
age=$1
if [ $age -lt 18 ];then
echo "小姐姐"
else
echo "大妈"
fi
#Jinja2模板判断语法
#条件判断
{% if EXPR %}
{% elif EXPR %}
{% else %}
{% endif %}
15.2.3.Jinja2模板循环语法
#shell中的循环
[root@m01 project]# vim xh.sh
#!/bin/bash
for i in `seq 10`
do
echo $i
done
#Jinja2模板循环语法
#循环表达式
{% for i in EXPR %}
{% endfor %}
15.2.4.注释
# shell中的注释
使用#写在注释内容最前面
#Jinja2模板注释语法
{# COMMENT #}
15.3.Jinja2模板测试
15.3.1.实例一
1)配置登录文件的jinja2模板
[root@node2 workspace]# cat motd.j2
Welcome to {{ ansible_fqdn }}
This system total mem is : {{ ansible_memtotal_mb }} MB
This system free mem is: {{ ansible_memfree_mb }} MB
2)编写playbook
[root@node2 workspace]# cat motd.yml
- hosts: all
tasks:
- name: Config motd
template:
src: ./motd.j2
dest: /etc/motd
3)执行并查看
[root@node2 workspace]# ansible-playbook motd.yml
PLAY [all] *******************************************************************************************************
TASK [Gathering Facts] *******************************************************************************************
ok: [172.17.0.5]
ok: [172.17.03]
ok: [172.17.0.6]
ok: [172.17.0.4]
ok: [172.17.0.3]
ok: [172.17.06]
ok: [172.17.04]
ok: [172.17.05]
TASK [Config motd] ***********************************************************************************************
changed: [172.17.0.5]
changed: [172.17.0.4]
changed: [172.17.0.3]
changed: [172.17.0.6]
changed: [172.17.03]
changed: [172.17.04]
changed: [172.17.05]
changed: [172.17.06]
PLAY RECAP *******************************************************************************************************
172.17.0.3 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
172.17.0.4 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
172.17.0.5 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
172.17.0.6 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
172.17.03 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
172.17.04 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
172.17.05 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
172.17.06 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@node2 workspace]# cat /etc/motd
Welcome to node2
This system total mem is : 12560 MB
This system free mem is: 10638 MB
[root@node2 workspace]#
15.3.2.实例二
1)配置数据库配置文件
#正常的配置文件
[root@m01 project]# vim conf/upstream.conf
upstream web {
server 172.16.1.7;
server 172.16.1.8;
}
server {
listen 80;
server_name linux.wp.com;
location / {
proxy_pass http://web;
proxy_set_header Host $http_host;
}
}
#不正经的配置文件
[root@m01 project]# vim conf/upstream.j2
upstream {{ server_name }} {
{% for i in range(7,20) %}
server {{ net_ip }}.{{ i }};
{% endfor %}
}
server {
listen {{ web_port }};
server_name {{ server_name }};
location / {
proxy_pass http://{{ server_name }};
proxy_set_header Host $http_host;
}
}
2)配置变量文件
[root@m01 project]# vim upstream_vars.yml
server_name: linux.wp.com
web_port: 80
net_ip: 172.16.1
3)编写剧本
[root@m01 project]# vim lb.yml
- hosts: lb_server
vars_files: ./upstream_vars.yml
tasks:
- name: Config Nginx Upstream
template:
src: conf/upstream.j2
dest: /etc/nginx/conf.d/upstream.conf
notify: restert_upstream
- name: Start Nginx Server
systemd:
name: nginx
state: started
handlers:
- name: restert_upstream
systemd:
name: nginx
state: restarted
4)执行并测试
[root@m01 project]# ansible-playbook lb.yml