Ansible寄存器结果result.stdout result.rc etc dict变量未找到,如何使用直到循环

Ansible寄存器结果result.stdout result.rc etc dict变量未找到,如何使用直到循环,ansible,stdout,ansible-playbook,ansible-2.x,Ansible,Stdout,Ansible Playbook,Ansible 2.x,ansible/ansible剧本版本:2.1.2.0/2.2.0.0 我尝试使用yum/apt安装软件包,但由于安装软件包的存储库位于packagecloud.io中,有时会收到错误消息(当我在运行ansible playbook时传递-vvv) 这种情况并非总是发生。如果我再次运行同一个剧本,它可以正常工作,所以失败(连接重置)是随机发生的 为了解决这个问题,我想使用Ansible的直到循环,我们必须使用寄存器变量 因此,我通过引用Ansible doc来创建这个剧本动作,了解如何使用直到循

ansible/ansible剧本版本:2.1.2.0/2.2.0.0

我尝试使用yum/apt安装软件包,但由于安装软件包的存储库位于packagecloud.io中,有时会收到错误消息(当我在运行ansible playbook时传递
-vvv

这种情况并非总是发生。如果我再次运行同一个剧本,它可以正常工作,所以失败(连接重置)是随机发生的

为了解决这个问题,我想使用Ansible的
直到
循环,我们必须使用
寄存器
变量

因此,我通过引用Ansible doc来创建这个剧本动作,了解如何使用
直到
循环,但是使用这种语法,我得到了一个“dictionary”错误,表示结果变量(已注册)dict没有任何名为stdout的键。然后我尝试使用result.rc(key field),它在CentOS机器上运行,但在Ubuntu 14.x trusty vagrant机器上失败,结果如下。rc dict not present错误:

- name: Install telegraf agent/collector (RedHat)
  yum:
    name: "{{ agent_collector }}"
    state: "installed"
  when: ( ansible_os_family == 'RedHat' and company_install_collector == true )
  register: result
  until: result.stdout.find("Installed:") != -1
  #The following works in CentOS/RedHat
  #until: result.rc == 0  

 - debug: msg="result (redhat) = {{ result }}"
或者(更新我的问题,很明显)

获取以下错误消息(result.stdout--dict对象在RedHat/CentOS和Ubuntu中都没有属性“stdout”,但获取dict对象仅在Ubuntu服务器中没有属性“rc”):


为什么寄存器变量(result在我的例子中)没有
stdout
rc
dict/variables,而文档中说存在这些变量,或者如果我可以在一个操作系统上的
-vvv
详细输出中看到它们,但在另一个操作系统上却没有显示它们?

  • 在CentOS中,如果操作成功并且设置了注册变量result,则用户可以看到这些dict变量,例如:result.rc为0,result.stdout=“somethingesle\netc etc”和/或result.stdout_line=“…同上…”和result.results在某些情况下。如果操作失败,则无法查看结果。在我的案例中,如果由于
    连接重置
    或其他原因而失败,则无法设置使用
    yum
    模块的标准。在这种情况下,可用于失败操作的唯一dict变量是result.rc!=0因此,在
    until
    循环中,
    until:result.rc==0
    条件对CentOS的成功/失败案例都有效

  • 在Ubuntu中,如果
    apt
    模块操作成功,我得到result.stdout和result.stdout\u行变量集,但没有result.rc dict变量集。对于失败的操作,未设置result.stdout或result.stdout\u行或result.rc dict变量。所以,在Ubuntu的情况下,我不能使用
    ,直到
    循环使用这些字典变量之一

  • 我能想到的唯一解决办法是,将
    apt get install
    封装在脚本中,并在BASH中使用直到循环等来完成Ansible正在做的事情。至少,这会更容易编码,如果退出代码不是0,那么我可以使用
    直到

    但是,我终于找到了一个解决方案,它在Ubuntu中适用于成功和失败的情况:

    Jinja2过滤器可能会有帮助,即当:result | failed
    因此,如果我必须使用注册变量
    result
    作为失败条件,然后与
    一起使用直到
    ,我将使用它(与失败状态相反),即:

    until: result|succeeded
    

    好的是,上面的until语句对CentOS和Ubuntu以及成功/失败状态都有效。

    不推荐使用测试作为过滤器。使用
    结果成功
    而不是使用
    结果成功
    。此功能将在2.9版中删除。

    谢谢,但我的问题是有效的。谢谢你的回复。我想我找到问题了。为了缩小结果变量的范围,我使用了
    ignore\u errors:yes
    ,在下一个
    debug
    语句中,我得到了结果变量的所有输出。问题是这个。在Ubuntu中,没有result.rc,只有result.stdout,所以我可以使用
    直到
    和result.stdout.find(“…要搜索的文本”)==0或者类似的东西。在RedHat中,至少在我使用的ansible版本中,没有result.stdout,因此我无法使用上述语句,因此我必须使用
    ,直到:result.rc==0
    。这就是答案,但我需要更多的测试来证明这一点。在Ubuntu中,result.stdout只有在操作成功时才会设置,对于失败的操作,result没有.stdout dict设置,所以我需要寻找其他设置。在CentOS中,如果成功,我将获得标准输出和rc设置,但如果由于某种原因,该操作失败,我将只获得状态为1的指令集。后来他们将其更改为“结果成功”,并在最新版本的Ansible中再次更改为“结果即成功”。
    - name: Install Company Proxy (Ubuntu)
      apt:
        name: "{{ company_proxy_pkg }}"
        state: "installed"
      when: ( ansible_distribution == 'Ubuntu' and company_install_proxy == true )
      register: result
      until: result.rc == 0
    
     - debug: msg="result (ubuntu) = {{ result }}"
    
    fatal: [localhost]: FAILED! => {"failed": true, "msg": "The conditional check '(result.stdout.find(\"Installed:\") != -1)' failed. The error was: error while evaluating conditional ((result.stdout.find(\"Installed:\") != -1)): 'dict object' has no attribute 'stdout'"}
    
    fatal: [localhost]: FAILED! => {
        "failed": true, 
        "msg": "The conditional check 'result.rc == 0' failed. The error was: error while evaluating conditional (result.rc == 0): 'dict object' has no attribute 'rc'"
    }
    
    until: result|succeeded