Какое поведение у Ansible при попытке удалить несуществующий файл с помощью модуля `file`?

«Какое поведение у Ansible при попытке удалить несуществующий файл с помощью модуля `file`?» — вопрос из категории Ansible, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Ansible завершит задачу успешно (ok) и без изменений (changed: false). Это ожидаемое и корректное поведение, соответствующее принципу идемпотентности — многократное выполнение задачи приводит к одному и тому же результату.

Пример задачи:

- name: Ensure temporary file is absent
  ansible.builtin.file:
    path: /tmp/nonexistent_file.txt
    state: absent

Вывод выполнения (пример):

ok: [web-server.example.com] => {
    "changed": false,
    "path": "/tmp/nonexistent_file.txt",
    "state": "absent"
}

Почему это правильно и полезно:

  • Идемпотентность: Не важно, запускаете ли вы плейбук в первый или сотый раз — конечное состояние (файл отсутствует) будет достигнуто без ошибок.
  • Устойчивость плейбуков: Позволяет писать задачи, которые можно безопасно повторять, не беспокоясь о проверках существования файла вручную.
  • Контраст с другими модулями: Это поведение специфично для модуля file с state: absent. Модули вроде command или shell, выполняющие rm /tmp/nonexistent_file.txt, вернут ошибку, если файла нет, если не добавить флаги вроде rm -f.