我正在尝试查找可供使用的端口。逻辑是这样的,我首先找到已使用的端口并提供我可以使用的端口列表,差异过滤器应过滤掉可用的端口,但不知何故。
这是代码块:
- name: Gather occupied tcp v4 ports
shell: netstat -nlt| awk '{print $4}'|awk -F':' '{print $2}'
register: used_ports
- debug:
var: used_ports
- name: Difference
vars:
allowed_ports:
- 107
- 823
- 4750
set_fact:
bind_port: "{{ allowed_ports | difference(used_ports) | first }}"
- name: Show bind port
debug:
var: bind_port
输出:
好:[] => { “ used_ports”:{ “已更改”:是, “ cmd”:“ netstat -nlt | awk'{print $ 4}'| awk -F':''{print $ 2}'”, “ delta”:“ 0:00:00.077467”, “ end”:“ 2018-08-12 15:25:04.477710”, “失败”:错误, “ rc”:0, “ start”:“ 2018-08-12 15:25:04.400243”, “ stderr”:“”, “ stderr_lines”:[], “ stdout”:“, “ stdout_lines”:[ “”, “”, “ 107”, “ 202”, “ 106” ] }
任务[serverbuild:差异] ****************************************************** *******************好的:[]
任务[serverbuild:显示绑定端口] ****************************************************** ***************好的:[] => { “ bind_port”:“ 107”}
理想情况下,它不应显示107,因为已经使用过。我在这里做什么错了?
答案 0 :(得分:3)
有两个问题:
您应该使用used_ports.stdout_lines
作为difference
过滤器的参数,
您应该定义allowed_ports
以包含字符串,或者将used_ports.stdout_lines
映射为整数。
所以:
- name: Difference
vars:
allowed_ports:
- "107"
- "823"
- "4750"
set_fact:
bind_port: "{{ allowed_ports | difference(used_ports.stdout_lines) | first }}"
或:
- name: Difference
vars:
allowed_ports:
- 107
- 823
- 4750
set_fact:
bind_port: "{{ allowed_ports | difference(used_ports.stdout_lines|map('int')) | first }}"