Как создать пустой файл с помощью 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" }}'