在我的Ansible剧本中,我需要多次在其中创建文件
- name: Copy file
template:
src: code.conf.j2
dest: "{{project_root}}/conf/code.conf"
现在很多时候conf
dir不存在。然后,我必须创建更多任务以首先创建该目录。
如果不存在某些选项,有什么简单的方法可以自动创建目录
在我的Ansible剧本中,我需要多次在其中创建文件
- name: Copy file
template:
src: code.conf.j2
dest: "{{project_root}}/conf/code.conf"
现在很多时候conf
dir不存在。然后,我必须创建更多任务以首先创建该目录。
如果不存在某些选项,有什么简单的方法可以自动创建目录
Answers:
现在,这是唯一的方法
- name: Ensures {{project_root}}/conf dir exists
file: path={{project_root}}/conf state=directory
- name: Copy file
template:
src: code.conf.j2
dest: "{{project_root}}/conf/code.conf"
recurse=yes
到file
呼叫中以获取mkdir -p
类型行为
为确保使用完整路径成功,请使用recurse = yes
- name: ensure custom facts directory exists
file: >
path=/etc/ansible/facts.d
recurse=yes
state=directory
recurse=yes
仅递归地应用权限。但是,文档指出,这是从v1.7开始自动发生的,因此recurse
可能已经过时了。
如果您正在运行Ansible> = 2.0,那么还有dirname过滤器可用于提取路径的目录部分。这样,您可以只使用一个变量来保存整个路径,以确保这两个任务永不同步。
因此,例如,如果您dest_path
在这样的变量中定义了剧本,则可以重复使用相同的变量:
- name: My playbook
vars:
dest_path: /home/ubuntu/some_dir/some_file.txt
tasks:
- name: Make sure destination dir exists
file:
path: "{{ dest_path | dirname }}"
state: directory
recurse: yes
# now this task is always save to run no matter how dest_path get's changed arround
- name: Add file or template to remote instance
template:
src: foo.txt.j2
dest: "{{ dest_path }}"
据我所知,这是唯一的方法可以做的是通过使用state=directory
选项。虽然template
模块支持大多数copy
选项,而模块又支持大多数file
选项,但您不能使用类似的选项state=directory
。而且,这将非常令人困惑(这是否意味着这{{project_root}}/conf/code.conf
是一个目录?或者{{project_root}}/conf/
应该首先创建该目录。
因此,我认为如果不添加先前的file
任务,现在不可能实现。
- file:
path: "{{project_root}}/conf"
state: directory
recurse: yes
根据最新文档,在将状态设置为目录时,您无需使用参数递归来创建父目录,文件模块将负责处理。
- name: create directory with parent directories
file:
path: /data/test/foo
state: directory
这足以创建父目录数据并使用foo 测试
请参阅参数说明-“ 状态 ” http://docs.ansible.com/ansible/latest/modules/file_module.html
您可以使用以下版本创建文件夹,具体取决于您的ansible版本。
最新版本2 <
- name: Create Folder
file:
path: "{{project_root}}/conf"
recurse: yes
state: directory
旧版本:
- name: Create Folder
file:
path="{{project_root}}/conf"
recurse: yes
state=directory
请参阅-http: //docs.ansible.com/ansible/latest/file_module.html
如果该目录不存在,复制模块将创建该目录。在这种情况下,它创建了resolve.conf.d目录
- name: put fallback_dns.conf in place
copy:
src: fallback_dns.conf
dest: /etc/systemd/resolved.conf.d/
mode: '0644'
owner: root
group: root
become: true
tags: testing