Ansible:不注册跳过的迭代

Ansible:不注册跳过的迭代,ansible,Ansible,是否可以在条件满足时进行嵌套?我面临的问题是如何从寄存器中获取返回码。该问题适用于跳过的任务。没有返回代码。是否有方法不在register outputResults.results中包含跳过的任务。不知何故,我需要获取返回代码来处理下一个任务。下面是我的代码片段 -命令:“执行一些可能成功或失败的命令” 循环:“{{listOfWarFiles}}” 时间:item.needToDeploy | bool==true 忽略错误:是 寄存器:输出结果 所有结果都将被注册。不可能在循环中选择性地注

是否可以在条件满足时进行嵌套?我面临的问题是如何从寄存器中获取返回码。该问题适用于跳过的任务。没有返回代码。是否有方法不在register outputResults.results中包含跳过的任务。不知何故,我需要获取返回代码来处理下一个任务。下面是我的代码片段

-命令:“执行一些可能成功或失败的命令”
循环:“{{listOfWarFiles}}”
时间:item.needToDeploy | bool==true
忽略错误:是
寄存器:输出结果

所有结果都将被注册。不可能在循环中选择性地注册结果。关于如何解决这个问题,还有更多的选择

  • 失败的任务是可能的
  • -调试:
    变量:项目
    循环:“{{outputResults.results”|
    rejectattr('rc','eq',1)|
    列表}”
    
  • 成功完成任务是可能的
  • -调试:
    变量:项目
    循环:“{{outputResults.results”|
    选择属性('rc','eq',0)|
    列表}”
    
  • 如果结果中缺少属性rc,则前面的选项将失败。最好的选择是使用将自动删除缺少的rc属性
  • -调试:
    变量:项目
    循环:“{{outputResults.results”|
    json_查询('[?rc=='0`]')}”
    

    例1

    在下面的剧本中,该命令随机返回true或fail。第一次调试显示所有结果。第二次调试仅显示成功的项目

    -hosts:localhost
    变量:
    列表文件:
    -{file:file1.war,needToDeploy:true}
    -{file:file2.war,needToDeploy:true}
    -{file:file3.war,needToDeploy:true}
    任务:
    -名称:“执行一些可能成功或失败的命令”
    命令:bash-c'((随机%10>5))'
    循环:“{{listOfWarFiles}}”
    时间:item.needToDeploy | bool
    忽略错误:是
    寄存器:输出结果
    -调试:
    msg:“项目:{{item.item.file}}rc:{{{item.rc}”
    循环:{{outputResults.results}}”
    -调试:
    msg:“项目:{{item.item.file}}rc:{{{item.rc}”
    循环:“{{outputResults.results”|
    rejectattr('rc','eq',1)|
    列表}”
    
    给出(节略)

    任务[调试]****
    msg:'item:file1.war rc:1'
    msg:'item:file2.war rc:1'
    msg:'item:file3.war rc:0'
    任务[调试]****
    msg:'item:file3.war rc:0'
    

    例2

    循环中将跳过禁用的项目
    needToDeploy:false
    。在这种情况下,结果中将缺少属性rc。为避免错误,
    'dict object'没有属性rc
    ,请设置
    default('skipped')
    值并使用json\u查询。比如说

    -hosts:localhost
    变量:
    列表文件:
    -{file:file1.war,needToDeploy:true}
    -{文件:file2.war,需要部署:false}
    -{file:file3.war,needToDeploy:true}
    任务:
    -名称:“执行一些可能成功或失败的命令”
    命令:bash-c'((随机%10>5))'
    循环:“{{listOfWarFiles}}”
    时间:item.needToDeploy | bool
    忽略错误:是
    寄存器:输出结果
    -调试:
    msg:“item:{{item.item.file}}rc:{{{item.rc}默认('skipped')}”
    循环:{{outputResults.results}}”
    -调试:
    msg:“项目:{{item.item.file}}rc:{{{item.rc}”
    循环:{{outputResults.results}json_查询('[?rc=='0`]')}
    
    给出(节略)

    任务[调试]****
    msg:'item:file1.war rc:0'
    msg:'item:file2.war rc:skipped'
    msg:'item:file3.war rc:1'
    任务[调试]****
    msg:'item:file1.war rc:0'
    
    嗨,我的问题被跳过。例如,如果跳过,则通常不会有返回代码。返回代码非常重要,因为如果0,我将执行一些任务,如果1将执行另一个任务。但是,跳过了无返回代码,并且应该与跳过的返回代码一样。我得到了下面的编码出来,但不是usre是正确的方式。我所做的是在下一个任务中添加=>when:item.changed | default(false)| bool==true和item.rc!=0因此它将首先检查是否已更改。通常我观察到的跳过将是错误的,其余的将是正确的,无论是得到命中错误还是没有命中错误。我能知道这是正确的方法吗?我还需要显示失败的项目。只有跳过的项不应显示在注册表中只有跳过该项时,结果中才会缺少属性rc。如果项目被禁用,则将跳过该项目。我添加了示例2。如何处理缺少的rc属性。谢谢你的回答。我能知道你是否喜欢这个=>when:item.changed | default(false)| bool==true和item.rc!=0,是否会有任何影响?此条件没有任何意义,如果跳过该项,将失败。1) 如果跳过项,则不带的命令将始终设置为“已更改:true”2)“bool==true”是冗余的3)“item.rc”将失败4)任务的状态“已更改”和“失败”是互斥的。