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 }