Python 如何使用Ansible模块与loop一起等待?
在Ansible 2.7.11中,希望将该模块与一起使用,以便对我的System Center Operations Manager(SCOM)服务器进行连接测试 目前我正在使用一个任务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
- 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)