我使用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,所以也许我可以使用该命令进行测试(尽管我不知道如何进行循环位)。
以前有人遇到过这个问题吗?我有一个更优雅的解决方案吗?
答案 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
。