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