Ansible基础 - 06template模块与Jinja2
Ansible基础 - 06template模块与Jinja2
一、概述
template模块 支持 Jinja2渲染引擎和语法。
template使用jinja2格式作为文件模板,进行文档内变量的替换。每次使用都会被ansible标记为"changed"状态。
jinja2文件被 template模板执行后,文件里的变量会被具体的值代替,并传送到远程主机。
在roles里面调用了template模块,ansible 会在roles目录或其同级目录global_vars里面查找存储变量的文件。
二、template模块与jinja2模板
2.1 命令行使用template模块
[root@cl-server playbooks]# cat nginx-test.conf.j2
upstream {{server_name}} {
{% for i in range(2) %}
server 192.168.234.1{{i}}:{{http_port}};
{% endfor %}
}
server {
listen {{http_port}};
location / {
proxy_pass http://{{server_name}};
include proxy_params;
}
}
[root@cl-server playbooks]# cat /etc/ansible/group_vars/cl1.yml
http_port: 9099
server_name: cl3.kunking.com
[root@cl-server playbooks]# ansible cl-node01 -m template -a "src=/root/playbooks/nginx-test.conf.j2 dest=/tmp/nginx.conf"
--- before
+++ after: /root/.ansible/tmp/ansible-local-5469r3S4ds/tmpcNrJyF/nginx-test.conf.j2
@@ -0,0 +1,12 @@
+upstream cl3.kunking.com {
+ server 192.168.234.10:9099;
+ server 192.168.234.11:9099;
+ }
+server {
+ listen 9099;
+ location / {
+ proxy_pass http://cl3.kunking.com;
+ include proxy_params;
+ }
+
+}
cl-node01 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"checksum": "f18539a205517af1b28a71343794e15a296bfcd2",
"dest": "/tmp/nginx.conf",
"gid": 0,
"group": "root",
"md5sum": "4cd35955b4ca575212b7b7275eca45a5",
"mode": "0644",
"owner": "root",
"size": 210,
"src": "/root/.ansible/tmp/ansible-tmp-1641538992.91-5477-109296752414791/source",
"state": "file",
"uid": 0
}
[root@cl-node01 ~]# cat /tmp/nginx.conf
upstream cl3.kunking.com {
server 192.168.234.10:9099;
server 192.168.234.11:9099;
}
server {
listen 9099;
location / {
proxy_pass http://cl3.kunking.com;
include proxy_params;
}
}
2.2 playbook方式
[root@cl-server playbooks]# cat jinja-demo01.yml
- hosts: cl-node02
vars:
- http_port: 80
- server_name: web.com
tasks:
- name: copy nginx conf
template: src=./nginx-test.conf.j2 dest=/tmp/nginx-test.conf
[root@cl-server playbooks]# ansible-playbook jinja-demo01.yml
[root@cl-node02 tmp]# cat nginx-test.conf
upstream web.com {
server 192.168.234.10:80;
server 192.168.234.11:80;
}
server {
listen 80;
location / {
proxy_pass http://web.com;
include proxy_params;
}
}
2.3 配合setup变量属性
[root@cl-server playbooks]# cat mysqld-test.conf.j2
[mysqld]
{% if ansible_fqdn == "mysql_master" %}
log_bin=mysql-bin
server-id=1
{% else %}
server-id=2
{% endif %}
2.4 同一文件,不同服务器配置不同
[root@cl-server playbooks]# cat /root/templates/cl-node02/server.conf.j2
root /application/server/;
server_ip {{ ansible_default_ipv4.address }};
server_hostname {{ ansible_nodename }};
node_id 12;
[root@cl-server playbooks]# cat /root/templates/cl-node03/server.conf.j2
root /application/server/;
server_ip {{ ansible_default_ipv4.address }};
server_hostname {{ ansible_nodename }};
node_id 13;
[root@cl-server playbooks]# cat template-demo01.yml
- name: template
hosts: clTemplate
remote_user: root
tasks:
- name: template-demo1
template:
src: /root/templates/{{ ansible_nodename }}/server.conf.j2
dest: /tmp/file.conf
[root@cl-server playbooks]# ansible-playbook template-demo01.yml
[root@cl-server playbooks]# ansible clTemplate -m command -a 'cat /tmp/file.conf'
cl-node03 | CHANGED | rc=0 >>
root /application/server/;
server_ip 192.168.234.13;
server_hostname cl-node03;
node_id 13;
cl-node02 | CHANGED | rc=0 >>
root /application/server/;
server_ip 192.168.234.12;
server_hostname cl-node02;
node_id 12;
2.5 setup变量
[root@cl-server playbooks]# cat template-demo01.yml
---
- name: template
hosts: cl-node03
remote_user: root
tasks:
- name: template-demo1
template:
src: /root/file.conf.j2
dest: /tmp/file.conf
owner: bin
group: wheel
mode: u=rw,g=r,o=r
[root@cl-server playbooks]# cat /root/file.conf.j2
server {
root /tmp;
server_name {{ ansible_nodename }};
server_address {{ ansible_default_ipv4.address }}
server_br0 {{ ansible_br0.timestamping[0] }}
server_dm0_name {{ ansible_device_links.ids['dm-0'].0 }}
server_memory {{ ansible_memtotal_mb }}MB
}
[root@cl-server playbooks]# ansible-playbook template-demo01.yml --diff
PLAY [template] ***********************************************************************************************************************************************************
TASK [Gathering Facts] ****************************************************************************************************************************************************
ok: [cl-node03]
TASK [template-demo1] *****************************************************************************************************************************************************
--- before: /tmp/file.conf
+++ after: /root/.ansible/tmp/ansible-local-4200TIdOCH/tmpv2DW_W/file.conf.j2
@@ -4,5 +4,6 @@
server_address 192.168.234.13
server_br0 rx_software
server_dm0_name dm-name-centos-root
+ server_memory 1819MB
}
changed: [cl-node03]
PLAY RECAP ****************************************************************************************************************************************************************
cl-node03 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Make sure your variable name does not contain invalid characters like '-': unsupported operand type(s) for -: 'AnsibleUndefined' and 'int'"}
[root@cl-node03 tmp]# cat file.conf
server {
root /tmp;
server_name cl-node03;
server_address 192.168.234.13
server_br0 rx_software
server_dm0_name dm-name-centos-root
server_memory 1819MB
}