【问题标题】:Finding the next available port with Ansible使用 Ansible 查找下一个可用端口
【发布时间】:2016-10-25 21:09:29
【问题描述】:

我正在使用 Ansible 部署一个使用 Puma 作为 Web 服务器的 Ruby on Rails 应用程序。作为部署的一部分,Puma 配置绑定到端口 8080 上的服务器 IP 地址:

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

然后在 nginx vhost 配置中使用它来访问应用程序:

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

所有这些都运行良好。但是,我现在想将应用程序的多个副本(暂存、生产)部署到同一台服务器上,显然在 8080 上有多个绑定会导致问题,因此我需要使用不同的端口。

最简单的解决方案是将端口包含在组 var 中,然后在部署应用程序时将其放入。然而,这需要已经在服务器上运行的应用程序的背景知识,并且感觉部署应该能够“发现”要使用的端口。

相反,我正在考虑通过端口进行某种迭代,从 8080 开始,然后检查每个端口,直到没有一个端口被使用。 netstat -anp | grep 8080 如果端口正在使用,则返回代码 0,所以也许我可以使用该命令进行测试(尽管我不确定如何执行循环位)。

以前有人遇到过这个问题吗?有没有我忽略的更优雅的解决方案?

【问题讨论】:

    标签: ruby-on-rails ansible puma


    【解决方案1】:

    我会定义允许端口列表并将其与可用端口进行比较。

    类似这样的:

    - 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。

    【讨论】:

      猜你喜欢
      • 2010-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-01
      • 2017-01-29
      • 2016-03-15
      • 1970-01-01
      相关资源
      最近更新 更多