Ansible任务重试异常:stdout含目标字符串仍重复执行
问题原因分析
你遇到的问题核心在于**result.stdout是列表类型**,而你的终止条件判断逻辑有误:
你写的until: "'Total records returned: 0' in result.stdout"是在检查这个字符串是否是列表中的直接元素,但从debug输出能看到,列表里的元素是一个包含目标字符串的长文本("Sys::Connections\nTotal records returned: 0"),并非目标字符串本身,所以这个判断会一直返回False,导致任务不断重试。
解决方案
这里提供几种可行的修正方式,根据你的场景选择:
方法1:直接访问列表第一个元素(推荐,单命令场景)
因为你只执行了一条命令,stdout列表里只会有一个元素,直接取第一个元素做包含判断即可:
- name: Disable pool member bigip_command: commands: "tmsh show /sys connection ss-server-addr xx.xx.xx.xx ss-server-port 8080" provider: user: "xx" password: "xxx" server_port: xx server: xxx delegate_to: localhost register: result until: "'Total records returned: 0' in result.stdout[0]"
方法2:遍历列表检查所有元素(多命令场景)
如果后续会执行多条命令,用any()过滤器遍历列表,检查是否有任意一个元素包含目标字符串:
until: result.stdout | any(item is search('Total records returned: 0') for item in result.stdout)
或者更简洁的写法,把列表拼接成字符串后再检查:
until: "'Total records returned: 0' in result.stdout | join('\n')"
方法3:使用stdout_lines(可选)
bigip_command还会返回stdout_lines,这是把每个命令输出按行拆分后的列表,你也可以直接检查目标行是否存在:
until: "'Total records returned: 0' in result.stdout_lines[0]"
内容的提问来源于stack exchange,提问作者user3511320
相关产品推荐
相关产品推荐

