You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Ansible中筛选含db2的主机并执行netcat检测?

Ansible 筛选主机并执行Netcat命令实现方案

场景与配置文件

我正在使用Ansible,现有一个包含大量配置的inventory文件:

cat inventory.yml
...
vars:
  host:
    abcserver1:
      url: abcserver1.server.com
      port: 1
    abcserver2:
      url: abcserver2.server.com
      port: 2
    abcserver3:
      url: abcserver3.server.com
      port: 3
    abcdb21:
      url: abcdb21.server.com
      port: 21
    abcdb22:
      url: abcdb22.server.com
      port: 22
    abcdb23:
      url: abcdb23.server.com
      port: 23
    abcdb21b:
      url: abcdb21b.server.com
      port: 21
    abcdb22b:
      url: abcdb22b.server.com
      port: 22
    abcdb23b:
      url: abcdb23b.server.com
      port: 23

需求

需要创建一个任务,筛选出URL中包含"db2"的主机,然后对这6台主机分别使用其URL和端口执行netcat命令,即执行以下命令:

netcat -zv abcdb21.server.com 21
netcat -zv abcdb22.server.com 22
netcat -zv abcdb23.server.com 23
netcat -zv abcdb21b.server.com 21
netcat -zv abcdb22b.server.com 22
netcat -zv abcdb23b.server.com 23

尝试过程及错误

我尝试了以下任务:

- name: List
  debug:
    msg: "{{ item.value.url}}"
  loop: "{{ host }}"

但出现错误:

Invalid data passed to 'loop', it requires a list, got this instead:...

最终实现方案

通过以下方式成功实现需求:

- name: Netcats
  shell: nc -zv {{ item.value.url }} {{ item.value.port }}
  loop: "{{ host | dict2items }}"
  when: "'abcdb2' in item.key"

说明

  • host是字典类型,而Ansible的loop需要接收列表数据,因此使用dict2items过滤器将字典转换为包含key和value的列表项;
  • 通过when条件筛选出item.key中包含abcdb2的主机条目;
  • 最后执行shell模块调用nc(netcat的别名)命令,传入对应主机的URL和端口。

内容的提问来源于stack exchange,提问作者fr0zt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 05:47:48