12_Ansible Jinja2模板概述、如何使用Jinja2、使用Jinja2注意事项、jinja2模板使用、变量使用语法、Jinja2模板逻辑判断语法、Jinja2模板循环语法、注释等

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

猜你喜欢

转载自blog.csdn.net/toto1297488504/article/details/132235411