Logo
Section 1 / 8

测试主机可用性

学习如何使用 Ansible 测试目标主机的可用性。

导入

测试主机可用性

学习如何使用 Ansible 测试目标主机的可用性。

测试目标主机是否可用是执行任何针对目标主机的自动化操作的基础。如果主机不可用,我们就无法继续推进自动化流程。

Ansible ping 模块

Ansible `ansible.builtin.ping` 模块用于测试目标主机的可用性。它是 Ansible `builtin` 模块集合的一部分,这意味着它随 Ansible 一起预安装,无需额外配置。 `ping` 模块检查目标主机是否可访问,并且是否存在可用于执行 Ansible 任务的 Python 解释器。如果 `ping` 成功,表明主机可达,Ansible 可以与其通信。

需要注意的是,Ansible 上的 ping 与典型的网络 ping 不同,后者用于测试网络连通性。

...

参数和返回值

可以不指定任何参数就执行 Ansible ping 模块。默认行为将被使用,并尝试向目标主机发送 ping 请求。

虽然管理返回值不是强制性的,但检查输出并确保主机在继续其他任务前可访问是一个良好的实践。

data 参数

当 ping 模块成功执行时,它会返回一个包含 "ping": "pong" 字符串的响应。如果需要,也可以通过 data 参数修改返回值。

data 参数支持以下选项:

  • pong:这是默认行为。
  • crash:这会生成一个异常。

pong 选项

pong 选项是 data 参数的默认值。当 ping 模块测试连接时,若连接成功,会返回字符串 "pong"。

以下清单展示了如何使用 Ansible ping 模块并获取默认输出。

1--- 2- name: ping module demo 3 hosts: all 4 tasks: 5 - name: test connection 6 ansible.builtin.ping:

我们可以使用每个 Ansible 安装中都包含的 ansible-playbook 命令来执行 Ansible 清单:

1ansible-playbook -i inventory ping.yml

Ansible 清单的执行产生如下输出:

ping.yml 清单的输出

1PLAY [ping module demo] ************************************************************************ 2 3TASK [Gathering Facts] ************************************************************************* 4ok: [localhost] 5 6TASK [test connection] ************************************************************************* 7ok: [localhost] 8 9PLAY RECAP ************************************************************************************* 10localhost: ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

如我们所见,输出显示连接成功,状态为 ok: [localhost]。 通过向 ansible-playbook 命令添加 -v 详细执行参数,我们可以观察到 Ansible ping 模块的默认输出消息 "ping": "pong"。

1ansible-playbook -v -i inventory ping.yml

以下是上述命令的输出:

ping.yml 清单的详细执行

1PLAY [ping module demo] ********************************************************************* 2 3TASK [Gathering Facts] ********************************************************************** 4ok: [localhost] 5 6TASK [test connection] ********************************************************************** 7ok: [localhost] => {"changed": false, "ping": "pong"} 8 9PLAY RECAP ********************************************************************************** 10localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

如我们所见,详细执行的输出在屏幕上显示了 "ping": "pong" 消息。

自定义输出消息

通过使用 data 参数,我们可以自定义 ping 模块的默认输出,以匹配我们的偏好。例如,如果我们希望在输出消息 "ping": "pong" 中显示 "up and running" 而非默认的 "pong",只需将 data 参数的值更改为 "up and running" 即可实现。

完整的 Ansible 清单 ping2.yml 如下所示:

1--- 2- name: ping module demo 3 hosts: all 4 tasks: 5 - name: test connection 6 ansible.builtin.ping: 7 data: "up and running"

我们可以通过使用 ansible-playbook 命令的 -v 详细执行参数来执行 Ansible 清单,从而看到 "ping": "up and running" 消息:

1ansible-playbook -v -i inventory ping2.yml

以下是上述清单的输出:

ping2.yml 清单的详细执行

1PLAY [ping module demo] ********************************************************************* 2 3TASK [Gathering Facts] ********************************************************************** 4ok: [localhost] 5 6TASK [test connection] ********************************************************************** 7ok: [localhost] => {"changed": false, "ping": "up and running"} 8 9PLAY RECAP ********************************************************************************** 10localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

详细执行的输出在屏幕上显示了 "ping": "up and running" 消息。

crash 选项

通过在 data 参数中使用 crash 选项,ping 模块始终会触发异常。此行为对于模拟主机问题并验证剧本执行是否停止非常有用。

在以下清单中,我们使用 data 参数并设置其值为 crash。 完整的 Ansible 清单 ping3.yml 如下所示:

1--- 2- name: ping module demo 3 hosts: all 4 tasks: 5 - name: test connection 6 ansible.builtin.ping: 7 data: crash

我们可以使用每个 Ansible 安装中都包含的 ansible-playbook 命令来执行 Ansible 清单:

1ansible-playbook -i inventory ping3.yml

ansible-playbook 命令产生如下输出:

ping3.yml 清单的输出

1PLAY [ping module demo] ********************************************************************* 2 3TASK [Gathering Facts] ********************************************************************** 4ok: [localhost] 5 6TASK [test connection] ********************************************************************** 7An exception occurred during task execution. To see the full traceback, use -vvv. The error was: Exception: boom 8fatal: [localhost]: FAILED! => {"changed": false, "module_stderr": "Traceback (most recent call last):\n File \"/root/.ansible/tmp/ansible-tmp-1675972209.0283306-517-3057200066775/AnsiballZ_ping.py\", line 107, in <module>\n _ansiballz_main()\n File \"/root/.ansible/tmp/ansible-tmp-1675972209.0283306-517-3057200066775/AnsiballZ_ping.py\", line 99, in _ansiballz_main\n invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)\n File \"/root/.ansible/tmp/ansible-tmp-1675972209.0283306-517-3057200066775/AnsiballZ_ping.py\", line 47, in invoke_module\n runpy.run_module(mod_name='ansible.modules.ping', init_globals=dict(_module_fqn='ansible.modules.ping', _modlib_path=modlib_path),\n File \"/usr/lib/python3.8/runpy.py\", line 207, in run_module\n return _run_module_code(code, init_globals, run_name, mod_spec)\n File \"/usr/lib/python3.8/runpy.py\", line 97, in _run_module_code\n _run_code(code, mod_globals, init_globals,\n File \"/usr/lib/python3.8/runpy.py\", line 87, in _run_code\n exec(code, run_globals)\n File \"/tmp/ansible_ansible.builtin.ping_payload_hqari_b8/ansible_ansible.builtin.ping_payload.zip/ansible/modules/ping.py\", line 89, in <module>\n File \"/tmp/ansible_ansible.builtin.ping_payload_hqari_b8/ansible_ansible.builtin.ping_payload.zip/ansible/modules/ping.py\", line 79, in main\nException: boom\n", "module_stdout": "", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 1} 9 10PLAY RECAP ********************************************************************************** 11localhost : ok=1 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0

正如预期,data 参数的 crash 值引发了运行时异常,我们从 failed 状态和消息 An exception occurred during task execution 中可以看出这一点。

实验环境

让我们使用下面的实验环境来尝试本课介绍的命令。

  • 执行 ping.yml Ansible 清单。

    1ansible-playbook -i inventory ping.yml
  • 执行 ping2.yml Ansible 清单。

    1ansible-playbook -i inventory ping2.yml
  • 执行 ping3.yml Ansible 清单。

    1ansible-playbook -i inventory ping3.yml
  • 执行 ping.yml Ansible 清单。

    1ansible-playbook -i inventory ping.yml
  • 执行 ping2.yml Ansible 清单。

    1ansible-playbook -i inventory ping2.yml
  • 执行 ping3.yml Ansible 清单。

    1ansible-playbook -i inventory ping3.yml

No configuration found for ID: 793267e1221e8f66a852d54d5271ca90d2f96b4c48186a676cd0526e0ab617a9

Ansible 语言

在 Ansible 中打印文本或变量