我的ansible playbook“when”condition

时间:2016-04-12 12:48:34

标签: linux ansible ansible-playbook ansible-2.x

我有以下剧本:

  - name: packagexx version check
    shell: apk version packagexx | awk 'NR>1{$1=$1;print}'
    when: "'web' in group_names"
    register: packxx_apk_version
    changed_when: False  
  - debug: msg="package_version_check {{inventory_hostname}} {{packxx_apk_version.stdout}}"
    when: "'web' in group_names"
  - name: packagexx individual files check
    shell: apk audit /etc/packagexx/ | grep "^U" | grep -v "kamcc"
    when : "'web' in group_names and '=' in packxx_apk_version.stdout"
    register: ind_file_apk_version
    failed_when: False  
    changed_when: False
  - debug: msg="individual_files_check {{inventory_hostname}} packagexx {{ind_file_apk_version.stdout}}"
    when: "'web' in group_names"

第二次播放只应在第一次播放的输出包含“=”符号时运行。 现在BU,它在输出如下所示运行:

  test-web:~# apk version packagexx
  Installed:                                Available:
  packagexx-1.2.0-r3                        < 1.2.1-r1 

最终,当剧本运行时,我最终得到了这个错误:

TASK [debug] *******************************************************************
fatal: [test-web]: FAILED! => {"failed": true, "msg": "'dict object' has no attribute 'stdout'"}
fatal: [test2-web]: FAILED! => {"failed": true, "msg": "'dict object' has no attribute 'stdout'"}

这是有道理的,因为第二次播放中的命令不应该在包过期的情况下返回任何内容。

我看不出我的错误在哪里。有什么建议?

编辑1

所以在更多的测试中,这就是我发现的。 当我在具有最新软件包的服务器上运行此playbook时(也就是输出中有“=”),它运行得很好。 当我在包过期的盒子上运行它(输出中没有“=”)时,它会返回错误。

错误/缺失的部分是最后一个调试语句的条件。它也需要检查“=”。至少那是我所做的,而且似乎有效。

所以这个:

  - debug: msg="individual_files_check {{inventory_hostname}} packagexx {{ind_file_apk_version.stdout}}"
    when: "'web' in group_names"

更改为:

  - debug: msg="individual_files_check {{inventory_hostname}} packagexx {{ind_file_apk_version.stdout}}"
    when: "'web' in group_names and '=' in packxx_apk_version.stdout"

1 个答案:

答案 0 :(得分:0)

我需要在debug语句中添加一个条件,只在输出存在时打印,如下所示:

- debug: msg="individual_files_check {{inventory_hostname}} packagexx {{ind_file_apk_version.stdout}}"
    when: "'web' in group_names and '=' in packxx_apk_version.stdout"