如何将Ansible模块wait_for与循环一起使用?

时间:2019-07-23 10:23:44

标签: python list loops ansible

在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一起改变行为

2 个答案:

答案 0 :(得分:0)

与此同时,我发现可以Looping over inventory,如果我使用

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

与清单文件中的组

[SCOM_MGMT_SRV_PROD]
server1
server2
server3
server4

由于监视服务器不是Ansible,Linux管理员等维护的基础结构的一部分,因此我不希望将它们包括在变量中,而不是将其包括在清单中。

是否还有其他选择可以遍历服务器的可变列表? ...否则,可能有必要将其作为解决方案。

答案 1 :(得分:0)

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

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

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

而不是用逗号分隔的字符串列表,而是用于循环

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)