差异过滤器在Ansible中不起作用

时间:2018-08-12 19:31:51

标签: ansible

我正在尝试查找可供使用的端口。逻辑是这样的,我首先找到已使用的端口并提供我可以使用的端口列表,差异过滤器应过滤掉可用的端口,但不知何故。

这是代码块:

- 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,因为已经使用过。我在这里做什么错了?

1 个答案:

答案 0 :(得分:3)

有两个问题:

  1. 您应该使用used_ports.stdout_lines作为difference过滤器的参数,

  2. 您应该定义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 }}"