Как создать пустой файл с Ansible?
Как проще всего создать пустой файл с помощью Ansible? Я знаю, что могу сохранить пустой файл в files каталог, а затем скопируйте его на удаленный хост, но я нахожу это несколько неудовлетворительным.
другой способ-коснуться файла на удаленном хосте:
- name: create fake 'nologin' shell
file: path=/etc/nologin state=touch owner=root group=sys mode=0555
но тогда файл трогается каждый раз, показывая в виде желтой линии в журнале, что также неудовлетворительно...
есть ли лучшее решение для этой простой проблема?
6 ответов:
документация файлового модуля говорит
Если
state=file, файл не будет создан, если он не существует, см. модуль копирования или шаблона, если вы хотите такое поведение.поэтому мы используем модуль копирования, используя
force=noсоздать новый пустой файл только тогда, когда файл еще не существует (если файл существует, его содержимое сохраняется).- name: ensure file exists copy: content: "" dest: /etc/nologin force: no group: sys owner: root mode: 0555это декларативное и элегантное решение.
что-то вроде этого (используя
statмодуль сначала собирает данные о нем, а затем фильтрует с помощью условного) должен работать:- stat: path=/etc/nologin register: p - name: create fake 'nologin' shell file: path=/etc/nologin state=touch owner=root group=sys mode=0555 when: p.stat.exists is defined and not p.stat.existsвы также можете использовать
changed_whenфункциональность.
другой вариант, используя командный модуль:
- name: Create file command: touch /path/to/file args: creates: /path/to/fileаргумент 'creates' гарантирует, что это действие не выполняется, если файл существует.
основываясь на принятом ответе, если вы хотите, чтобы файл проверялся на наличие разрешений при каждом запуске, и они соответственно изменялись, если файл существует, или просто создавали файл, если он не существует, вы можете использовать следующее:
- stat: path=/etc/nologin register: p - name: create fake 'nologin' shell file: path=/etc/nologin owner=root group=sys mode=0555 state={{ "file" if p.stat.exists else "touch"}}
file: path=/etc/nologin state=touchполный эквивалент touch (новый в 1.4+) - используйте stat, если вы не хотите менять временную метку файла.
оказывается, у меня недостаточно репутации, чтобы поставить это как комментарий, который был бы более подходящим местом для этого:
Re. Ответ AllBlackt, если вы предпочитаете многострочный формат Ansible, вам нужно настроить цитирование для
state(Я потратил несколько минут на это, так что, надеюсь, это ускорит кого-то еще),- stat: path: "/etc/nologin" register: p - name: create fake 'nologin' shell file: path: "/etc/nologin" owner: root group: sys mode: 0555 state: '{{ "file" if p.stat.exists else "touch" }}'
Comments