Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用Ansible模块与loop一起等待?_Python_List_Loops_Ansible - Fatal编程技术网

Python 如何使用Ansible模块与loop一起等待?

Python 如何使用Ansible模块与loop一起等待?,python,list,loops,ansible,Python,List,Loops,Ansible,在Ansible 2.7.11中,希望将该模块与一起使用,以便对我的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

在Ansible 2.7.11中,希望将该模块与一起使用,以便对我的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\u PORT
设置为
1270
,而
SCOM\u MGMT\u SRV\u PROD
设置为服务器列表
“server1、server2、server3、server4”

这种方法是可行的,但我希望在一个中心位置维护一个服务器的可变列表,比如清单文件中的全局变量
SCOM\u MGMT\u SRV\u 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
将完整列表作为项目,而不是列表中的一个服务器。上述行为的原因似乎得到了回答

知道如何让模块
wait_for
使用可变的服务器列表吗

其他组件

  • RHEL 7.6
  • python版本=2.7.5(默认值,2019年6月11日,12:19:05)[GCC 4.8.5 20150623(Red Hat 4.8.5-36)]
  • 模块已安装,但未使用,因为它不会与一起更改行为

与此同时,我发现如果我使用

with_items: "{{ groups['SCOM_MGMT_SRV_PROD'] }}"
与库存文件中的组一起

[SCOM_MGMT_SRV_PROD]
server1
server2
server3
server4
由于监控服务器不是由Ansible、Linux管理员等维护的基础设施的一部分,因此除了在变量中之外,我不希望将它们包含在清单中


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

咨询同事后,发现清单中(服务器)的列表没有正确定义,只是一个典型的语法错误。请看

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

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)