如何在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
相关产品推荐
相关产品推荐

