1. 程式人生 > 其它 >Ansible基礎 - 06template模組與Jinja2

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
}