2015-07-30 2 views
14

Я запускаю пользовательскую команду, потому что я не нашел рабочий модуль, который мне нужен, и я хочу настроить флаг changed, чтобы отразить фактическое поведение:Ansible и `changed_when` на основе значения` stdout`

- 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...'" 

(я знаю, что командная оболочка некрасиво и может быть улучшена за счет более сложного сценария, но я не хочу сейчас)

Выполнение этой задачи на хосте, где нет 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..." 
    } 
} 

Итак, у меня есть это возвращаемое значение stdout "stdout": "Ignoring failure...", а задача отладки показывает, что строки равны, так что Почему задача все еще отображается как «измененная»?

Я использую ansible 1.9.1.

Документация Я ссылаюсь на это один: http://docs.ansible.com/ansible/playbooks_error_handling.html#overriding-the-changed-result

ответ

23

Я думаю, что вы, возможно, неправильно, что changed_when делает.

changed_when отмечает задачу как изменилась на основе оценки условного оператора, который в вашем случае является:

"command_result.stdout ==" Не обращая внимания на провал ..."

Поэтому, когда это условие истинно, задача будет отмечена как измененная.

+2

Мне так глупо сейчас ... Большое спасибо! –

Смежные вопросы