我的 ansible 剧本 "when" 条件错误
bug with my ansible playbook "when" condition
我有以下剧本:
- name: packagexx version check
shell: apk version packagexx | awk 'NR>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"
只有当第一个播放的输出包含“=”符号时,第二个播放才应该 运行。
但是现在,当输出如下所示时 运行s:
test-web:~# apk version packagexx
Installed: Available:
packagexx-1.2.0-r3 < 1.2.1-r1
最终,当剧本 运行s:
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'"}
这是有道理的,因为在包已过期的情况下,第二个剧本中的命令不应该 return 任何东西。
我看不到我的错误在哪里。有什么建议么?
编辑 1
所以在更多测试中,这是我发现的。
当我 运行 在一台确实有最新包的服务器上(也就是它在输出中有“=”)时,它 运行 就好了。
当我 运行 将它放在包装已过时的盒子上时(输出中没有“=”),它 return 是错误。
错误/缺失的部分是最后一个调试语句的条件。它也需要检查“=”。至少那是我所做的并且它似乎有效。
所以这个:
- 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"
我需要在调试语句中添加一个条件,以便仅在输出存在时打印,如下所示:
- debug: msg="individual_files_check {{inventory_hostname}} packagexx {{ind_file_apk_version.stdout}}"
when: "'web' in group_names and '=' in packxx_apk_version.stdout"
我有以下剧本:
- name: packagexx version check
shell: apk version packagexx | awk 'NR>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"
只有当第一个播放的输出包含“=”符号时,第二个播放才应该 运行。 但是现在,当输出如下所示时 运行s:
test-web:~# apk version packagexx
Installed: Available:
packagexx-1.2.0-r3 < 1.2.1-r1
最终,当剧本 运行s:
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'"}
这是有道理的,因为在包已过期的情况下,第二个剧本中的命令不应该 return 任何东西。
我看不到我的错误在哪里。有什么建议么?
编辑 1
所以在更多测试中,这是我发现的。 当我 运行 在一台确实有最新包的服务器上(也就是它在输出中有“=”)时,它 运行 就好了。 当我 运行 将它放在包装已过时的盒子上时(输出中没有“=”),它 return 是错误。
错误/缺失的部分是最后一个调试语句的条件。它也需要检查“=”。至少那是我所做的并且它似乎有效。
所以这个:
- 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"
我需要在调试语句中添加一个条件,以便仅在输出存在时打印,如下所示:
- debug: msg="individual_files_check {{inventory_hostname}} packagexx {{ind_file_apk_version.stdout}}"
when: "'web' in group_names and '=' in packxx_apk_version.stdout"