簡體   English   中英

如何在另一個AWS VPC子網中使用ansible進行滾動升級?

[英]How to make a rolling upgrade with ansible in a different AWS VPC subnet?

我們正在AWS VPC的公共子網中運行連續集成服務器(jenkins),並且當對master進行提交時,我們想觸發升級作為后期構建任務...

最簡單的方法是讓ansible ssh-in機器,拉出最新的master並重新啟動服務,然后繼續進行下一個。 但是由於CI主機在其他子網中運行,因此我們無法訪問服務器。

我們的自動擴展配置用戶數據腳本在啟動時自動獲取存儲庫的HEAD ,因此我們要做的就是終止ELB中所有現有實例,所有這些都由自動擴展來調出新實例。

問題是我不知道如何在劇本中指定它應該等到新實例啟動並運行后再終止下一個實例。

另一個可行的選擇是立即啟動所有新實例,並在它們脫離ELB並運行時終止它們,並終止所有舊實例(但我也找不到有關如何執行此操作的示例!)。

另一個選擇是使用新的ELB和所有新實例創建新的自動縮放組。 當它們啟動時,您可以針對新的ELB運行測試,確認一切正常,然后進行DNS轉換。 這種方法的陷阱是圍繞ELB預熱。 如果您的站點繁忙,則新的ELB將不會處理流量,除非您要求亞馬遜為您“預熱”流量。

如果要檢查服務器是否已啟動或關閉,則可以從Jenkins服務器執行此操作,盡管它需要能夠訪問VPC內的實例。

---
name: Deployment playbook
hosts: all

tasks:
  # Using port 2222 here but you can use port 80 or 443
  - name: Wait for new deployment instance to come up.
    local_action: wait_for host=your_new_deployment_host port=2222

  - name: Shutdown or terminate old servers
    local_action: command ec2-terminate-instances <your-old-server-instance-id>

為了解決該問題VPC你也許可以設置從你的服務器的SSH隧道,在啟動時您的詹金斯服務器(公網IP)是這樣的:

ssh -f -N -R2222:localhost:22  jenkins@yourjenkinsserver.com -S /tmp/control-socket

以及是否要在詹金斯(Jenkins)端口8888上檢查http

ssh -f -N -R8888:localhost:80  jenkins@yourjenkinsserver.com -S /tmp/control-socket-http

這里的竅門是您需要按順序啟動新服務器,因為您始終使用Jenkins服務器上的相同端口8888進行檢查。 完成檢查后,您還需要終止隧道。 從您的Jenkins服務器:

name: Terminate tunnel HTTP
local_action: shell ssh -p 2222 localhost 'ssh -S /tmp/control-socket-http -O exit yourjenkinsserver.com'

name: Terminate tunnel SSH
local_action: shell ssh -p 2222 localhost 'ssh -S /tmp/control-socket -O exit yourjenkinsserver.com'

很多動人的東西,但應該可以解決。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM