Как создать каталог с помощью Ansible

Как создать каталог www в /srv в системе на основе Debian, используя Ansible playbook?


person Gaurav Agarwal    schedule 03.04.2014    source источник


Ответы (23)


Вам нужен файловый модуль. Для создания каталога нужно указать опцию state=directory:

- name: Creates directory
  file:
    path: /src/www
    state: directory

Вы можете увидеть другие варианты на https://docs.ansible.com/ansible/latest/collections/ansible/builtin/file_module.html

person leucos    schedule 03.04.2014
comment
Если state=directory, будут созданы все непосредственные подкаталоги, если они не существуют, поскольку начиная с версии 1.7 они будут созданы с предоставленными разрешениями. - person Alex; 06.10.2016
comment
@Alex all immediate subdirectories сбивает с толку, не могли бы вы определить это и привести пример? - person Jamie Jackson; 13.09.2018
comment
@JamieJackson Произошла ошибка, должны быть все промежуточные подкаталоги. - person Alex; 14.09.2018
comment
@Alex Разве не было бы более ясным сказать родительские каталоги? - person Carolus; 06.09.2020
comment
Это минималистичный и правильный ответ, но некоторые считают, что лучше явно указать владельца, группу и режим. Одна из причин сделать это - даже если это кажется ненужным - заключается в том, что со временем ваши текущие предположения терпят неудачу: дистрибутив / выпуск меняется, а вместе с ним и другие значения umask по умолчанию, или базы данных тикетов могут быть перенесены + удалены (потеря информации о том, какая команда -строка аргументов объявлены развертывания / установки), и, возможно, вы больше не можете отвечать на вопросы. - person Scott Prive; 16.09.2020

Вы даже можете расширить файловый модуль и даже установить через него владельца, группу и права доступа. (Ссылка: документация по файлу Ansible)

- name: Creates directory
  file:
    path: /src/www
    state: directory
    owner: www-data
    group: www-data
    mode: 0775

Даже вы можете создавать каталоги рекурсивно:

- name: Creates directory
  file:
    path: /src/www
    state: directory
    owner: www-data
    group: www-data
    mode: 0775
    recurse: yes

Таким образом, будут созданы оба каталога, если их не было.

person Arbab Nazar    schedule 26.12.2014
comment
Аргумент recursive делает это очень похожим на использование mkdir -p (для тех, кто ищет в Google ansible mkdir -p). - person Micah Elliott; 21.01.2016
comment
Я обнаружил, что он также меняет права доступа к дочерним файлам ... почти как mkdir -p / foo / bar && chmod -R 0775 / foo / bar .. кто-нибудь еще наблюдал это с Ansible 2.0.0.2 - person ThePracticalOne; 11.05.2016
comment
Параметр recurse не любит mkdir -p. Он рекурсивно устанавливает указанные атрибуты файла (применяется только к state = directory). Если state=directory, будут созданы все непосредственные подкаталоги, если они не существуют, поскольку начиная с версии 1.7 они будут созданы с предоставленными разрешениями. - person Alex; 06.10.2016
comment
здесь используется старый синтаксис с = символами, было бы здорово обновить его синтаксисом : с каждым атрибутом в новой строке - person ympostor; 08.06.2017
comment
@ThePracticalOne - Да ... использование рекурсии ведет себя точно так же, как chmod -R. То есть, если path уже существует как каталог и внутри него есть файлы, опция recurse (иногда, к сожалению) также применяет те же разрешения к файлам. Это намеренно, хорошо это или плохо. - person Dale Anderson; 12.10.2017
comment
Для дальнейшего расширения, если опция recurse указана с owner или group, будет применяться chmod -R (эквивалент). Это станет проблемой, если файлов много. Для меня у меня было ~ 200 версий приложений в папке, каждая из которых содержала ~ 35 тыс. Файлов, что в сумме составляло ~ 7 млн ​​файлов. Команда chmod займет так много времени, что истекло время ожидания общего SSH-соединения. - person Eric Wong; 26.08.2020
comment
То, что говорит @ThePracticalOne, по-прежнему остается проблемой для Ansible 2.9: режим для всех файлов внутри каталога также будет установлен в режим, который вы укажете. Это делает recurse: yes практически бесполезным для меня, поскольку я хочу указать режим каталога с помощью + x, но я не хочу, чтобы все файлы внутри каталога были сделаны исполняемыми. - person EM0; 09.11.2020

вы можете создать, используя:

Последняя версия 2 ‹

- name: Create Folder
  file: 
    path: /srv/www/
    owner: user 
    group: user 
    mode: 0755 
    state: directory

Старая версия

- name: Create Folder
  file: 
   path=/srv/www/
   owner=user 
   group=user 
   mode=0755 
   state=directory

Обратитесь - http://docs.ansible.com/ansible/file_module.html

person Chathuranga Abeyrathna    schedule 17.06.2016

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

- name: Creates directory
  file:
    path: "{{ item }}"
    state: directory
  with_items:
  - /srv/www
  - /dir/foo
  - /dir/bar
person Andrey Bistrinin    schedule 03.04.2019

Каталог может быть создан только с использованием файлового модуля, поскольку каталог - это не что иное, как файл.

# create a directory if it doesn't exist
- file:
    path: /etc/some_directory
    state: directory
    mode: 0755
    owner: foo
    group: foo
person user3004224    schedule 20.04.2018

- file:
    path: /etc/some_directory
    state: directory
    mode: 0755
    owner: someone
    group: somegroup

Таким образом вы также можете установить разрешения, владельца и группу. Последние три параметра не являются обязательными.

person qubsup    schedule 10.05.2017

Вы можете создать каталог. с использованием

# create a directory if it doesn't exist
- file: path=/src/www state=directory mode=0755

Вы также можете обратиться к http://docs.ansible.com/ansible/file_module.html. для получения дополнительных сведений о каталоге и файловой системе.

person Ali Warrich    schedule 21.03.2016

Просто нужно поставить условие для выполнения задачи для конкретного распределения

- name: Creates directory
  file: path=/src/www state=directory
  when: ansible_distribution == 'Debian'
person Bhavesh Vasoya    schedule 28.04.2017

Вы можете использовать инструкцию

- name: webfolder - Creates web folder
  file: path=/srv/www state=directory owner=www-data group=www-data mode=0775`
person Mazi    schedule 19.08.2016

Если вы хотите создать каталог в Windows:

  • имя: Создать структуру каталогов
    win_file:
    путь: C: \ Temp \ папка \ подпапка>
    состояние: каталог

person Alexandru Muica    schedule 22.03.2019

У нас есть модули для создания каталога, файла в доступе

Пример

- name: Creates directory
  file:
    path: /src/www
    state: directory
person Mohd Umar Mubeen    schedule 23.01.2019

Вы можете напрямую запустить команду и создать напрямую с помощью ansible

ansible -v targethostname -m shell -a "mkdir /srv/www" -u targetuser

OR

ansible -v targethostname -m file -a "path=/srv/www state=directory" -u targetuser
person RegexCracker    schedule 19.12.2017

---
- hosts: all
  connection: local
  tasks:
    - name: Creates directory
      file: path=/src/www state=directory

Вышеупомянутая playbook создаст каталог www в пути / src.

Перед запуском выше playbook. Пожалуйста, убедитесь, что ваше соединение с доступным хостом должно быть установлено,

"localhost ansible_connection = local"

должен присутствовать в / etc / ansible / hosts

для получения дополнительной информации, пожалуйста, дайте мне знать.

person Saurabh    schedule 14.11.2017
comment
файл: путь = / src / www состояние = каталог - person Saurabh; 14.11.2017

создать каталог

ansible host_name -m file -a "dest=/home/ansible/vndir state=directory"
person sachin_ur    schedule 07.01.2019

Используйте файловый модуль, чтобы создать каталог и получить подробную информацию о файловом модуле с помощью команды "ansible-doc file"

Вот вариант «состояние», который объясняет:

Если directory, будут созданы все непосредственные подкаталоги, если они не существуют, начиная с версии 1.7 они будут созданы с предоставленными разрешениями.
Если file, файл НЕ будет создан, если он не существует, см. [Копия] или [шаблон], если вам нужно такое поведение.
Если link, будет создана или изменена символическая ссылка. Используйте hard для жестких ссылок.
Если absent, каталоги будут рекурсивно удаляться, а файлы или символические ссылки не будут связаны.

Обратите внимание, что file не завершится ошибкой, если путь не существует, поскольку состояние не изменилось.

Если touch (новое в 1.4), пустой файл будет создан, если путь не существует, в то время как существующий файл или каталог получит обновленное время доступа и модификации (аналогично тому, как touch работает из командной строки).

person Priyanka Bhardwaj    schedule 11.04.2019

вы можете использовать модуль «файл» в этом случае, есть так много аргументов, которые вы можете передать для вновь созданного каталога, таких как владелец, группа, местоположение, режим и так далее ...

пожалуйста, обратитесь к этому документу для подробного объяснения файлового модуля ...

https://docs.ansible.com/ansible/latest/modules/file_module.html#file-module

помните, что этот модуль предназначен не только для создания каталога !!!

person user11345576    schedule 11.04.2019

Самый простой способ создать каталог в Ansible.

  • name: Создайте your_directory, если он не существует. файл: путь: / etc / your_directory

ИЛИ

Вы хотите предоставить этому каталогу привилегии sudo.

  • name: Создайте your_directory, если он не существует. файл: путь: / etc / your_directory mode: '777'
person Muhammad Ahmad    schedule 19.07.2019

Привет, добрый день, команда.

Я делюсь с вами следующим.

   - name: Validar Directorio
     stat:
       path: /tmp/Sabana
     register: sabana_directorio
   
   - debug:
       msg: "Existe"
     when: sabana_directorio.stat.isdir == sabana_directorio.stat.isdir

   - name: Crear el directorio si no existe.
     file:
       path: /tmp/Sabana
       state: directory
     when: sabana_directorio.stat.exists == false

С помощью которого вы можете проверить, существует ли каталог перед его созданием

person Javier Gatica    schedule 23.09.2020
comment
Добро пожаловать в SO. Вопрос касается создания пути /srv/www, а ваш пример касается /tmp/Sabana. Вы должны попытаться сопоставить свои примеры с вопросами, когда это возможно, и избегать повторения любого из 22 ответов. - person seshadri_c; 24.09.2020

Я вижу много примеров Playbook, и я хотел бы упомянуть пример команд Adhoc.

$ ansible -i inventory -m file -a "path = / tmp / direcory state = каталог (вместо каталога мы можем указать касание для создания файлов)

person Kandasamy Murugan    schedule 21.10.2019

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

    ---
     - hosts: <Your target host group>
       name: play1
       tasks: 
        - name: Create Directory
          files:
           path=/srv/www/
           owner=<Intended User>
           mode=<Intended permission, e.g.: 0750>
           state=directory 
person S.MANDAL    schedule 10.11.2019

Чтобы проверить, существует ли каталог, а затем запустить какую-либо задачу (например, создать каталог), используйте следующие

- name: Check if output directory exists
    stat:
    path: /path/to/output
    register: output_folder

- name: Create output directory if not exists
    file:
    path: /path/to/output
    state: directory
    owner: user
    group: user
    mode: 0775
    when: output_folder.stat.exists == false
person Levon    schedule 04.03.2020

enter code here 
- name: creating directory in ansible
  file:
   path: /src/www
   state: directory
   owner: foo

вы можете обратиться к доступной документации

person aditya    schedule 28.02.2021

вот способ попроще.

- name: create dir command: mkdir -p dir dir/a dir/b

person Ender Wan    schedule 12.10.2016
comment
это не идемпотент. - person qubsup; 20.07.2017
comment
@qubsup: с -p это идемпотент - person Sławomir Lenart; 08.12.2020