如何使用 Ansible 创建目录

Posted

技术标签:

【中文标题】如何使用 Ansible 创建目录【英文标题】:How to create a directory using Ansible 【发布时间】:2014-05-15 17:03:43 【问题描述】:

如何在基于 Debian 的系统上使用 Ansible playbook 创建目录 www /srv

【问题讨论】:

【参考方案1】:

你想要文件模块。创建目录需要指定选项state=directory

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

您可以在https://docs.ansible.com/ansible/latest/collections/ansible/builtin/file_module.html查看其他选项

【讨论】:

如果state=directory,如果不存在所有直接子目录,则将创建它们,从 1.7 开始,它们将使用提供的权限创建。 @Alex all immediate subdirectories 令人困惑,你能定义一下并举个例子吗? @JamieJackson 有错误,应该是“所有中间子目录”。 @Alex 说“父目录”不是更清楚吗? 这个答案是极简且正确的,但有些人认为明确声明所有者、组和模式是最佳实践。这样做的原因之一——即使看起来没有必要——是因为随着时间的推移,你当前的假设会失败:发行版/发行版发生变化,随之而来的是不同的 umask 默认值,或者票证数据库可以被迁移+删除(失去对什么命令的跟踪-line 参数部署/安装声明),也许你不能再回答问题了。【参考方案2】:

您甚至可以扩展文件模块,甚至可以通过它设置所有者、组和权限。 (参考:Ansible file documentation)

- 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

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

【讨论】:

recursive 参数使得这很像使用mkdir -p(对于那些在谷歌上搜索 ansible mkdir -p 的人)。 我发现它也改变了子文件的权限......几乎就像 mkdir -p /foo/bar && chmod -R 0775 /foo/bar.. 有其他人在 Ansible 2.0.0.2 中观察到这一点 recurse 参数不喜欢mkdir -p。它递归地设置指定的文件属性(仅适用于 state=directory)。如果是state=directory,则所有不存在的直接子目录将被创建,从 1.7 开始,它们将使用提供的权限创建。 @ThePracticalOne - 是的......使用“递归”的行为方式与chmod -R 完全相同。也就是说,如果path 已经作为目录存在,并且其中有文件,则recurse 选项将(有时很遗憾)也将这些相同的权限应用于文件。这是by design,无论好坏。 为了进一步扩展,如果使用ownergroup 指定了recurse 选项,则将应用chmod -R(等效)。如果有很多文件,这将成为一个问题。对我来说,我在一个文件夹中有大约 200 个应用程序版本,每个版本都有大约 35k 文件,加起来有大约 7M 文件。 chmod 需要很长时间,以至于共享 SSH 连接超时。【参考方案3】:

您可以使用以下方法创建:

最新版本 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

【讨论】:

【参考方案4】:

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

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

【讨论】:

【参考方案5】:

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

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

【讨论】:

【参考方案6】:
- file:
    path: /etc/some_directory
    state: directory
    mode: 0755
    owner: someone
    group: somegroup

您实际上也可以通过这种方式设置权限、所有者和组。最后三个参数不是必须的。

【讨论】:

【参考方案7】:

您可以创建一个目录。使用

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

您也可以咨询 http://docs.ansible.com/ansible/file_module.html 有关目录和文件系统的更多详细信息。

【讨论】:

【参考方案8】:

只需要设置条件来执行特定分配的任务

- name: Creates directory
  file: path=/src/www state=directory
  when: ansible_distribution == 'Debian'

【讨论】:

【参考方案9】:

你可以使用语句

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

【讨论】:

【参考方案10】:

如果你想在windows中创建目录:

名称:创建目录结构 win_file: 路径:C:\Temp\文件夹\子文件夹> 状态:目录

【讨论】:

【参考方案11】:
enter code here 
- name: creating directory in ansible
  file:
   path: /src/www
   state: directory
   owner: foo

可以参考ansible documentation

【讨论】:

【参考方案12】:

- name: Create a directory 
  ansible.builtin.file:
    path: /etc/some_directory
    state: directory
    mode: '0755'

【讨论】:

【参考方案13】:

我们有模块可用于在 ansible 中创建目录、文件

例子

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

【讨论】:

【参考方案14】:

在这种情况下,您可以使用“文件”模块,您可以为新创建的目录传递很多参数,例如所有者、组、位置、模式等.....

文件模块的详细解释请参考本文档...

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

记住这个模块不仅仅用于创建目录!!!

【讨论】:

【参考方案15】:

可以直接运行命令,直接使用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

【讨论】:

【参考方案16】:
---
- 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【参考方案17】:

创建目录

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

【讨论】:

【参考方案18】:

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

这是一个选项“状态”,它解释:

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

请注意,如果路径不存在,file 不会失败,因为状态没有改变。

如果touch(1.4 新增),如果路径没有,则会创建一个空文件 存在,而现有文件或目录将收到更新的文件 访问和修改时间(类似于 touch 的工作方式 命令行)。

【讨论】:

【参考方案19】:

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

name:如果您的目录不存在,请创建它。 文件: 路径:/etc/your_directory

您想为该目录授予 sudo 权限

name:如果您的目录不存在,请创建它。 文件: 路径:/etc/your_directory 模式:'777'

【讨论】:

【参考方案20】:

大家下午好。

我与你分享以下内容。

   - 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

您可以使用它在创建目录之前验证目录是否存在

【讨论】:

欢迎来到 SO。问题是关于创建/srv/www 路径,您的示例是关于/tmp/Sabana,您应该尽可能尝试将您的示例与问题相匹配,并避免重复22 个答案中的任何一个。【参考方案21】:

我看到很多 Playbook 示例,我想提一下 Adhoc 命令示例。

$ansible -i inventory -m file -a "path=/tmp/direcory state=directory (代替目录我们可以提到touch来创建文件)

【讨论】:

【参考方案22】:

在这种情况下,您需要使用文件模块。下面的剧本供您参考。

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

【讨论】:

【参考方案23】:

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

- 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

【讨论】:

【参考方案24】:

这里有更简单的方法。

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

【讨论】:

这不是幂等的。 @qubsup: -p 是幂等的

以上是关于如何使用 Ansible 创建目录的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Ansible 的主网络接口创建 openvswitch 网桥?

如何使用 Ansible 创建 AWS ec2 密钥 | Linux 中国

如何使用 Ansible 配置 Vim并安装插件

如何在Ansible中比较多个文件

Linux之ansible的角色基本使用

如何在远程系统上使用 Ansible 任务移动/重命名文件