Ansible:检查服务是否正在侦听特定端口

Jon*_*lls 9 linux ansible

您将如何使用Ansible确认某个服务是否在特定端口上运行?

例如:

  • Apache是​​否在端口80上运行?
  • MySQL是否在端口3912上侦听?
  • Tomcat是否在端口8080上侦听?

我知道有一些servicewait_for命令,它们分别检查服务是否正在运行以及端口是否正在使用 - 但是到目前为止我还没有找到任何东西来检查特定服务是否正在侦听特定端口.service并且wait_for将指示有一个服务和一个端口,但不能保证该端口被该特定服务占用 - 它可以被任何东西占用.wait_for据我所知,只是检查它是否被使用.

有一个regex_search参数wait_for提到在套接字连接中搜索特定字符串,但据我所知,这只是读取该套接字下的任何信息,而不是对发送该信息的内容有任何访问权限.

我们怎么能这样呢?

lar*_*sks 5

有几种方法可以解释您的问题,因此我将尝试回答它们:

验证网络服务

如果您的目标是验证特定端口是否正在为特定应用程序协议提供服务,我将通过运行适当的客户端来检查这一点.

  • 为了检查Apache和Tomcat,我会GET找一个特定的url并检查结果代码.例如:

    - name: check if apache is running
      command: curl -sf http://webserver/check_url
    
    Run Code Online (Sandbox Code Playgroud)

    同样对于Tomcat.

  • 为了检查MySQL,我会使用MySQL客户端:

    - name: check if mysql is running
      command: mysql -h dbhost -P dbport -e 'select 1'
    
    Run Code Online (Sandbox Code Playgroud)

验证哪个进程拥有套接字

如果你真的想看看过程拿着一个特定的端口开放,我想你可以结合ssgrep,但似乎奇怪的和不必要的.就像是:

    - name: check if httpd has port 80 open
      shell: ss -tp state listening sport = :80 | grep httpd
Run Code Online (Sandbox Code Playgroud)

如果要检查特定的进程ID,可以使用类似的方法lsof:

    - name: check that pid {{apache_pid}} is listening on port 80
      shell: lsof -p 1036 -P | grep 'TCP \*:80'
Run Code Online (Sandbox Code Playgroud)

但同样,我不一定认为这些选项特别有用.前面部分中的服务检查似乎更合适.