Ansible和`changed_when`基于`stdout`值

Mic*_*aël 25 ansible

我正在运行一个自定义命令,因为我没有找到一个工作模块做我需要的东西,我想调整changed标志以反映实际行为:

- name: Remove unused images
  shell: '[ -n "$(docker images -q -f dangling=true)" ] && docker rmi $(docker images -q -f dangling=true) || echo Ignoring failure...'
  register: command_result
  changed_when: "command_result.stdout == 'Ignoring failure...'"

- debug: var="1 {{ command_result.stdout }}"
  when: "command_result.stdout != 'Ignoring failure...'"
- debug: var="2 {{ command_result.stdout }}"
  when: "command_result.stdout == 'Ignoring failure...'"
Run Code Online (Sandbox Code Playgroud)

(我知道shell命令是丑陋的,可以通过更复杂的脚本来改进,但我现在不想这样做)

在没有可以删除Docker镜像的主机上运行此任务会给出以下输出:

TASK: [utils.dockercleaner | Remove unused images] **************************** 
changed: [cloud-host] => {"changed": true, "cmd": "[ -n \"$(docker images -q -f dangling=true)\" ] && docker rmi $(docker images -q -f dangling=true) || echo Ignoring failure...", "delta": "0:00:00.064451", "end": "2015-07-30 18:37:25.620135", "rc": 0, "start": "2015-07-30 18:37:25.555684", "stderr": "", "stdout": "Ignoring failure...", "stdout_lines": ["Ignoring failure..."], "warnings": []}

TASK: [utils.dockercleaner | debug var="DIFFERENT {{ command_result.stdout }}"] *** 
skipping: [cloud-host]

TASK: [utils.dockercleaner | debug var="EQUAL {{ command_result.stdout }}"] *** 
ok: [cloud-host] => {
    "var": {
        "EQUAL Ignoring failure...": "EQUAL Ignoring failure..."
    }
}
Run Code Online (Sandbox Code Playgroud)

所以,我有这个stdout返回值"stdout": "Ignoring failure...",并且调试任务显示字符串是相等的,那么为什么任务仍然显示为"已更改"

我在用ansible 1.9.1.

我所指的文档是这样的:http://docs.ansible.com/ansible/playbooks_error_handling.html#overriding-the-changed-result

bka*_*kan 32

我想你可能误解了是什么changed_when.

changed_when 根据条件语句的评估将任务标记为已更改,在您的情况下:

"command_result.stdout =='忽略失败......'"

因此,只要此条件为真,任务就会标记为已更改.

  • 我现在感觉很蠢......非常感谢! (2认同)