如何让ansible等待端口准备好?

Max*_*lan 6 ansible

我打算等待端口准备好,所以使用“wait_for”

- name: Wait for service to be ready
  wait_for:
    host: 192.168.1.70
    port: 8080
Run Code Online (Sandbox Code Playgroud)

然而,它只等待 300 秒,然后失败。

TASK [Wait for service to be ready] 
fatal: [localhost]: FAILED! => {"changed": false, "elapsed": 300, "msg": "Timeout when waiting for 192.168.1.70:8080"}
Run Code Online (Sandbox Code Playgroud)

所以,我添加了一个“直到”:

- name: Wait for service to be ready
  wait_for:
    host: 192.168.1.70
    port: 8080
  register: port8080
  until: port8080.failed == "false"
Run Code Online (Sandbox Code Playgroud)

相反,我收到一个错误:

TASK [Wait for ssh to be ready] 
fatal: [localhost]: FAILED! => {"msg": "The conditional check 'port8080.failed == \"false\"' failed. The error was: error while evaluating conditional (port8080.failed == \"false\"): 'dict object' has no attribute 'failed'"}
Run Code Online (Sandbox Code Playgroud)

但是如果我删除“until”并添加调试语句,我可以看到port8080.failed按预期设置为 true 或 false。

TASK [debug] ****************************************************************************************************************************
ok: [localhost] => {
  "port8080": {
     "changed": false, 
     "elapsed": 0, 
     "failed": false, 
Run Code Online (Sandbox Code Playgroud)

第一个问题:这是一个ansible错误还是我做错了什么?
第二个问题:如何让我的脚本等待连接(超过 300 秒)?

(注意,我实际上正在等待数据库启动,300 秒对于数据库启动来说太短了。但是我不想等待 300 秒,以防我重新运行脚本和数据库已经开始。)

nba*_*ari 6

尝试wait_for_connection例如,当您重新启动系统并希望等到可访问/可用时,这将起作用:

- name: Something that may reboot
  shell: echo "true"
  register: should_reboot

- name: Rebooting ...
  shell: sleep 2 && /sbin/shutdown -r now "Reboot required"
  async: 1
  poll: 0
  ignore_errors: true
  register: rebooting
  when: should_reboot.stdout == "true"

- name: Wait for rebooted servers to come back
  wait_for_connection:
    connect_timeout: 20
    sleep: 5
    delay: 5
    timeout: 60
  when: rebooting|changed
Run Code Online (Sandbox Code Playgroud)

为了检查/测试远程主机是否已启动,这可能有效:

- name: Wait for service to be ready
  wait_for:
    port: 8080
    host: 127.0.0.1
    connect_timeout: 3
    delay: 3
    timeout: 30
Run Code Online (Sandbox Code Playgroud)

为了进行测试,我使用netcat创建了本地端口 8080 ,例如:

nc -l 8080
Run Code Online (Sandbox Code Playgroud)

如果端口未打开,您将得到类似以下信息:

fatal: [localhost]: FAILED! => {"changed": false, "elapsed": 30, "msg": "Timeout when waiting for localhost:8080"}
Run Code Online (Sandbox Code Playgroud)

当端口打开时,您运行 playybook 会注意到连接的一个它也会退出,如果您想保持它永久,请使用类似以下内容:

nc -kl 8080
Run Code Online (Sandbox Code Playgroud)