課前回顧
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
}
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 }}