看過一句話「爲何這麼多的人寧願幹體力活,也不肯意學習去掙錢呢?」 由於「學習是主動吃苦,而生活的苦是自動找到懶人的」 -yuchaohtml
rpm -qi nginx 查看軟件安裝信息前端
兩年python開發
擅長在linux環境OOP開發,熟悉centos7經常使用命令
熟悉nginx環境配置,如nginx調優(nginx.conf根據服務器參數更改),負載均衡以及代理配置
負責python web項目部署,架構vue+nginx+uwsgi+supervisor+virtualenv
熟悉mysql基本CURD語句,索引優化,主從複製原理
熟悉redis,mongoDB等NOSQL數據庫,掌握redis持久化機制,主從複製以及哨兵搭建原理,瞭解redis-cluster
瞭解docker容器化管理,掌握容器,倉庫,鏡像管理命令,私有docker倉庫搭建
瞭解消息隊列rabbitmq
瞭解運維自動化工具saltstack,ansible配置vue
瞭解 熟悉 熟練 擅長 精通python
-->查看 --> 撰寫欄 -->所有窗口mysql
1.經過阿里雲的yum源,在epel源中有這個rabbitmq
yum install rabbitmq-server erlang -y
2.啓動rabbitmq-server
systemctl start rabbitmq-serverlinux
3.開啓後臺管理界面
rabbitmq-plugins enable rabbitmq_managementnginx
4.建立rabbitmq的帳號密碼web
rabbitmqctl add_user liuyang 123456redis
5.設置用戶爲管理員
sudo rabbitmqctl set_user_tags liuyang administratorsql
6.設置用戶有權限訪問全部隊列
rabbitmqctl set_permissions [-p <vhostpath>] <user> <conf> <write> <read>
rabbitmqctl set_permissions -p "/" liuyang "." "." ".*"
7.重啓rabbitmq服務端,讓用戶生效
systemctl restart rabbitmq-server
8.訪問web管理界面,登陸,查看隊列信息
netstat -tunlp(查看進程id)(訪問進不去,應該是電腦卡了)
http://192.168.230.132:15672/#/queues
9.用python操做rabbitmq,實現生產消費者模型
1.安裝pika模塊,模塊版本須要指定,由於代碼參數發生了變化(不知道模塊版本的時候寫個錯的,而後從提示中找)
pip3 install -i https://pypi.douban.com/simple pika==0.13.1
1.生產者的代碼 #!/usr/bin/env python3 import pika # 建立憑證,使用rabbitmq用戶密碼登陸 # 去郵局取郵件,必須得驗證身份 credentials = pika.PlainCredentials("liuyang","123456") # 新建鏈接,這裏localhost能夠更換爲服務器ip # 找到這個郵局,等於鏈接上服務器 connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.230.132',credentials=credentials)) # 建立頻道 # 建造一個大郵箱,隸屬於這家郵局的郵箱,就是個鏈接 channel = connection.channel() # 聲明一個隊列,用於接收消息,隊列名字叫「水許傳」 channel.queue_declare(queue='水許傳') # 注意在rabbitmq中,消息想要發送給隊列,必須通過交換(exchange),初學可使用空字符串交換(exchange=''),它允>許咱們精確的指定發送給哪一個隊列(routing_key=''),參數body值發送的數據 channel.basic_publish(exchange='', routing_key='水許傳', body='武大郎出攤賣燒餅了') print("已經發送了消息") # 程序退出前,確保刷新網絡緩衝以及消息發送給rabbitmq,須要關閉本次鏈接 connection.close()
2.消費者的代碼 import pika # 創建與rabbitmq的鏈接 credentials = pika.PlainCredentials("liuyang","123456") connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.230.132',credentials=credentials)) channel = connection.channel() channel.queue_declare(queue="水許傳") def callbak(ch,method,properties,body): print("消費者接收到了數據:%r"%body.decode("utf8")) # 有消息來臨,當即執行callbak,沒有消息則夯住,等待消息 # 老百姓開始去郵箱取郵件啦,隊列名字是水許傳 channel.basic_consume(callbak,queue="水許傳",no_ack=True) # 開始消費,接收消息 channel.start_consuming()
防止異常狀況下數據丟失的異常機制
no-ack 若爲true,不走,服務器出錯,數據庫丟失,
no-ack 爲false , 走,服務器出錯,數據不丟
官網資料:http://www.rabbitmq.com/tutorials/tutorial-two-python.html
默認狀況下,生產者發送數據給隊列,消費者取出消息後,數據將被清除。 特殊狀況,若是消費者處理過程當中,出現錯誤,數據處理沒有完成,那麼這段數據將從隊列丟失
爲了處理:數據處理過程當中有問題,而後不返回出錯
不確認機制
也就是說每次消費者接收到數據後,不論是否處理完畢,rabbitmq-server都會把這個消息標記完成,從隊列中刪除
3.消息確認機制的生產者代碼 #!/usr/bin/env python3 import pika # 建立憑證,使用rabbitmq用戶密碼登陸 # 去郵局取郵件,必須得驗證身份 credentials = pika.PlainCredentials("selfju","cxk") # 新建鏈接,這裏localhost能夠更換爲服務器ip # 找到這個郵局,等於鏈接上服務器 connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.16.142',credentials=credentials)) # 建立頻道 # 建造一個大郵箱,隸屬於這家郵局的郵箱,就是個鏈接 channel = connection.channel() # 新建一個hello隊列,用於接收消息 # 這個郵箱能夠收發各個班級的郵件,經過 channel.queue_declare(queue='西遊記') # 注意在rabbitmq中,消息想要發送給隊列,必須通過交換(exchange),初學可使用空字符串交換(exchange=''),它容許咱們精確的指定發送給哪一個隊列(routing_key=''),參數body值發送的數據 channel.basic_publish(exchange='', routing_key='西遊記', body='大師兄,師傅被蔡許坤抓走了') print("已經發送了消息") # 程序退出前,確保刷新網絡緩衝以及消息發送給rabbitmq,須要關閉本次鏈接 connection.close() 4.消息確認機制的消費者代碼 import pika credentials = pika.PlainCredentials("selfju","cxk") connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.16.142',credentials=credentials)) channel = connection.channel() # 聲明一個隊列(建立一個隊列) channel.queue_declare(queue='西遊記') def callback(ch, method, properties, body): print("消費者接受到了任務: %r" % body.decode("utf-8")) # int('asdfasdf') # 我告訴rabbitmq服務端,我已經取走了消息 # 回覆方式在這 ch.basic_ack(delivery_tag=method.delivery_tag) # 關閉no_ack,表明給與服務端ack回覆,確認給與回覆 channel.basic_consume(callback,queue='西遊記',no_ack=False) channel.start_consuming()
消息的可靠性是RabbitMQ的一大特點,那麼RabbitMQ是如何保證消息可靠性的呢——消息持久化。 爲了保證RabbitMQ在退出或者crash等異常狀況下數據沒有丟失,須要將queue,exchange和Message都持久化。
5.支持持久化的隊列和消息 1.生產者的代碼 import pika # 有密碼 credentials = pika.PlainCredentials("liuyang","123456") connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.230.132',credentials=credentials)) channel = connection.channel() # 聲明一個隊列(建立一個隊列) # 默認此隊列不支持持久化,若是服務掛掉,數據丟失 # durable=True 開啓持久化,必須新開啓一個隊列,本來的隊列已經不支持持久化了 ''' 實現rabbitmq持久化條件 delivery_mode=2 使用durable=True聲明queue是持久化 ''' # 持久化參數durable channel.queue_declare(queue='LOL',durable=True) channel.basic_publish(exchange='', routing_key='LOL', # 消息隊列名稱 body='我用雙手成就你的夢想', # 支持數據持久化 properties=pika.BasicProperties( delivery_mode=2,#表明消息是持久的 2 ) ) connection.close() 6.持久化的消費者代碼 import pika credentials = pika.PlainCredentials("liuyang","123456") def callback(ch, method, properties, body): print("消費者接受到了任務: %r" % body.decode("utf-8")) connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.230.132',credentials=credentials)) channel = connection.channel()
channel.queue_declare(queue='LOL',durable=True)
'''
必須確保給與服務端消息回覆,表明我已經消費了數據,不然數據一直持久化,不會消失
'''
def callback(ch, method, properties, body):
print("消費者接受到了任務: %r" % body.decode("utf-8"))
# 模擬代碼報錯
# int('asdfasdf') # 此處報錯,沒有給予回覆,保證客戶端掛掉,數據不丟失
# 告訴服務端,我已經取走了數據,不然數據一直存在 ch.basic_ack(delivery_tag=method.delivery_tag)
channel.basic_consume(callback,queue='LOL',no_ack=False)
channel.start_consuming()
python作運維自動化是第一語言
這個是快速的遠程執行系統
爲何? 大量的重複性工做,遠程執行命令,大規模部署,本地進行管理,跨數據中心(c/s)
1.環境準備
準備3臺機器,配置好ip地址,互相能夠通訊,便可
一個master
一個minion
一個minion
2.配置hosts解析文件,強制進行主機名解析,加速salt的minion查找,分別在三臺機器上,寫入解析
1 vim /etc/sysconfig/network HOSTNAME=liuyang3(主機名) 2 vim /etc/hosts 192.168.230.130 liuyang3
vim /etc/hosts (hostname 查看主機名)
ping bogon 是主機名
192.168.230.132 liu
192.168.230.132 localhost.localdomain
192.168.16.47 bogon
3.配置阿里雲的源,下載saltstack軟件包, 注意區分 服務端和客戶端
1.在master上安裝 yum install salt-master -y 2.在minion1上安裝 yum install salt-minion -y 3.在minion2上安裝 yum install salt-minion -y
4.學習salt-master的配置文件 和 salt-minion的配置文件
salt-master的配置文件內容以下
vim master #打開配置文件,填入以下內容
interface: 0.0.0.0 #綁定到本地的0.0.0.0地址 publish_port: 4505 #管理端口,命令發送 user: root #運行salt進程的用戶 worker_threads: 5 #salt運行線程數,線程越多處理速度越快,不要超過cpu個數 ret_port: 4506 #執行結果返回端口 pidfile: /var/run/salt-master.pid #pid文件位置 log_file: /var/log/salt/master #日誌文件地址 #自動接收minion的key auto_accept: False
salt-minion的配置文件信息以下
vim /etc/salt/minion
master: s20 #指定mastet的通訊地址
master_port: 4506
user: root
id: s20minion1 #id用於指定minion的身份信息 ,待會能夠在master上查看到的
acceptance_wait_time: 10
log_file: /var/log/salt/minion
salt-minion2的配置
vim /etc/salt/minion
5.都重啓了master和minion以後,查看密鑰接受狀況,salt通訊是在minion初次啓動時候,創建新的鏈接的
systemctl start salt-master
systemctl start salt-minion
6.在master機器上,查看minion的密鑰信息
salt-key -L #查看全部密鑰
salt-key -a s20minion1 #-a參數 單獨接受一個密鑰信息
salt-key -A #-A 接受全部的key信息
7.此時就能夠在master上 管理 minion的機器了
salt "*" test.ping #驗證salt minion信息是否存活
8.將輸出的結果,轉化爲json信息,能夠序列化後,丟給前端渲染
salt "*" test.ping --out=json
9.salt的命令學習
salt 核心命令
salt 目標匹配 你要執行的salt模塊
salt "s20minion1" test.ping
salt "*" test.fib 50
salt --summary '*' cmd.run 'hostname'
salt "*" cmd.run "touch /tmp/愛的魔力準quanquan"
salt "" cmd.run "rm -rf /tmp/"
salt "*" cmd.run "yum install nginx -y"
salt '*' pkg.remove "nginx"
salt '' service.start "nginx"
salt '' service.stop "nginx"
salt '*' service.restart "nginx"
salt "" pkg.install 'nginx'
salt "" service.start 'nginx'
salt "" pkg.install "redis" --out=json
salt "" service.start 'redis' --out=json
salt "*" service.status 'redis' --out=json
yaml
first_key:
second_key:
python
{
"s20":{"男同窗":["麗華","小黑","老徐"],"女同窗":["大寶","b哥","超哥"],"不詳":["self菊"]}
}
http://www.bejson.com/validators/yaml_editor/
python的數據結構,轉爲yaml
{ s20:
{ '男同窗': [ '麗華', '小黑', '老徐' ],
'女同窗': [ '大寶', 'b哥', '超弟' ],
'不詳': [ 'self菊', '蔡旭困' ] } }
yaml以下
"s20":
"男同窗":
"麗華"
"小黑"
"老徐"
同窗":
"大寶"
"b哥"
"超弟"
"不詳":
"self菊"
"蔡旭困"
salt '*' grains.items #列出服務器全部的靜態數據
salt '*' grains.items --out=json #輸出結果爲json格式,能夠序列化丟給其餘程序使用
salt 's20minion1' grains.item osrelease
1.獲取pycharm的linux包
wget https://download.jetbrains.8686c.com/python/pycharm-community-2018.2.4.tar.gz
2.解壓縮源碼包