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

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

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

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

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

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

81 голос | спросил dokaspar 5 FebruaryEurope/MoscowbThu, 05 Feb 2015 18:25:10 +0300000000pmThu, 05 Feb 2015 18:25:10 +030015 2015, 18:25:10

5 ответов


0

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

  

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

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

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

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

ответил René Pijl 21 Jpm1000000pmThu, 21 Jan 2016 19:58:28 +030016 2016, 19:58:28
0

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

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

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

ответил Leynos 29 Maypm15 2015, 12:00:07
0

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

- 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"}}
ответил AllBlackt 14 Jpm1000000pmThu, 14 Jan 2016 16:34:57 +030016 2016, 16:34:57
0

file: path=/etc/nologin state=touch

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

ответил jalmasi 3 J0000006Europe/Moscow 2016, 14:39:28
0

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

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" }}'
ответил Andrew Richards 24 PMpTue, 24 Apr 2018 18:07:31 +030007Tuesday 2018, 18:07:31

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132