2016-10-25 57 views
1

我使用Ansible將Puma作爲Web服務器部署Ruby on Rails應用程序。作爲部署的一部分,彪馬配置綁定到服務器的IP地址,端口8080:使用Ansible查找下一個可用端口

bind "tcp://{{ ip_address }}:8080" 

這是然後在nginx的虛擬主機配置用於訪問應用程序:

upstream {{ app_name }} { 
    server {{ ip_address }}:8080; 
} 

所有這是工作正常。但是,我現在想要將應用程序的多個副本(分段,生產)部署到同一臺服務器上,並且顯然在8080上有幾個綁定會導致問題,所以我需要使用不同的端口。

最簡單的解決方案是將端口包含在組var中,然後在部署應用程序時將其放入。但是,這需要有關已在服務器上運行的應用程序的背景知識,並且感覺部署應該能夠「發現」要使用的端口。

相反,我正在考慮通過端口從8080開始進行某種迭代,然後檢查每個端口直到沒有被使用。 netstat -anp | grep 8080給出了一個返回碼0,如果端口正在被使用,所以也許我可以使用該命令來測試(雖然我不知道如何做循環位)。

有沒有人遇到過這個問題?我忽略了更優雅的解決方案嗎?

回答

0

我會定義允許的端口列表並將其與可用端口進行比較。

事情是這樣的:

- hosts: myserver 
    vars: 
    allowed_ports: 
     - 80 
     - 8200 
    tasks: 
    - name: Gather occupied tcp v4 ports 
     shell: netstat -nlt4 | grep -oP '(?<=0.0.0.0:)(\d+)' 
     register: used_ports 

    - name: Set bind_port as first available port 
     set_fact: 
     bind_port: "{{ allowed_ports | difference(used_ports.stdout_lines | map('int') | list) | first | default(0) }}" 
     failed_when: bind_port | int == 0 

    - name: Show bind port 
     debug: var=bind_port 

,如果你需要檢查特定的接口端口,您可能會需要調整0.0.0.0的正則表達式。