如何使用Ansible创建目录


Answers:


635

您需要文件模块。要创建目录,需要指定以下选项state=directory

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

您可以在http://docs.ansible.com/file_module.html上看到其他选项


36
如果为state=directory,则将创建所有直接子目录(如果不存在),因为从1.7开始,它们将使用提供的权限进行创建。
亚历克斯(Alex)2013年

1
@Alex all immediate subdirectories令人困惑,您能定义一个例子吗?
杰米·杰克逊

8
@JamieJackson有一个错误,应该是“所有中间子目录”。
亚历克斯(Alex)

203

您甚至可以扩展文件模块,甚至可以通过它设置所有者,组和权限。(参考: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

这样,它将创建两个目录(如果它们不存在)。


38
recursive参数使它非常像使用mkdir -p(对于使用谷歌搜索的Ansible mkdir -p)。
米卡·艾略特

2
我发现它也更改了子文件权限...几乎像mkdir -p / foo / bar && chmod -R 0775 / foo / bar ..还有其他人用Ansible 2.0.0.2观察到了这一点
ThePracticalOne '16

5
recurse参数不喜欢mkdir -p。它递归设置指定的文件属性(仅适用于state = directory)。如果为state=directory,则将创建所有直接子目录(如果不存在),因为从1.7开始,它们将使用提供的权限进行创建。
亚历克斯

1
=它将使用带chars 的旧语法,将其与:
属性中的

@ThePracticalOne-是的...使用“递归”的行为完全相同chmod -R。也就是说,如果path该目录已经存在,并且其中有文件,则该recurse选项(有时很不幸)还将对这些文件应用相同的权限。这是设计使然,无论好坏。
戴尔·安德森


14

目录只能使用文件模块创建,因为目录不过是文件。

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

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

这样,您实际上就可以设置权限,所有者和组。最后三个参数不是必须的。



7

除此处所有答案外,在很多情况下您需要创建多个目录,因此最好使用循环而不是为每个目录创建单独的任务。

- name: Creates directory
  file:
    path: "{{ item }}"
    state: directory
  with_items:
  - /srv/www
  - /dir/foo
  - /dir/bar


3

您可以使用以下语句

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



1

您可以直接运行命令并使用ansible直接创建

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

要么

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

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

上面的剧本将在/ src路径中创建www目录。

在运行以上剧本之前。请确保您的ansible主机连接已设置,

“本地主机ansible_connection = local”

应该存在于/ etc / ansible / hosts中

有关更多信息,请让我知道。


文件:path = / src / www state = directory
Saurabh

1

创建目录

ansible host_name -m file -a "dest=/home/ansible/vndir state=directory"

1

使用文件模块创建目录,并使用命令“ ansible-doc file”获取有关文件模块的详细信息

这是一个说明状态的选项:

如果为directory,则将创建所有直接子目录(如果不存在),因为从1.7开始,它们将使用提供的权限进行创建。
如果为file,则如果文件不存在则不会创建该文件,如果需要该行为,请参见[copy]或[template]模块。
如果为link,则将创建或更改符号链接。使用hard的硬链接。
如果为absent,则将递归删除目录,并且将取消链接文件或符号链接。

请注意,file如果路径不存在(状态不变),则不会失败。

如果touch(1.4中的新增功能),则在路径不存在的情况下将创建一个空文件,而现有文件或目录将获得更新的文件访问和修改时间(类似于touch命令行中的工作方式)。



1

在Ansible中建立目录的最简单方法。

  • 名称:创建your_directory(如果不存在)。文件:路径:/ etc / your_directory

要么

您想为该目录赋予sudo特权

  • 名称:创建your_directory(如果不存在)。文件:路径:/ etc /您的目录模式:'777'

0

我看到了许多Playbooks示例,并且我想提及Adhoc命令示例。

$ ansible -i库存-m文件-a“路径= / tmp /目录状态=目录(代替目录,我们可以提及触摸创建文件)


0

在这种情况下,您需要使用文件模块。您可以在以下剧本中作为参考。

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

0

要检查目录是否存在,然后运行某些任务(例如,创建目录),请使用以下命令

- 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


-5

这是更简单的方法。

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


2
这不是幂等的。
qubsup
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.