使用Ansible查找下一个可用端口

时间:2016-10-25 21:09:30

标签: ruby-on-rails ansible puma

我使用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,所以也许我可以使用该命令进行测试(尽管我不知道如何进行循环位)。

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

1 个答案:

答案 0 :(得分: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

如果需要检查特定接口上的端口,可能需要在regexp中调整0.0.0.0