馬里奧

編程沒有什麼不好


  • 首頁

  • 標籤

  • 分類

  • 歸檔

Docker 邊做邊學 (4) Dockerfile+Dockcompose

發表於 2018-06-08 | 分類於 Docker |

以tomcat+Jenkins為例,透過Dockerfile到jenkins官方下載war包同時構建鏡像,最後用Dockcompose創建容器。

  1. 新建檔案 Dockerfile 並貼上以下內容:
1
2
3
FROM tomcat:latest
RUN wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war
RUN cp jenkins.war /usr/local/tomcat/webapps/jenkins.war
  1. 新建檔案 docker-compose.yml 並貼上以下內容:
1
2
3
4
5
6
7
version: '2'
services:
tomcat:
build: .
ports:
- 8085:8080/tcp
- 50005:50000/tcp
  1. 啟動
  • docker-compose
1
docker-compose up -d --build

  • docker ps
1
2
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                              NAMES
3d4d47d03920 jenkins_tomcat "catalina.sh run" 3 minutes ago Up 3 minutes 0.0.0.0:8085->8080/tcp, 0.0.0.0:50005->50000/tcp jenkins_tomcat_1
  • docker images
1
2
3
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
jenkins_tomcat latest 49636ae7145a 10 minutes ago 614MB
tomcat latest 9f1191b287da 2 weeks ago 465MB
  1. 訪問Jenkins

jenkins學習(5) 創建pipeline項目

發表於 2018-06-08 | 分類於 Jenkins |
  1. 創建流水線任務

  1. 定義流水線

流水線與自由構建項目不同,需使用支持的腳本語法,才能構建項目。

  1. 流水線語法?

點開流水線語法連結,這會幫助你生成流水線腳本

  • Git

以git示例,只要將對應資訊輸入,在點擊生成流水線腳本就可以了

1
git 'http://192.168.1.112/2215/ptt_1.git'

1
2
3
4
5
6
7
8
node('Host73') {

git 'http://192.168.1.112/2215/ptt_1.git'

bat '''C:\\Users\\Lenovo\\Anaconda3\\envs\\test_venv35\\Scripts\\pip.exe install -r requirements.txt'''
bat '''C:\\Users\\Lenovo\\Anaconda3\\envs\\test_venv35\\python.exe main.py'''

}

瀏覽器自動化(5) Selenium + Scrapy

發表於 2018-06-08 | 分類於 Selenium |

安裝模塊

1
2
selenium
scrapy
  1. selenium
    主要先用於登入或js互動,剩餘的在使用scrapy進行爬取。

  2. scrapy

Scrapy 是一个爬蟲框架,同時支持異步、多線程、速度非常快、高效,適合爬取海量數據及一層一層的爬取,

官方文檔

如何使用

  • 命令行調試
1
2
3
4
5
6
7
8
9
10
scrapy shell https://doc.scrapy.org/en/latest/_static/selectors-sample1.html
# 會進入交互模式
>>> response.url # 查看當前url
'https://doc.scrapy.org/en/latest/_static/selectors-sample1.html'
>>> response.status # 查看response狀態
200
>>> response.selector.xpath('//title/text()') # 選擇xpath
[<Selector (text) xpath=//title/text()>]
>>> sel.xpath(".//a//@href").extract() # 獲取所有a標籤的url
['image1.html', 'image2.html', 'image3.html', 'image4.html', 'image5.html']
  • python 調試
1
2
3
4
5
6
7
8
9
10
11
12
from selenium import webdriver
from scrapy.selector import Selector

browser = webdriver.Chrome()

browser.get("https://w3.iiiedu.org.tw/")

sel = Selector(text=browser.page_source)

titles = sel.xpath(".//*[@id='centerBodyBox_seminar']//a//text()").extract()

print([t for t in titles])

輸出:

1
2
3
4
5
6
7
8
9
10
11
12
13
['<免費研討會> FB行銷@在地生活圈研討會',
'AR/VR創新應用與視覺優化講座',
'【免費】數位轉型系列講座:數位轉型趨勢和行動方案解析',
'【免費】數位轉型系列講座:數位轉型勢在必行',
'【免費】數位轉型系列講座:AIoT切入智慧醫療與照護的下一波革命',
'【免費】數位轉型系列講座: AI電腦視覺讓你看得更清楚',
'【免費】數位轉型系列講座:AI塑造新零售、新體驗',
'【免費】數位轉型系列講座:AI金融科技的新突破 ',
'【免費】數位轉型系列講座:AI迎向精準行銷的數位革命',
'【免費】數位轉型系列講座:深度學習與各類影像應用',
'【免費】數位轉型系列講座: 數位轉型怎麼做?從企業戰略到人力資本之導入步驟及方法',
'【免費】數位轉型系列講座:AI啟動無人機的未來商業',
'【免費】數位轉型系列講座: AIoT產業智慧轉型的發展模式']

啟動

  • 新建專案項目

建立專案

1
scrapy startproject tutorial

查看目錄

在終端輸入命令

1
tree tutorial

新建一個myspider.py

1
2
3
4
5
6
7
8
9
10
11
12
13
tutorial/
├── tutorial
│   ├── __init__.py
│   ├── items.py
│   ├── middlewares.py
│   ├── pipelines.py
│   ├── __pycache__
│   ├── settings.py
│   └── spiders
│   ├── __init__.py
│ ├── myspider.py # 新建
│   └── __pycache__
└── scrapy.cfg

myspider.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import scrapy
from selenium import webdriver
from scrapy.selector import Selector
import datetime

class mySpider(scrapy.Spider):
name = "mySpider"

start_urls = ["https://doc.scrapy.org/en/latest/_static/selectors-sample1.html"]

def __init__(self):
# 定義webdriver
self.browser = webdriver.Chrome()


def parse(self, response):
# 先由self.browser進行請求
self.browser.get(response.url)

# 用scrapy選擇器獲取selenium的頁面源代碼
sel = Selector(text=self.browser.page_source)

baseurl = sel.xpath('//base/@href').extract_first()
# 'http://example.com/'

links = sel.xpath(".//a//@href").extract()
# ['image1.html', 'image2.html', 'image3.html', 'image4.html', 'image5.html']

for i in links:
request = scrapy.Request(baseurl + i,
callback=self.parse_2,
)

def parse_2(self, response):
'''進入下一個頁面'''
print(response.url)

執行

scrapy crawl
name為mySpider.py裡頭定義的name,並非腳本或項目名。

1
scrapy crawl mySpider

小結

scrapy除了使用上比較繁瑣一點,基本上使用上沒什麼缺點。

Zabbix學習筆記(5) 郵件告警

發表於 2018-06-08 | 分類於 Zabbix |

設置完觸發器已經可以在前端消息中報警,但這並不方便,若沒有登入Zabbix或人不在位置上,就無法實時得到告警信息。

使用郵件告警來加強提醒效果,通常設置郵件告警有兩種方式,一種是Zabbix內建的郵件模板,另一種是自己寫python或sh腳本來實現。下面介紹的是第二種方法:利用python發信告警。

1. Python腳本

Zabbix可結合腳本告警,而用Python發信非常方便,只要是Linux系統通常都有內置Python,其中CentOS的yum工具就是用Python2所寫,如果要安裝Python3要留意避免版本衝突問題。

低安全性

要使用Gmail的話,需先至低安全性應用程式網頁中開放存取權限,否則會無法發送成功。

腳本路經

默認路徑:/usr/local/share/zabbix/alertscripts

也可以透過設定檔查看更改成其他路徑:/usr/local/etc/zabbix_server.conf

創建Python腳本

Python標準庫已內建SMTP模塊,不需安裝其他依賴,直接寫好腳本就可以發信。

創建一個Python腳本並命名為zabbix-alert-smtp.py。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#!/bin/python
# -*- coding: utf-8 -*-

"""
Zabbix SMTP Alert script for gmail.
"""

import sys
import smtplib
from email.MIMEText import MIMEText
from email.Header import Header
from email.Utils import formatdate

# Mail Account
MAIL_ACCOUNT = 'your_account@gmail.com'
MAIL_PASSWORD = 'xxxx'

# Sender Name
SENDER_NAME = u'Zabbix Server Alert'

# Mail Server
SMTP_SERVER = 'smtp.gmail.com'
SMTP_PORT = 587

def send_mail(recipient, subject, body, encoding='utf-8'):

msg = MIMEText(body, 'plain', encoding)
msg['Subject'] = Header(subject, encoding)
msg['From'] = Header(SENDER_NAME, encoding)
msg['To'] = recipient
msg['Date'] = formatdate()

session = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
session.ehlo()
session.starttls()
session.ehlo()
session.login(MAIL_ACCOUNT, MAIL_PASSWORD)
session.sendmail(MAIL_ACCOUNT, recipient, msg.as_string())

# close session
session.quit()

if __name__ == '__main__':
send_mail(recipient=sys.argv[1],subject=sys.argv[2],body=sys.argv[3])
  • 小說明

    輸入自己Gmail的帳密

    1
    2
    MAIL_ACCOUNT = 'your_account@gmail.com'
    MAIL_PASSWORD = 'xxxx'
命令列參數

1
2
3
4
5
send_mail(recipient=sys.argv[1],subject=sys.argv[2],body=sys.argv[3])
sys.argv開頭的皆為命令列參數,後面會在補充與Zabbix的對應位置,方便理解為何此處要用命令列參數。
recipient 收件人
subject 主旨
body 內文

測試腳本

寄一封信給自己,主旨為”測試”,內文為”給自己”

1
python zabbix-alert-smtp.py ceshizhanghu1001@gmail.com 測試 給自己

寄送成功

2. 設定報警媒介

報警媒介可以依類型”電子郵件”、”短信”、”腳本”等,待觸發器發報時一併報警。

创建媒体类型

選單:”管理” -> “報警媒介類型” -> “创建媒体类型”

腳本信息

名稱:Gmail
類型:“腳本”
腳本名稱:zabbix-alert-smtp.py
(
路經:/usr/local/share/zabbix/alertscripts,
權限:777
)
腳本參數:
{ALERT.SENDTO} 收件人地址
{ALERT.SUBJECT} 主題
{ALERT.MESSAGE} 詳細內容

以上輸入的三個腳本參數,也就對應著py腳本的命令列參數,權限需留意否則無法發送成功。

添加完成

3. 設定用戶報警媒介”收件人”

選擇用戶

選單:”管理” -> “用戶” -> “Admin”

添加報警媒介

選單:”報警媒介” -> “添加”

報警媒介信息

類型:Gmail
收件人:ceshizhanghu1001@gmail.com(測試)

收件人地址,實際上是與腳本參數“{ALERT.SENDTO}”對應的。

添加完成

確認信息後按更新完成添加。

4. 設定動作

選單:”配置” -> “動作” -> “創建動作”

動作信息

名稱:Nginx1
條件:触发器 = PingHost: Nginx1

操作信息

默認接收人:(不變)
默認信息:(不變)
操作細節:添加”用戶”及”報警媒介”

默認接收人及默認信息,實際上就是對應腳本參數“{ALERT.SUBJECT}”及“{ALERT.MESSAGE}”。若不希望接收訊息時都是全英文,那麼可以將非{}的文字改成中文,這樣並不會影響功能。

恢復操作信息

這部分與操作分頁設定相同,記得要添加操作細節(用戶及報警媒介)。

動作添加完成

5. 發信告警

由步驟”腳本”到”動作”設置完畢後,只要每當異常、恢復都會發信通知一次。

動作日誌

選單:”報表” -> “動作日誌”

Zabbix3.0以後新增的動作日誌功能非常好用,動作內容及是否成功通通都會顯示在這裡。

異常時通知

恢復時通知

小結

一開始接觸會認為步驟繁瑣了點,其實配置上都是圍繞著腳本參數所關聯的,明白其中相關關係,做出更多報警如:Telegram、Line、微信等都是沒有問題的。

瀏覽器自動化(4) Selenium + Beautiful Soup

發表於 2018-06-08 | 分類於 Selenium |

安裝模塊

1
2
3
selenium
requests
beautifulsoup4
  1. selenium
    主要用於登入或js互動,剩餘的在使用bs4進行爬取。
  1. requests
    能模擬http請求,如:get、post、put、delete,通常是爬取分頁或a標籤時用到。

官方文檔

如何使用

模擬請求

1
r = requests.get('https://api.github.com/events')

查看請求狀態

1
2
3
r.status_code
輸出:
>>> 200

取得請求html內容

1
2
3
r.text
輸出:
>>> '<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="zh-TW"><head><meta content="text/html; charset=UTF-8" http-equiv="Content-Type"><meta content="/images/branding/googleg/1x/googleg_standard_color_128dp.png" ...</html>'
  1. Beautiful Soup
    Beautiful Soup能解析html,能快速尋找標籤內容,也可以透過CSS選擇器快速尋找帶有標籤屬性的內容。

官方文檔

如何使用

1
2
3
4
5
from bs4 import BeautifulSoup
import requests
web_data = requests.get('https://api.github.com/events')
soup = BeautifulSoup(web_data, 'lxml') #解析Html
soup.title

啟動

基本使用

selenium_bs4_demo1.py

1
2
3
4
5
6
7
8
from bs4 import BeautifulSoup

from selenium import webdriver

browser = webdriver.Firefox()
browser.get('https://w3.iiiedu.org.tw/')
wb_html = browser.page_source
soup = BeautifulSoup(wb_html,"lxml")

小結

大部分網頁都用requests都能獲取,用到selenium情況比較少,有登入或js需求可以參考,在此紀錄心得。

Zabbix學習筆記(4) 創建圖形

發表於 2018-06-08 | 分類於 Zabbix |

單個監控項的圖形都是獨立的,若要同時比較多主機、多監控項,就需要創建自定圖形。

監控項

創建圖形之前必須建立好監控項。

1. 創建圖形

先選擇主機在創建圖形。

2. 設置圖形

加入監控項

將希望同時比較的監控項都加入到圖形中。

調整顯示功能

功能選擇所有,這樣查看圖形時除了最新之外的”最小”、”平均”、”最大”都會顯示。

3. 設置完成

查看圖形

jenkins學習(4) 拉取Gitlab項目

發表於 2018-06-08 | 分類於 Jenkins |

Gitlab

  1. 在Gitlab上創建一個項目

ptt_1項目地址:
http://192.168.1.112/2215/ptt_1.git

Jenkins

  1. 設置節點Git

手動指定節點的Git位置,默認會以Master的位置啟動Git,若不設定會報錯。

  1. 創建項目任務
  • 源码管理

Repository URL:http://192.168.1.112/2215/ptt_1.git

  • Execute Windows batch command
1
2
C:\Users\Lenovo\Anaconda3\envs\test_venv35\Scripts\pip.exe install -r requirements.txt
C:\Users\Lenovo\Anaconda3\envs\test_venv35\python.exe main.py
  • 構建結果

構建之前會先clone項目

安裝依賴

執行python腳本

Docker 邊做邊學 (3) 使用Dockerfile構建鏡像

發表於 2018-06-08 | 分類於 Docker |

Docker提供Dockerfile方法自動構建鏡像,只有將命令寫在Dockerfile檔案中,使用build方法就能一步一步自動構建鏡像,非常高效。

  1. 準備或建立html檔案

新增 index.html

1
<h1>hello</h1>
  1. 創建檔案 Dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# VERSION 1
# Author: Noyoung Guo

FROM centos

MAINTAINER noyoung noyoungit@gmail.com

RUN rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
RUN yum install -y nginx

ADD index.html /usr/share/nginx/html/index.html

RUN echo "daemon off;" >> /etc/nginx/nginx.conf

EXPOSE 80
cmd ["nginx"]

Docker file 撰寫方式:

1
2
3
4
5
6
7
8
9
From 來源
Maintainer 選擇性,記錄作者與聯絡方式
Run 建立IMAGE的過程,執行的指令
WorkDIR 切換工作的路徑
ADD 新增本機端的檔案或目錄到IMAGE內
ENV 設定環境變數
EXPOSE 端口
VOLUME 數據卷
CMD 命令
  1. build Dockerfile

最後的.就是當前目錄(Dockerfile檔案位置)。

1
docker build -t noyoung/mynginx:v3 .

Options:

1
-t 選擇以'name:tag'格式的鏡像

  1. 創建基於noyoung/mynginx:v3的容器
1
docker run -d -p 83:80 noyoung/mynginx:v3
  1. 訪問服務頁面

Zabbix學習筆記(3) 創建觸發器

發表於 2018-06-08 | 分類於 Zabbix |

觸發器可針對監控項設置警報等級及發報時機。

監控項

創建觸發器之前必須建立好監控項。

1. 創建觸發器

先選擇主機在創建觸發器。

進入觸發器頁面

2. 如何設置觸發器

創建需求

先列出創建需求,舉例:目前我希望根據監測Nginx1的實時情況,若timeout或超時200毫秒就發報。

如何填寫表達式

初次使用可以點擊表達式空白輸入匡下方的“表達式構造器”,幫助構造。

  • 表達式之一 timeout

    創建第一個表達式,若timeout時就發報。

  1. 點擊編輯

  2. 進入條件頁面進行設置

    監控項:PingHost: Nginx1
    功能:最新的T值 = N
    值:0

    即PingHost主機下的Nginx1監控項當監測等於0(無服務)時,將立即發報。

  3. 確認添加

    確認無誤,點擊添加。

  • 表達式之二 超時200毫秒
  1. 點擊編輯

  2. 進入條件頁面進行設置

    監控項:PingHost: Nginx1
    功能:最新的T值 > N
    值:200

    即PingHost主機下的Nginx1監控項當監測超時200毫秒時,將立即發報。

  3. 確認添加

    確認無誤,點擊’或’。

填寫內容

對應填寫內容如下,填寫完畢後要在頁面最下方點擊添加。

填寫完畢

觸發器建立完成。

3. 設置前端提醒

進入用戶基本資料

選擇正在發送消息

將恢復及災難或全部打勾後更新。

4. 設置完成

觸發器及前端提醒皆已設置完成,當符合觸發器問題時,只要有登入Zabbix,警報都會彈出泡泡及聲音提醒。

警報發生

警報恢復

jenkins學習(3) 創建項目任務

發表於 2018-06-08 | 分類於 Jenkins |

用Jenkins創建一個簡單的項目,打印系統狀態systeminfo

  1. 創建一個新任務
  1. 輸入任務名稱

類型選擇构建一个自由风格的软件项目

  1. 設置任務
  • 限制项目的运行节点

說明:指定想控制的節點名稱

這邊使用Windows系統的Host73

  • 構建步驟

在構建選項中,點擊增加構建步驟裡面的Execute Windows batch command,這是專門控制windows系統的方法,相等於在寫批次檔(bat)。

  • Execute Windows batch command 內容
1
systeminfo

  • 立即構建

  • 構建結果

在控制台輸出可以看到每次構建的結果,畫紅色底線的地方,就是在節點設置中的工作目錄,預設會在這個目錄構建項目。

12345

Maliao Guo

41 文章
8 分類
18 標籤
GitHub
© 2018 Maliao Guo
由 Hexo 強力驅動
|
主題 — NexT.Pisces v5.1.4