jinja2模版的使用
2023-12-25 12:33:52
目录
练习:写一个变量文件users_list.txt,里面包含一个名称为users的列表,命令如下。
?
前言
本章主要介绍在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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!