jinja2模版的使用

发布时间:2023年12月25日

目录

前言

练习1:用copy拷贝一个文件到db主机组。

练习2:修改1.yaml的内容如下。

练习3:验证,命令如下。

2. if 判断

练习:写一个 jinja2模板文件,内容如下。

3. for循环

练习:写一个变量文件users_list.txt,里面包含一个名称为users的列表,命令如下。

3. handlers


?


前言

本章主要介绍在playbook中如何使用jinja2模板。
  • 什么是jinja2模板
  • 在jinja2模板文件中写if判断语句
  • 在jinja2模板文件中写for循环语句
  • handlers的使用

可以使用copy模块把本地的一个文件拷贝到远端机器,下面再次复习一下。

本章实验都在/home/demo4下操作,先把demo4目录创建出来并把ansible.cfg
和hosts拷贝进去,命令如下。
[bdqn@RHEL813 ~]$ mkdir demo4
[bdqn@RHEL813 ~]$ cp ansible.cfg hosts demo4
[bdqn@RHEL813 ~]$ cd demo4
[bdqn@RHEL813 demo4]$ ls
ansible.cfg  hosts
[bdqn@RHEL813 demo4]$

练习1:用copy拷贝一个文件到db主机组。

有一个文件aa.txt,内容如下。
[bdqn@RHEL813 demo4]$ cat aa.txt 
+----------------------------------------------------+
| 我的IP地址是: {{ansible_default_ipv4.address}}
+----------------------------------------------------+
[bdqn@RHEL813 demo4]$ 
这个文件中包含一个 fact变量 ansible_default_ipv4.address。
写一个 playbook,内容如下。
[bdqn@RHEL813 demo4]$ cat 1.yaml 
---
- hosts: db
  tasks:
          - name: 拷贝一个文件到远端主机
            copy: src=aa.txt dest=/opt/aa.txt
[bdqn@RHEL813 demo4]$ 
运行此playbook,命令如下。
?
[bdqn@RHEL813 demo4]$ ansible-playbook 1.yaml 

PLAY [db] ***************************************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************************
ok: [server2]
ok: [server3]

TASK [拷贝一个文件到远端主机] ******************************************************************************************************************
changed: [server2]
changed: [server3]

PLAY RECAP **************************************************************************************************************************
server2                    : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
server3                    : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

[bdqn@RHEL813 demo4]$ 
现在已经把本地的aa.,txt拷贝到server2和 server3的/opt目录中了。下面查看这两台主机上 /opt/aa.txt的内容,命令如下。
[bdqn@RHEL813 demo4]$ ansible db -m shell -a "cat /opt/aa.txt"
server2 | CHANGED | rc=0 >>
+----------------------------------------------------+
| 我的IP地址是: {{ansible_default_ipv4.address}}
+----------------------------------------------------+
server3 | CHANGED | rc=0 >>
+----------------------------------------------------+
| 我的IP地址是: {{ansible_default_ipv4.address}}
+----------------------------------------------------+
[bdqn@RHEL813 demo4]$ 
可以看到,当用copy拷贝一个文件到远端机器时,如果这个文件中有变量,拷贝过去的
文件中的变量并不会变成具体的值。
如果希望文件考别过去之后,文件中的变量变成具体的值,那么就不能使用copy模块,而是要使用template模块了。

练习2:修改1.yaml的内容如下。

[bdqn@RHEL813 demo4]$ cat 1.yaml 
---
- hosts: db
  tasks:
          - name: 拷贝一个文件到远端主机
            template: src=aa.txt dest=/opt/aa.txt
[bdqn@RHEL813 demo4]$ 
与刚才相比,只是把copy换成了template。template模块的用法与copy模块一致,所以
这里选项并没有变。运行此 playbook,命令如下。
[bdqn@RHEL813 demo4]$ ansible-playbook 1.yaml 

PLAY [db] ***************************************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************************
ok: [server2]
ok: [server3]

TASK [拷贝一个文件到远端主机] ******************************************************************************************************************
changed: [server2]
changed: [server3]

PLAY RECAP **************************************************************************************************************************
server2                    : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
server3                    : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

[bdqn@RHEL813 demo4]$ 
再次查看两台主机上/opt/aa.txt的内容,命令如下。
[bdqn@RHEL813 demo4]$ ansible db -m shell -a "cat /opt/aa.txt"
server2 | CHANGED | rc=0 >>
+----------------------------------------------------+
| 我的IP地址是: 192.168.103.14
+----------------------------------------------------+
server3 | CHANGED | rc=0 >>
+----------------------------------------------------+
| 我的IP地址是: 192.168.103.15
+----------------------------------------------------+
[bdqn@RHEL813 demo4]$ 
可以看到,通过template拷贝含有变量的文件时,拷贝到远端机器之后,文件中的变量
会变成具体的值。
这个通过template拷贝的、含有变量的文件我们称为jinja2模板,jinja2模板文件的后缀
一般使用j2,这不是必需的,但是建议使用j2作为后缀。
所以,需要修改aa.txt的文件为aa.j2:
[bdqn@RHEL813 demo4]$ mv aa.txt aa.j2
[bdqn@RHEL813 demo4]$ 
同时修改1.yaml中对应的内容,如下所示。
[bdqn@RHEL813 demo4]$ cat 1.yaml 
---
- hosts: db
  tasks:
          - name: 拷贝一个文件到远端主机
            template: src=aa.j2 dest=/opt/aa.txt
[bdqn@RHEL813 demo4]$ 
这里如果jinja2模板文件没有写路径,例如,例子中 src=aa.j2的aa.j2没有写路径,则优
先到当前目录的templates 中找aa.j2,如果没有,则到当前目录中找aa.j2

练习3:验证,命令如下。

[bdqn@RHEL813 demo4]$ mkdir templates
[bdqn@RHEL813 demo4]$ 

在templates目录中创建aa.j2,内容如下。

[bdqn@RHEL813 demo4]$ cat templates/aa.j2 
+-----------------------------------------------------+
| 我的主机名是: {{ansible_fqdn}}
+-----------------------------------------------------+
[bdqn@RHEL813 demo4]$ 
这样我们就有两个aa.j2了,还有一个是当前目录下的aa.j2,如下所示。
[bdqn@RHEL813 demo4]$ cat aa.j2 
+----------------------------------------------------+
| 我的IP地址是: {{ansible_default_ipv4.address}}
+----------------------------------------------------+
[bdqn@RHEL813 demo4]$ 
再次运行此playbook,命令如下。
[bdqn@RHEL813 demo4]$ ansible-playbook 1.yaml 

PLAY [db] ***************************************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************************
ok: [server2]
ok: [server3]

TASK [拷贝一个文件到远端主机] ******************************************************************************************************************
changed: [server3]
changed: [server2]

PLAY RECAP **************************************************************************************************************************
server2                    : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
server3                    : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

[bdqn@RHEL813 demo4]$ 
查看两台主机上/opt/aa.txt 的内容,命令如下。
[bdqn@RHEL813 demo4]$ ansible db -m shell -a "cat /opt/aa.txt"
server2 | CHANGED | rc=0 >>
+-----------------------------------------------------+
| 我的主机名是: RHEL8
+-----------------------------------------------------+
server3 | CHANGED | rc=0 >>
+-----------------------------------------------------+
| 我的主机名是: RHEL812
+-----------------------------------------------------+
[bdqn@RHEL813 demo4]$ 
这里可以看到显示的主机名,所以是 templates目录中的aa.j2生效了。

2. if 判断

在jinja2模板文件中,我们也是可以使用if判断语句的,语法格式如下。
{% if 判断1 %}
  内容1
  {% elif 判断2 %}
  内容2
  ...多个elif...
  {% else %}
  内容3
  {% endif %}
注意
(1)“%”两边有没有空格都可以,不过所有的“%”前后空格要保持一致,即要有都
有,要没有都没有。

(2)if和elif中的内容如果太长了,可以另起一行写。

如果判断1成立,则打印内容1,后面的条件不再判断,直接跳转到endif后面的内容;如果判断1不成立,则执行elif后面的判断2,如果成立则打印内容2,后面的条件不再判断,直接跳转到endif后面的内容。以此类推,如果所有的f和elif都不成立,则打印else中的内容。

(3)elif和 else不是必需的

练习:写一个 jinja2模板文件,内容如下。

[bdqn@RHEL813 demo4]$ cat templates/bb.j2 
 1111
{% if ansible_fqdn=="RHEL8" %}
 {{ansible_fqdn}}
{% else %}
 aaaa
{% endif %}
 3333
[bdqn@RHEL813 demo4]$ 
这里jinja2模板所生成的文件一共会产生3行内容,第一行的1111和第三行的3333是必打
文章来源:https://blog.csdn.net/S483374558/article/details/135192219
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。