尚未配置端口时,只有 运行 Ansible seport。最好不要通过 shell 或使用 semanage 的命令模块

Only run Ansible seport when ports are not yet configured. Preferably not through shell or command module using semanage

我有一个角色设置,可以在 LAMP/Rhel 8 上使用 Ansible 2.9 安装 iTOP 应用程序

我正在尝试找到一种方法,使 seport 模块仅在 运行 所需的端口尚未配置时才可用。 (使其幂等)
我可能可以将 commandshell 模块用于 运行 semanage 并注册一个我将在 when 条件下使用的事实。

我想知道是否有适当的 Ansible 方法来执行此操作,而无需通过 commandshell 模块使用 semanage

我查看了下面的 link,但这不是我要找的。

我在 Google 上找不到任何示例或替代方案。
如果有人有任何提示或提示,我将不胜感激。

不幸的是,在 ansible 中没有“正确”的方法来做到这一点。如果你要检查 seport 模块的代码(截至今天),你可以在这里看到:

https://github.com/ansible-collections/community.general/blob/2f980e89fea8290cb57883d40e13c54a2e410259/plugins/modules/system/seport.py#L296

    if state == 'present':
        result['changed'] = semanage_port_add(module, ports, proto, setype, do_reload)
    elif state == 'absent':
        result['changed'] = semanage_port_del(module, ports, proto, setype, do_reload)
    else:
        module.fail_json(msg='Invalid value of argument "state": {0}'.format(state))

所以这个模块肯定不是幂等的,因为它每次都会return changed。您可以尝试创建一个问题,有人可能会修复它

好像semanage cli 也不是幂等的,semanage port --add 会抛出ValueError: Port PROTO/PORT already defined,而且会耗费很多时间。您有多种选择:

  1. 用 shell 重新实现部分 seport 模块,但定义更改的标准:
    - name: semanage add port
      shell: LANG=C semanage port --add -t zookeeper_election_port_t -p tcp 38888
      register: result
      failed_when: result.rc != 0 and "already defined" not in result.stderr
      changed_when:
        - result.rc == 0
  1. 解析semanage port -l | tr -s ' ' | grep 'port_type'的输出并匹配你的条件,然后调用seport模块

起初我想指出第一个变体由于 semanage 的实现有点慢,但由于连接开销,在你的情况下可能可以忽略不计