如何使用 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,无论好坏。
为了进一步扩展,如果使用owner
或group
指定了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
- 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 网桥?