2016-10-25 13 views
1

私はWebサーバーとしてPumaを使ってRuby on Railsアプリケーションを配備することができます。可能な次のポートを見つける

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

すべて:これはその後、アプリにアクセスするためにnginxのバーチャルホストの設定に使用されている

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

:展開の一環として、プーマの設定は、ポート8080上のサーバーのIPアドレスにバインドこれはうまくいきます。しかし、私は今、アプリケーション(ステージング、プロダクション)の複数のコピーを同じサーバーに展開したいのですが、明らかに8080上のいくつかのバインディングが問題を引き起こしているので、別のポートを使用する必要があります。

最も簡単な解決策は、ポートをグループvarに含めることです。次に、アプリケーションのデプロイ時にドロップします。しかし、これはすでにサーバー上で動作しているアプリの背景知識を必要とし、使用するポートを「発見」できるように感じるような気がします。

代わりに、私は8080で始まり、1つが使用されなくなるまでそれぞれのポートを調べて何らかの種類の反復を行うことを検討していました。 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したいことがあります。

関連する問題