jinjia模板


課前回顧

sqliet3也是一種數據庫

ansible變量
	系統變量
	自定義變量
playbook,yml語法
jinjia2模板,'帶有變量的',使用Python格式調用,需要使用playbook中template'模塊'拷貝到別的服務器的 模板文件

mysql占用的物理磁盤大小一般是內存的75%~80%,不要和zabbix裝在同一服務器上,避免內存不夠

/etc/motd 文件,每次窗口打開都會加載
centos6系統,centos7系統,兩個系統安裝的httpd默認版本是不一樣的

jinjia模板不能隨便用,因為jinjia模板會用jinjia的語法去解析,如果該文件中有jinjia不識別的語法的話(; - ),要對該文件修改一下
#顯示不完整主機名
[root@m01 ~]# hostname
m01

[root@m01 ~]# ansible m01 -m setup -a 'filter=ansible_hostname'
m01 | SUCCESS => {
    "ansible_facts": {
        "ansible_hostname": "m01", 
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false
}
#顯示完整主機名
[root@m01 ~]# ansible m01 -m setup -a 'filter=ansible_fqdn'
m01 | SUCCESS => {
    "ansible_facts": {
        "ansible_fqdn": "m01",
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false
}

sqlite詳解

SQLite嵌入

ansible_jinjia2

jinjia2模板的使用

jinjia2文檔

不能登錄

Ansible Jinja2模板使用

Jinja模板基本語法

{{ EXPR }}輸出變量值,會輸出自定義的變量值或facts
1)playbook文件使用template模塊'調用'
2)'模板文件'里面的'變量',自定義變量或者facts

在一個文件中使用Python格式調用了變量,呢么就可以說這個文件是jinjia模板

Ansible如何使用Jinja2

使用Ansible的jinja2模板也就是使用template模塊,該模塊和copy模塊一樣,都是講文件復制到遠端主機上去,但是區別在於,template模塊可以獲取到文件中的變量,而copy則是原封不動的把文件內容復制過去。之前我們在推送rsync的backup腳本時,想把腳本中的變量名改成主機名,如果使用copy模塊則推送過去的就是{{ ansible_fqdn }},不變,如果使用template,則會變成對應的主機名。

ansible變量可以在playbook中使用,也可以在別的文件中使用,但是jinjia2只能在文件中使用


Jinja2模板邏輯判斷

#循環表達式

{% for i in EXPR %}
...
{% endfor %}

i: 變量名
EXPR:數據 1,3,4  		#不連續數字的循環直接寫入,可以使用變量
range(10)  			# 0~9
range(1,10)	         # 1~9

{% for sj in 10,11 %}		
echo num{{$sj}}=>>> {{$sj}}
{% endfor %}
---------------------------------------------------------
#條件判斷
{% if EXPR %}
...
{% elif EXPR %}
...
{% else %}
...
{% ednif %}
-------------------------------------------------------------
#注釋
{# COMMENT #}
#Python循環(連續)
[root@m01 ~]# vim lb.conf.j2
upstream {{ ansible_fqdn}} {
{% for n in range(21) %}
        server 172.16.1.{{n}}:{{80}};
{% endfor %}
}

#Python循環(不連續),小括號可以去掉,#不能只寫一個數字,必須是一個數組
[root@m01 ~]# vim lb.conf.j2
upstream {{ ansible_fqdn}} {
{% for n in (20,21) %}		
        server 172.16.1.{{n}}:{{80}};
{% endfor %}
}

#bash里面的語法,不能在ansible也就是說不能在Python中直接調用,Python代碼中,有自己的循環或者判斷的方式
[root@m01 ~]# vim lb.conf.j2
#!/bin/bash
for n in 20;do
        server 172.16.1.$n:80;
done


Ansible Jinja2管理motd

Jinja2示例

1.編輯playbook

#motd文件,窗口每次開啟都會運行該文件
[root@m01 ~]# vim jinja2.yml
- hosts: web_group
  tasks:
    - name: Copy Template File
      template:
        src: ./motd.j2		#yml所在目錄
        dest: /etc/motd

2.准備motd.j2文件

[root@m01 ~]# vim motd.j2
Welcome to {{ ansible_fqdn }}
This system total mem is : {{ ansible_memtotal_mb }} MB
This system free mem is: {{ ansible_memfree_mb }} MB

3.執行playbook

[root@m01 ~]# ansible-playbook jinja2.yml

#查看結果
[root@m01 ~]# ansible web_group -a 'cat /etc/motd'
web01 | CHANGED | rc=0 >>
Welcome to web01
This system total mem is : 1982 MB
This system free mem is: 1106 MB

web02 | CHANGED | rc=0 >>
Welcome to web02
This system total mem is : 1982 MB
This system free mem is: 1096 MB

該示例展示了如何利用jinjia2模板使用facts變量,達到我們想要的目的,實現自動化的需求。

可以理解為,獲取自定義變量信息--獲取相應主機的變量信息--寫入jinjia模板--拷貝

Ansible Jinja2管理nginx(負載均衡)

Ansible使用jinja2的for循環表達式渲染出nginx負載均衡的配置文件


使用playbook推送文件

1.編輯playbook

[root@m01 ~]# vim lb.yml
- hosts: lb_group
  vars:
    http_port: 80
    server_name: www.drz.com
  tasks:
    - name: copy
      template:
        src: /root/lb.conf.jinjia2
        dest: /root
      notify: reload nginx
  handlers:
    - name: reload nginx
      systemd:
        name: nginx
        state: reloaded

2.准備配置文件

[root@m01 ~]# vim lb.conf.jinjia2
upstream {{ ansible_fqdn }} {
{% for n in range(21) %}
        server 172.16.1.{{ n }}:{{ up_port }};
{% endfor %}
}

server {
        listen 80;
        server_name wp.com;

        location / {
                root /code;
                index index.html;
                proxy_pass http://{{ ansible_fqdn }};
                proxy_set_header Host $http_host;
        }
}

Ansible Jinja2管理keepalived

ansible使用jinja2模板的if判斷表達式渲染出keepalived高可用配置文件,並推送到lb主機上。


推送keepalived配置文件

[root@m01 ~]# vim keepalived.yml
- hosts: lb_group
  tasks:
    - name: copy file
      template:
        src: ./keepalived.j2
        dest: /etc/keepalived/keepalived.conf
      notify: restart keepalived

  handlers:
    - name: restart keepalived
      systemd:
        name: keepalived
        state: restarted

keepalived原配

#keepalived master 配置文件
global_defs {
    router_id lb01
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 50
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {         
        10.0.0.3
    }
}


#keepalived backup配置文件
global_defs {
    router_id lb02
}

vrrp_instance VI_1 {
    state BACKUP        
    interface eth0
    virtual_router_id 50
    priority 100
    advert_int 1
    authentication {    
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.3
    }
}

准備keepalived配置文件

[root@m01 ~]# vim keepalived.j2
global_defs {
    router_id {{ ansible_fqdn }}
}

vrrp_instance VI_1 {
{% if ansible_fqdn == "lb01" %}
    state MASTER
    priority 150
{% else %}
    state BACKUP
    priority 100
{% endif %}

    interface eth0
    virtual_router_id 50
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {         
        10.0.0.3
    }
}

使用jinjia2管理mysql配置文件

[root@m01 ~]# vim /etc/my.cnf
[mysqld]
basedir=/usr
datadir=/var/lib/mysql/
socket=/var/lib/mysql/mysql.sock
log_error=/var/log/mariadb/mariadb.log

{% if ansible_memtotal_mb == %}
innodb_buffer_pool_size={{ ansible_memtotal_mb * 4/5 }}		


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM