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