Как создать пустой файл с помощью Ansible?

Каков самый простой способ создать пустой файл с помощью Ansible? Я знаю, что могу сохранить пустой файл в каталоге files, а затем скопировать его на удаленный хост, но я нахожу его несколько неудовлетворительным.

Другой способ - коснуться файла на удаленном хосте:

- name: create fake 'nologin' shell
  file: path=/etc/nologin state=touch owner=root group=sys mode=0555

Но тогда файл попадает каждый раз, показывая в желтой строке в журнале, что также неудовлетворительно...

Есть ли лучшее решение этой простой проблемы?

Ответ 1

Документация файлового модуля гласит

Если state=file, файл НЕ будет создан, если он не существует, см. модуль копии или шаблона, если вы хотите это поведение.

Таким образом, мы используем модуль копирования, используя force=no, чтобы создать новый пустой файл только тогда, когда файл еще не существует (если файл существует, его содержимое сохраняется).

- name: ensure file exists
  copy:
    content: ""
    dest: /etc/nologin
    force: no
    group: sys
    owner: root
    mode: 0555

Это декларативное и элегантное решение.

Ответ 2

Что-то вроде этого (с использованием модуля 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.

Ответ 3

Другая опция, используя командный модуль:

- name: Create file
  command: touch /path/to/file
  args:
    creates: /path/to/file

Аргумент 'создает' гарантирует, что это действие не будет выполнено, если файл существует.

Ответ 4

Основываясь на принятом ответе, если вы хотите, чтобы файл проверялся на разрешения для каждого запуска, и они соответствующим образом изменялись, если файл существует, или просто создайте файл, если он не существует, вы можете использовать следующее:

- 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"}}

Ответ 5

file: path=/etc/nologin state=touch

Полный эквивалент touch (новый в версии 1.4+) - используйте stat, если вы не хотите менять временную метку файла.

Ответ 6

Оказывается, у меня недостаточно репутации, чтобы поместить это в качестве комментария, что было бы более подходящим местом для этого:

Число рейнольдса Ответ 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" }}'

Ответ 7

Чтобы создать файл на удаленном компьютере с помощью специальной команды

ansible client -m file -a"dest=/tmp/file state=touch"

Пожалуйста, поправьте меня, если я ошибаюсь

Ответ 8

Изменено, если файл не существует. Создать пустой файл.

- name: create fake 'nologin' shell
  file:
    path: /etc/nologin
    state: touch
  register: p
  changed_when: p.diff.before.state == "absent"

Ответ 9

Файловый модуль предоставляет способ прикоснуться к файлу без изменения его времени.

- name: Touch again the same file, but dont change times this makes the task idempotent
  file:
    path: /etc/foo.conf
    state: touch
    mode: u+rw,g-wx,o-rwx
    modification_time: preserve
    access_time: preserve

Ссылка: https://docs.ansible.com/ansible/latest/modules/file_module.html

Ответ 10

Сочетание двух ответов, с изюминкой. Код будет обнаружен как измененный при создании файла или обновлении разрешения.

- name: Touch again the same file, but dont change times this makes the task idempotent
  file:
    path: /etc/foo.conf
    state: touch
    mode: 0644
    modification_time: preserve
    access_time: preserve
  changed_when: >
    p.diff.before.state == "absent" or
    p.diff.before.mode|default("0644") != "0644"

и версия, которая также исправляет владельца и группу и обнаруживает их как измененные, когда они действительно исправляют это:

- name: Touch again the same file, but dont change times this makes the task idempotent
  file:
    path: /etc/foo.conf
    state: touch
    state: touch
    mode: 0644
    owner: root
    group: root
    modification_time: preserve
    access_time: preserve
  register: p
  changed_when: >
    p.diff.before.state == "absent" or
    p.diff.before.mode|default("0644") != "0644" or
    p.diff.before.owner|default(0) != 0 or
    p.diff.before.group|default(0) != 0