【问题标题】:How to use Ansible module wait_for together with loop?如何将 Ansible 模块 wait_for 与循环一起使用?
【发布时间】:2019-07-23 10:23:44
【问题描述】:

在 Ansible 2.7.11 中,想要使用模块 waif_forloops 进行与我的 System Center Operations Manager (SCOM) 服务器的连接测试。

目前我正在使用一个任务

- name: "Test connection to SCOM_MGMT_SRV_PROD: {{ SCOM_MGMT_SRV_PROD }}"
  wait_for:
    host: "{{ item }}"
    port: "{{ SCOM_PORT }}"
    state: drained         # Port should be open
    delay: 0               # No wait before first check (sec)
    timeout: 3             # Stop checking after timeout (sec)
    active_connection_states: SYN_RECV
  with_items:
    - server1
    - server2
    - server3
    - server4
  ignore_errors: yes
  tags: connectionTest,testSCOM

其中变量SCOM_PORT 设置为1270SCOM_MGMT_SRV_PROD 设置为服务器列表"server1,server2,server3,server4"

这种方法很有效,但我想在一个中心位置维护一个变量列表,就像库存文件中的全局变量SCOM_MGMT_SRV_PROD

可以通过

遍历这样的列表
- debug:
    msg="{{ item }}"
  loop: "{{ [SCOM_MGMT_SRV_PROD] }}"

但是当在任务中使用这种方法时

- name: "Test connection to SCOM_MGMT_SRV_PROD: {{ SCOM_MGMT_SRV_PROD }}"
  wait_for:
    host: "{{ item }}"
    port: "{{ SCOM_PORT }}"
    state: drained         # Port should be open
    delay: 0               # No wait before first check (sec)
    timeout: 3             # Stop checking after timeout (sec)
    active_connection_states: SYN_RECV
  loop: "{{ [SCOM_MGMT_SRV_PROD] }}"
  ignore_errors: yes
  tags: connectionTest,testSCOM

我遇到了一个错误

failed: [host] (item=server1,server2,server3,server4) => ... /tmp/ansible_wait_for_payload_zNj2ac/__main__.py\", line 380, in _convert_host_to_hex\r\n  File \"/tmp/ansible_wait_for_payload_zNj2ac/__main__.py\", line 354, in _convert_host_to_ip\r\nsocket.gaierror: [Errno -2] Name or service not known\r\n", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 1}

这对我来说表明模块wait_for 将完整列表作为项目而不是列表中的一个服务器。所描述行为的原因似乎得到了回答@Checking wait_for in Ansible in a particular host group does not work

知道如何让模块wait_for 与可变的服务器列表一起工作吗?

其他组件

  • RHEL 7.6
  • python version = 2.7.5 (default, Jun 11 2019, 12:19:05) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]
  • 模块dig 已安装,但未使用,因为它不会与lookup 一起改变行为

【问题讨论】:

    标签: python list loops ansible


    【解决方案1】:

    在与同事协商后发现,清单中的(服务器)列表没有正确定义,只是一个经典的语法错误。请参阅Ansible, how to define a list in host inventory?

    要使其正常工作,有必要在库存文件中将变量定义为

    SCOM_MGMT_SRV_PROD="['server1','server2','server3','server4']"
    

    而不是用逗号分隔的字符串列表并使用 for 循环

    loop: "{{ SCOM_MGMT_SRV_PROD }}"
    

    通过这样做,我意识到实际上调试消息也没有遍历列表。现在它可以正常工作了

    TASK [debug] ************************************************************************************************************************
    ok: [host] => (item=server1) => {
        "msg": "server1"
    }
    ok: [host] => (item=server2) => {
        "msg": "server2"
    }
    ok: [host] => (item=server3) => {
        "msg": "server3"
    }
    ok: [host] => (item=server4) => {
        "msg": "server4"
    }
    
    TASK [Test connection to SCOM_MGMT_SRV_PROD: ['server1','server2','server3','server4']] ***
    ok: [host] => (item=server1)
    ok: [host] => (item=server2)
    ok: [host] => (item=server3)
    ok: [host] => (item=server4)
    

    【讨论】:

      【解决方案2】:

      同时我发现Looping over inventory 是可能的,如果我使用

      with_items: "{{ groups['SCOM_MGMT_SRV_PROD'] }}"
      

      与库存文件中的一个组一起

      [SCOM_MGMT_SRV_PROD]
      server1
      server2
      server3
      server4
      

      由于监控服务器不是由 Ansible、Linux 管理员等维护的基础架构的一部分,因此我不喜欢将它们包含在清单中,而不是包含在变量中。

      是否有任何其他选项可以遍历可变的服务器列表? ...如果没有,可能有必要将此作为解决方案。

      【讨论】:

        猜你喜欢
        • 2013-07-06
        • 1970-01-01
        • 1970-01-01
        • 2022-12-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-09
        • 2023-03-27
        • 2020-08-25
        相关资源
        最近更新 更多