本章主要介绍在playbook中如何使用jinja2模板
[blab@node01 ~]$ mkdir demo4
[blab@node01 ~]$ cp ansible.cfg hosts demo4/
[blab@node01 ~]$ cd demo4/
[blab@node01 demo4]$
[blab@node01 demo4]$ cat aa.txt
+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+
| 我的 IP 地址是: {{ansible_default_ipv4.address}}
+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+
[blab@node01 demo4]$
[blab@node01 demo4]$ cat 1.yml
---
- hosts: db
tasks:
- name: 拷贝一个文件到远端主机
copy: src=aa.txt dest=/opt/aa.txt
[blab@node01 demo4]$
[blab@node01 demo4]$ ansible-playbook 1.yml
PLAY [db] **********************************************************************
TASK [Gathering Facts] *********************************************************
ok: [node03]
ok: [node02]
TASK [拷贝一个文件到远端主机] *************************************************************
changed: [node03]
changed: [node02]
PLAY RECAP *********************************************************************
node02 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node03 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[blab@node01 demo4]$
[blab@node01 demo4]$ ansible db -m shell -a "cat /opt/aa.txt"
node03 | CHANGED | rc=0 >>
+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+
| 我的 IP 地址是: {{ansible_default_ipv4.address}}
+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+
node02 | CHANGED | rc=0 >>
+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+
| 我的 IP 地址是: {{ansible_default_ipv4.address}}
+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+
[blab@node01 demo4]$
? ? ? ? 可以看到,当用copy拷贝一个文件到远端机器时,如果这个文件中有变量,拷贝过去的文件的变量并不会变成具体的值。
? ? ? ? 如果希望文件拷贝过去之后,文件中的变量变成具体的值,那么就不能用copy模块,而是要使用template模块了
[blab@node01 demo4]$ cat 1.yml
---
- hosts: db
tasks:
- name: 拷贝一个文件到远端主机
template: src=aa.txt dest=/opt/aa.txt
[blab@node01 demo4]$
[blab@node01 demo4]$ ansible-playbook 1.yml
PLAY [db] **********************************************************************
TASK [Gathering Facts] *********************************************************
ok: [node03]
ok: [node02]
TASK [拷贝一个文件到远端主机] *************************************************************
changed: [node03]
changed: [node02]
PLAY RECAP *********************************************************************
node02 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node03 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[blab@node01 demo4]$
[blab@node01 demo4]$ ansible db -m shell -a "cat /opt/aa.txt"
node03 | CHANGED | rc=0 >>
+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+
| 我的 IP 地址是: 192.168.182.210
+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+
node02 | CHANGED | rc=0 >>
+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+
| 我的 IP 地址是: 192.168.182.193
+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+
[blab@node01 demo4]$ cat 1.yml
---
- hosts: db
tasks:
- name: 拷贝一个文件到远端主机
template: src=aa.txt dest=/opt/aa.txt
[blab@node01 demo4]$
? ? ? ? 可以看到,通过template拷贝含有变量的文件时,拷贝到远端机器之后,文件中的变量会变成具体的值
? ? ? ? 这个通过template拷贝的,含有变量的文件我们称为jinja2模板,jinja2模板文件的后缀一般使用 j2 ,这不是必须的,但是建议使用j2作为后缀
所以,需要修改aa.txt 的文件为aa.j2
[blab@node01 demo4]$ mv aa.txt aa.j2
同时修改1.yml中对应的内容
[blab@node01 demo4]$ cat 1.yml
---
- hosts: db
tasks:
- name: 拷贝一个文件到远端主机
template: src=aa.j2 dest=/opt/aa.j2 //修改后缀名
[blab@node01 demo4]$
[blab@node01 demo4]$ mkdir templates
[blab@node01 demo4]$ cat template/aa.j2
+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+
| 我的主机名是: {{ansible_fqdn}}
+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+
[blab@node01 demo4]$
[blab@node01 demo4]$ cat aa.j2
+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+
| 我的 IP 地址是: {{ansible_default_ipv4.address}}
+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+
[blab@node01 demo4]$
[blab@node01 demo4]$ ansible-playbook 1.yml
PLAY [db] **********************************************************************
TASK [Gathering Facts] *********************************************************
ok: [node03]
ok: [node02]
TASK [拷贝一个文件到远端主机] *************************************************************
changed: [node03]
changed: [node02]
PLAY RECAP *********************************************************************
node02 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node03 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[blab@node01 demo4]$
[blab@node01 demo4]$ ansible db -m shell -a "cat /opt/aa.j2"
node03 | CHANGED | rc=0 >>
+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+
| 我的主机名是: node03
+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+
node02 | CHANGED | rc=0 >>
+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+
| 我的主机名是: node02
+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+
[blab@node01 demo4]$
{% if 判断1 %}
内容1
{% elif 判断2 %}
内容2
...多个elif...
{% else %}
内容3
{% endif %}
[blab@node01 demo4]$ cat templates/bb.j2
1111
{% if ansible_fqdn=="node02" %}
{{ansible_fqdn}}
{% else %}
aaaa
{% endif %}
3333
[blab@node01 demo4]$
[blab@node01 demo4]$ cat 2.yml
---
- hosts: db
tasks:
- name: 拷贝一个文件到远端
template: src=bb.j2 dest=/opt/bb.conf
[blab@node01 demo4]$
[blab@node01 demo4]$ ansible-playbook 2.yml
PLAY [db] **********************************************************************
TASK [Gathering Facts] *********************************************************
ok: [node03]
ok: [node02]
TASK [拷贝一个文件到远端] ***************************************************************
changed: [node03]
changed: [node02]
PLAY RECAP *********************************************************************
node02 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node03 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[blab@node01 demo4]$
[blab@node01 demo4]$ ansible db -m shell -a "cat /opt/bb.conf"
node03 | CHANGED | rc=0 >>
1111
aaaa
3333
node02 | CHANGED | rc=0 >>
1111
node02
3333
[blab@node01 demo4]$
[blab@node01 demo4]$ cat templates/cc.j2
1111
{% if ansible_fqdn=="node02"
and
ansible_distribution_major_version=="7" %}
{{ansible_fqdn}}
{% else %}
aaaa
{% endif %}
3333
[blab@node01 demo4]$
[blab@node01 demo4]$ cat 3.yml
---
- hosts: db
tasks:
- name: 我要拷贝一个文件过去
template: src=cc.j2 dest=/opt/cc.conf
[blab@node01 demo4]$
[blab@node01 demo4]$ ansible-playbook 3.yml
PLAY [db] **********************************************************************
TASK [Gathering Facts] *********************************************************
ok: [node03]
ok: [node02]
TASK [我要拷贝一个文件过去] **************************************************************
changed: [node03]
changed: [node02]
PLAY RECAP *********************************************************************
node02 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node03 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[blab@node01 demo4]$
[blab@node01 demo4]$ ansible db -m shell -a "cat /opt/cc.conf"
node03 | CHANGED | rc=0 >>
1111
aaaa
3333
node02 | CHANGED | rc=0 >>
1111
aaaa
3333
[blab@node01 demo4]$
{% for i in 列表名 %}
{{i}}
{% endfor %}
[blab@node01 demo4]$ cat templates/dd.conf.j2
{% set list1=['aa','bb','cc'] %}
1111
{% for i in list1 %}
{{i}}
{% endfor %}
5555
[blab@node01 demo4]$
[blab@node01 demo4]$ cat 4.yml
---
- hosts: db
tasks:
- name: 拷贝一个文件到远端主机
template: src=dd.conf.j2 dest=/opt/dd.conf
[blab@node01 demo4]$
[blab@node01 demo4]$ ansible-playbook 4.yml
PLAY [db] **********************************************************************
TASK [Gathering Facts] *********************************************************
ok: [node03]
ok: [node02]
TASK [拷贝一个文件到远端主机] *************************************************************
changed: [node03]
changed: [node02]
PLAY RECAP *********************************************************************
node02 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node03 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[blab@node01 demo4]$
[blab@node01 demo4]$ ansible db -m shell -a "cat /opt/dd.conf"
node03 | CHANGED | rc=0 >>
1111
aa
bb
cc
5555
node02 | CHANGED | rc=0 >>
1111
aa
bb
cc
5555
[blab@node01 demo4]$
[blab@node01 demo4]$ cat users_list.txt
users:
- uname: tom
age: 20
sex: man
- uname: tom
age: 19
sex: man
- uname: bob
age: 22
sex: man
- uname: mary
age: 23
sex: woman
- uname: wangwu
age: 24
sex: man
[blab@node01 demo4]$
[blab@node01 demo4]$ cat templates/ee.j2
现在 公司中所有员工姓名是:
{% for i in users %}
{{i.uname}}
{% endfor %}
[blab@node01 demo4]$
[blab@node01 demo4]$ cat 5.yml
---
- hosts: node02
vars_files:
- users_list.txt
tasks:
- name: 拷贝一个文件到远端
template: src=ee.j2 dest=/opt/ee.conf
[blab@node01 demo4]$
[blab@node01 demo4]$ ansible-playbook 5.yml
PLAY [node02] ******************************************************************
TASK [Gathering Facts] *********************************************************
ok: [node02]
TASK [拷贝一个文件到远端] ***************************************************************
changed: [node02]
PLAY RECAP *********************************************************************
node02 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[blab@node01 demo4]$
[blab@node01 demo4]$ ansible node02 -m shell -a "cat /opt/ee.conf"
node02 | CHANGED | rc=0 >>
现在 公司中所有员工姓名是:
tom
tom
bob
mary
wangwu
[blab@node01 demo4]$